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

函数内调用子函数时querystring变量未定义的问题排查

解决方案:将querystring作为参数传入分页函数

你的问题核心是_get_all_data作为独立函数,无法访问各个get_endpoint_*函数内定义的querystring变量——虽然Jupyter运行时可能因为环境变量泄漏没报错,但代码逻辑本身存在变量作用域问题,linter的报错是合理的。

解决方法很直接,把querystring(以及可能的header,如果它不是全局变量的话)作为参数传递给_get_all_data:

步骤1:修改_get_all_data的参数定义

更新分页函数,新增querystring和header参数(如果header是全局变量可省略):

def _get_all_data(response, querystring, header):
    """
    Return the results of the get request.

    Loops over api response and appends results to list in addition to appending the
    results of a while loop for pagination.
    """
    results = []
    for x in response["results"]:
        results.append(x)
    while response["paging"]["next"]["link"] is not None:
        url = response["paging"]["next"]["link"]
        # 使用传入的querystring和header参数
        response = requests.request("GET", url, headers=header, params=querystring)

        response = response.json()

        for x in response["results"]:
            results.append(x)
    return json_normalize(results)

步骤2:在各个端点函数中调用时传入参数

以get_endpoint_a为例,调用_get_all_data时传入当前函数内的querystring和header:

def get_endpoint_a() -> pd.DataFrame:
    """
    Return data from API endpoint.

    Includes all data. It is initially returned as a JSON and
    then transformed into a DataFrame.
    """
    url = configs.ENDPOINT_A
    querystring = configs.a_querystring
    header = {"Your-Header-Key": "value"}  # 假设header在此定义,全局变量则无需这行
    try:
        response = requests.request("GET", url, headers=header, params=querystring)
    except requests.exceptions.RequestException as e:
        raise sys.exit(e)
    if response.status_code != 200:
        raise Exception(f"Response from API: {response.status_code}")

    response = response.json()
    # 传入querystring和header
    return _get_all_data(response, querystring, header)

为什么之前的方法不行?

  • nonlocal关键字仅适用于嵌套函数的外层函数作用域,而你的_get_all_data是独立函数,和get_endpoint_*是平级关系,因此nonlocal无法生效。
  • 全局定义querystring不可行,因为每个端点需要不同的参数,会导致参数冲突。

这样修改后,既解决了linter的报错,也让代码的作用域逻辑更清晰,避免了潜在的变量泄漏问题。

内容的提问来源于stack exchange,提问作者shr2936

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 14:05:33