函数内调用子函数时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
相关产品推荐
相关产品推荐

