【发布时间】:2021-05-19 12:44:25
【问题描述】:
我有一个这样的 Python 代码:
from functools import wraps
def dec(f):
@wraps(f)
def wrapper(*args, **kwargs):
f.foo = 'foo'
value = f()
f.foo = 'foo'
return value
return wrapper
@dec
def f():
print('Hello, f')
f()
print(f.foo)
你可以找到准备好的代码here:
这段代码的问题是我最终得到了AttributeError: 'function' object has no attribute 'foo',尽管我使用了来自functools 的wraps 装饰器,它应该保留函数的属性范围。任何想法错误的原因是什么?
【问题讨论】:
-
dec需要返回wrapper而不是f。你的装饰器目前是空的。 -
foo属性仅在您调用f()时创建。如果您希望它在“装饰时间”创建,请将该行移至dec,而不是wrapper。 -
修复了这个问题,但仍然没有消除根本问题
-
@deceze,请参阅问题中的更新代码。问题依旧
-
这不是 deceze 建议的。你无缘无故地调用 f() 两次