如何正确编写递归函数获取Wrike项目的嵌套字典结构?
修复Wrike文件夹层级递归遍历,生成完整嵌套字典
当前代码尝试递归遍历Wrike文件夹结构,将其转换为以名称为键的嵌套字典,但存在递归逻辑错误,导致深层子文件夹(如PRJ03的子文件夹)无法被纳入结果中,仅能获取到一级子文件夹PRJ01、PRJ02,PRJ03的子结构丢失。
问题根源分析
- 递归结果未赋值:原代码中调用
traverse(child_id)时,没有将返回的子层级字典赋值给对应的节点,导致深层结构无法被添加到最终的层级中。 - 冗余的API调用:在循环子ID时重复调用
get_folder(folder_childId),而traverse函数本身已经会调用get_folder获取该ID的文件夹数据,属于多余操作。
修正后的代码
import requests import json token = "" startpoint = 'https://www.wrike.com/api/v4' root_id = '' def make_request(endpoint): headers = {'Authorization': f'Bearer {token}'} url = f"{startpoint}/{endpoint}" response = requests.get(url, headers=headers) if response.status_code == 200: return response.json() def get_folder(idx): data = make_request(f"folders/{idx}")['data'][0] filtered_dict = { 'title': data['title'], 'id': data['id'], 'childIds': data['childIds'] } return filtered_dict def traverse(folder_id): folder_data = get_folder(folder_id) folder_title = folder_data['title'] # 初始化当前文件夹的结构,值为子文件夹的嵌套字典 hierarchy = {folder_title: {}} for child_id in folder_data['childIds']: # 递归获取子文件夹的完整层级,并添加到当前文件夹的子结构中 child_hierarchy = traverse(child_id) # 提取子文件夹的标题和对应的结构,添加到当前节点 hierarchy[folder_title].update(child_hierarchy) return hierarchy hierarchy = traverse(root_id) print(json.dumps(hierarchy, indent=2))
关键修改说明
- 直接复用递归返回值:调用
traverse(child_id)得到子文件夹的完整层级字典,通过update方法将其添加到当前文件夹的子结构中,确保深层节点被正确嵌套。 - 简化逻辑:去掉循环中冗余的
get_folder调用,直接使用traverse处理子ID,减少不必要的API请求,同时让逻辑更清晰。 - 结构初始化优化:直接以当前文件夹标题为键,初始化空字典作为子结构容器,避免多余的判断逻辑。
预期输出
修正后运行代码,将得到完整的层级结构:
{ "MAIN_FOLDER": { "PRJ01": {}, "PRJ02": {}, "PRJ03": { "PRJ03_SUBFOLDER01": {}, "PRJ03_SUBFOLDER02": {} } } }
内容的提问来源于stack exchange,提问作者ivan.grishin
相关产品推荐
相关产品推荐

