【问题标题】:How to read function attributes from decorator in Python如何在 Python 中从装饰器中读取函数属性
【发布时间】:2019-12-26 01:34:05
【问题描述】:
我想从装饰器访问函数的局部变量。例如,在下面的代码中,我有一个名为 globalfunc 的函数,它有一个变量状态,我想在调用函数之前从装饰器“deco”中读取状态值 - 有可能吗?
def deco(func):
def wrap():
print(wrap.status)
func()
print(wrap.status)
return wrap
@deco
def globalfunc():
status="success"
# main
globalfunc()
【问题讨论】:
标签:
python
python-2.7
decorator
python-decorators
【解决方案1】:
你有一个局部变量,而不是一个函数属性。您不能从函数外部访问局部变量。
函数属性会这样分配:
def globalfunc():
globalfunc.status = "success"
globalfunc.status = "notyetcalled"
您的装饰器必须小心地将status 属性的初始值传递给它创建的新function 对象:
def deco(func):
def wrap():
print(wrap.status)
func()
print(wrap.status)
try:
current_status = func.status
except AttributeError:
current_status = "some default value"
wrap.status = current_status
return wrap
现在你可以写了
@deco
def globalfunc():
pass
globalfunc()
哪个输出
"some default value"
"success"
【解决方案2】:
chepner 的上述回答说明您可以访问函数属性。 [原始] 问题包含术语 attribute 但代码显示 OP 指的是局部变量。
很遗憾,这是不可能的。没有这个功能比有一个更好,因为它可能会在处理不同功能和范围的数据时引发一些安全问题。
可能的解决方案:
附言。我没有添加评论的声誉,因此这个答案。