You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 08:15:32