Python动态构建GraphQL响应键名字典触发KeyError解决方法
问题根因
你遇到KeyError以及append调用失败的核心原因有3点:
- Python原生字典(
dict)没有append()方法,append是列表类型的专属方法,不能用来给字典加键值对 - 你初始化的
result是空字典,第一次执行result[manager]时,字典里根本不存在manager对应的键,直接访问就会触发KeyError - 代码本身存在变量名错误:第一个GraphQL查询执行后赋值给了变量
list,后续循环却用了未定义的employee_list;查询替换时误用了未定义的query_query变量,不是你上方定义的query模板。
另外你代码里用list.index(元素)拿当前遍历索引的写法也有问题:如果列表里存在重复元素,index()只会返回第一个匹配项的位置,会导致查询参数替换错误,性能也比直接遍历元素差。
正确实现代码
按照你期望的嵌套字典结构,符合Python规范的实现如下:
def get_employees_per_manager(managers_list, token): result = {} # 提前定义查询模板,避免循环内重复创建字符串 manager_query_template = """ query { details(managersEmailAddress: "##manager_email##"){ employeeId } } """ employee_query_template = """ query { details(employeeId: ##employeeId##){ Name Surname category{ categoryName rating action } } } """ for manager in managers_list: print("Manager", manager) # 替换经理邮箱参数,修正原代码变量名错误 current_manager_query = gql(manager_query_template.replace("##manager_email##", manager)) # 不要用list做变量名,会覆盖Python内置类型 employee_id_list = obj.execute_query(current_manager_query, token) # 初始化当前经理在result中的键,值为存储员工数据的空字典 result[manager] = {} for emp_id in employee_id_list: print("Employee: ", emp_id) # 替换员工ID参数 current_emp_query = gql(employee_query_template.replace("##employeeId##", str(emp_id))) emp_response = obj.execute_query(current_emp_query, token) # 按你拿到的响应结构解析数据:返回格式为([操作列表], "姓名拼接字符串") # 如果接口直接返回独立的Name、Surname字段,可直接从响应中取值,无需手动拆分 action_list, full_name = emp_response name, surname = full_name[:len(full_name)//2], full_name[len(full_name)//2] # 直接给嵌套字典赋值,不需要调用append result[manager][emp_id] = { "Name": name, "Surname": surname, "Action": action_list } print(result) # 保持原函数的返回值逻辑 return employee_id_list, emp_response, result
最终输出结构说明
修正后返回的result完全匹配你预期的嵌套格式:
{ "manager.one@email.com": { 122345: { "Name": "Name1", "Surname": "Surname1", "Action": [{'category': 'Category1', 'rating': 1, 'action': 'Action 1 for this employee'}, ...] }, 126541: { "Name": "Name2", "Surname": "Surname2", "Action": [{'category': 'Category1', 'rating': 1, 'action': 'Action 1 for this employee'}, ...] } }, "manager.two@email.com": { 122346: { "Name": "Name3", "Surname": "Surname3", "Action": [{'category': 'Category1', 'rating': 1, 'action': 'Action 1 for this employee'}, ...] } } }
额外优化提示:如果你的GraphQL接口支持批量传参,最好改成一次查询传入所有经理邮箱、一次查询传入某个经理下所有员工ID,减少接口请求次数,性能会比循环发单个请求高很多。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

