如何将包含while循环的重复Python代码重构为函数?
我来帮你搞定这个重构问题!看起来你是在处理类似Spotify这类音乐API的播放列表分页数据,重复代码确实头疼,尤其是还要处理while循环的分页逻辑对吧?
重构后的函数实现
咱们可以把重复的文件操作、API请求和分页逻辑全部封装成一个可复用的函数,这样以后调用起来超方便:
import requests def fetch_and_save_playlist_tracks(user, playlist_id, headers, config, start_file_count=0): """ 获取播放列表的所有曲目,分页保存到递增命名的JSON文件中 参数说明: user: 目标用户的ID playlist_id: 要获取的播放列表ID headers: 请求头(要包含认证信息,比如Bearer Token) config: 包含global_url的配置对象 start_file_count: 起始文件编号,默认从0开始 """ current_file_count = start_file_count # 初始化第一页的请求URL next_request_url = f"{config.global_url}/users/{user}/playlists/{playlist_id}/tracks" # 分页循环:只要还有下一页就继续请求 while next_request_url: # 构造当前页的文件名,用with语句自动管理文件关闭,避免资源泄漏 current_file_name = f"{current_file_count}_tracks.json" with open(current_file_name, "w+") as track_file: # 发送GET请求获取曲目数据 track_response = requests.request("GET", next_request_url, headers=headers) # 把响应内容写入JSON文件 track_file.write(track_response.text) print(f"成功保存页面数据到: {current_file_name}") # 解析响应,获取下一页的URL(大部分音乐API都会返回next字段标记下一页) response_json = track_response.json() next_request_url = response_json.get("next") # 文件编号递增,准备保存下一页 current_file_count += 1
调用示例
用的时候只需要传入必要的参数就行,不用再写重复的代码:
# 直接调用函数,默认从0开始命名文件 fetch_and_save_playlist_tracks(user, playlist_id, headers, config) # 如果想从编号10开始保存,就传入start_file_count参数 # fetch_and_save_playlist_tracks(user, playlist_id, headers, config, start_file_count=10)
额外优化建议
- 如果你的API是用
offset和limit来分页(而不是返回next URL),可以调整循环逻辑:def fetch_and_save_playlist_tracks(user, playlist_id, headers, config, start_file_count=0, limit=50): current_file_count = start_file_count offset = 0 while True: request_url = f"{config.global_url}/users/{user}/playlists/{playlist_id}/tracks?limit={limit}&offset={offset}" track_response = requests.request("GET", request_url, headers=headers) response_json = track_response.json() items = response_json.get("items", []) with open(f"{current_file_count}_tracks.json", "w+") as track_file: track_file.write(track_response.text) # 如果返回的条目数小于limit,说明已经是最后一页了 if len(items) < limit: break offset += limit current_file_count += 1 - 可以加上异常处理,比如请求失败时捕获
requests.exceptions.RequestException,避免程序直接崩溃。
内容的提问来源于stack exchange,提问作者Daniel O.
相关产品推荐
相关产品推荐

