装饰器中的 Python Access 函数变量
Posted
技术标签:
【中文标题】装饰器中的 Python Access 函数变量【英文标题】:Python Access function vars in decorator 【发布时间】:2018-04-07 21:55:16 【问题描述】:我想要以下:
假设我有以下功能:
def query(self, url, method = 'GET',payload=None):
if method == "GET":
result = requests.get(self.api_base_url+url, auth=self.__auth_token, verify=False)
print (result)
elif method == "POST":
result = requests.post(self.api_base_url+url, auth=self.__auth_token, data=payload, verify=False)
print(result)
elif method == "PUT":
result = requests.put(self.api_base_url+url, auth=self.__auth_token, data=payload, verify=False)
print(result)
我想测量那些休息电话需要的时间。所以我开始构建一个装饰器来测量休息调用的时间。
def timing(f):
def wrap(*args):
time1 = time.time()
ret = f(*args)
time2 = time.time()
time_took = time2-time1
print (time_took)
return wrap
现在我想打印有效载荷。但仅适用于 PUT 和 POST 请求,不适用于 GET 请求。所以我需要在我的装饰器中检查参数method
,但我无法在我的装饰器中访问这个参数。特别是我想做这样的事情:
def timing(f):
def wrap(*args):
time1 = time.time()
ret = f(*args)
time2 = time.time()
time_took = time2-time1
if args[0].method == 'PUT' and args[0].method == 'POST'
print (time_took + args.[0].payload)
else:
print (time_took)
return wrap
问题:
如何在装饰器中访问函数的参数?
谢谢
【问题讨论】:
【参考方案1】:就像你尝试过的一样,但没有.method
。 args
是一个参数元组。
def deco(f):
def inner(*args):
print(args[0])
return f(*args)
return inner
@deco
def foo(a):
pass
foo('a')
# a
如果您不想跟踪参数的索引,可以使用kwargs
。
def deco(f):
def inner(*args, **kwargs):
print(kwargs['a'])
print(kwargs['b'])
return f(*args, **kwargs)
return inner
@deco
def foo(a, b):
pass
foo(a=1, b=2)
# 1
# 2
【讨论】:
问题是,参数“method”不在“args”列表中。为什么 ? print args[0] 打印我班级的对象 @Constantine 因为您将它作为关键字参数传递。请参阅我的更新答案。 kwargs 是空的。我不明白为什么以上是关于装饰器中的 Python Access 函数变量的主要内容,如果未能解决你的问题,请参考以下文章