gpt4 book ai didi

用于获取 JSON 请求的函数的 Python 装饰器

转载 作者:行者123 更新时间:2023-12-01 07:31:43 24 4
gpt4 key购买 nike

我无法将 url-details 从装饰函数传递到装饰器。

调试时,修饰函数中的url-details将被忽略。如何使用装饰器来解决这个问题以避免重复的代码?

编辑

有一个 Web 服务,提供 JSON 数据。我在代码库中发现了重复的代码:对于每个 get 请求,都有一个单独的函数(fetch_allfetch_keyfetch_date 等)。每个函数都以相同的方式创建 URL (url_base + url_mid + url_details)、定义 header 并获取响应,仅 url_detail 不同.

现在我想以这种方式重构丑陋、重复的代码:仅在现有函数中定义 url_details 并删除整个 url 创建、 header 定义和最终获取响应(通过 requests. get(...)) 到装饰器中。

装饰器

def fetch(fnc):
def wrapper(access_token, url_detail="", debug=None):
headers = {"Authorization": "xxx " + access_token, "Accept": "application/json"}
url = f"{url_base}{url_mid}{url_detail}"
response = requests.get(url, headers=headers, verify=False)
if debug:
print(response)
return response.content
return wrapper

装饰函数

@fetch
def fetch_all(access_token):
return access_token, ""

@fetch
def fetch_key(access_token, key=None):
return access_token, f"/{key}"

@fetch
def fetch_date(access_token, date=""):
return access_token, f"?date={date}", True

最佳答案

我对您想要实现的目标有点困惑,但我知道为什么您可能会遇到困难。

通过使用 @fetch 修饰函数,您可以将原始函数作为 fnc 传递。

然后,您定义一个新函数(wrapper),您将其作为装饰器的结果返回。但是,您永远不会在新函数中调用 fnc,这意味着它永远不会运行!

无论您正在装饰什么函数,您的装饰器都将始终返回相同的wrapper函数。

您当前的代码相当于

def wrapper(access_token, url_detail="", debug=None):
headers = {"Authorization": "xxx " + access_token, "Accept": "application/json"}
url = f"{url_base}{url_mid}{url_detail}"
response = requests.get(url, headers=headers, verify=False)
if debug:
print(response)
return response.content

fetch_all = wrapper
fetch_key = wrapper
fetch_date = wrapper

关于用于获取 JSON 请求的函数的 Python 装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57182748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com