【发布时间】:2021-05-17 09:42:06
【问题描述】:
我在烧瓶 API 路由上使用多个装饰器,并且我在这些装饰器中设置属性(functools 包装),但是我只能从被调用的第一个装饰器中设置属性。我希望能够设置和引用所有被调用的装饰器的属性。
装饰器.py
from functools import wraps
def example_func1(f):
@wraps(f)
def decorated(*args, **kwargs):
setattr(decorated, 'name', 'bill')
return f(*args, **kwargs)
return decorated
def example_func2(f):
@wraps(f)
def decorated(*args, **kwargs):
setattr(decorated, 'cookie', 'chocolate')
return f(*args, **kwargs)
return decorated
def example_func3(f):
@wraps(f)
def decorated(*args, **kwargs):
setattr(decorated, 'shoes', 'nike')
return f(*args, **kwargs)
return decorated
烧瓶路线:
@app.route("/myRoute", methods=["GET", "OPTIONS"])
@example_func1
@example_func2
@example_func3
def my_route():
print(my_route.name) # this returns 'bill' as expected
print(my_route.cookie) # stack trace for no attribute
print(my_route.shoes) # didn't get this far
来自堆栈跟踪的错误消息:
AttributeError: 'function' object has no attribute 'cookie'
【问题讨论】:
-
你的装饰器在他们的参数上设置属性,而不是函数,他们同样返回一个包装器,而不是函数。