개발언어 Back-End/Python
@wraps를 사용하는 이유 - 다중 decorator 사용하기
bluebamus
2021. 7. 4. 22:00
python과 django의 CBV에서 decorator를 사용하는 방법이 다르다.
하지만 @wrap을 사용하는 목적을 동일하기 때문에 알아두면 좋다.
사용목적 - debug시 해당 다중 decorator를 사용하면, 사용이 중첩되면서 애초에 호출을 시작한 시발점 함수의 이름이 사라지고 상위 decorator 함수 이름이 따라다닌다. 이는 디버깅시 좋지 않다.
* 함수의 속성을 유지시켜주는 것으로 알고 있는데 이는 차후 더 깊게 공부를 해볼 사안이다.
#!/usr/bin/python3
import time
from functools import wraps
def decorator1(func):
def wrapper(*args, **kwargs):
ret = func(*args, **kwargs)
print("decorator1() func name : %s" % func.__name__)
return ret
return wrapper
def decorator2(func):
def wrapper(*args, **kwargs):
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print("%s" % str(end - start))
print("decorator2() func name : %s" % func.__name__)
return ret
return wrapper
def decorator3(func):
@wraps(func)
def wrapper(*args, **kwargs):
ret = func(*args, **kwargs)
print("decorator3 is called.")
print("decorator3() func name : %s" % func.__name__)
return ret
return wrapper
@decorator1
@decorator2
@decorator3
def test(value):
time.sleep(value)
def main():
test(3)
if __name__ == "__main__":
main()
main 실행시,
decorator3() > decorator2() > decorator1() 순서로 호출되는데
@wraps annotation을 사용한 decorator3에서의 decorator2에서 함수명이 잘 출력된다.
하지만 decorator1()는 @warps를 사용하지 않기 때문에 rwapper로 표시된다.
몰라도 큰 문제는 되지 않겠지만, 디버깅 및 로깅을 만들때 꼭 고려해야한다.