플라스크 API 경로에서 여러 데코레이터를 사용하고 있으며 해당 데코레이터 (functools 랩) 내에서 속성을 설정하고 있지만 호출되는 첫 번째 데코레이터 내에서만 속성을 설정할 수 있습니다. 호출되는 모든 데코레이터의 속성을 설정하고 참조하는 기능을 갖고 싶습니다.
decorators.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'
setattr
다음 def
과 같이 decorated
방금 정의한 (그리고 반환 할) 함수에 속성을 할당하도록를 이동할 수 있습니다 .
def example_func3(f):
@wraps(f)
def decorated(*args, **kwargs):
return f(*args, **kwargs)
setattr(decorated, 'shoes', 'nike')
return decorated
나는 테스트했다 (플라스크 외부), 이것은 나를 위해 작동합니다.
그러나 물론 이것은 질문을합니다 : 왜 내가 필요 decorated
하고 @wraps 가 필요 합니까? 글쎄, 나는 당신이 그렇게 확신하지 못합니다. 이것은 나에게도 효과가 있습니다 (다시 플라스크없이) :
from functools import wraps
def example_func1(f):
f.name = 'bill'
return f
def example_func2(f):
f.cookie = 'chocolate'
return f
def example_func3(f):
f.shoes = 'nike'
return f
@example_func1
@example_func2
@example_func3
def func():
print(f'func: name={func.name}')
print(f'func: cookie={func.cookie}')
print(f'func: shoes={func.shoes}')
func()
( setattr
통화를 단순화했습니다. )
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다