개발언어 Back-End/Python
@wraps를 사용하는 이유 - 다중 decorator 사용하기
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로 표시된다.
몰라도 큰 문제는 되지 않겠지만, 디버깅 및 로깅을 만들때 꼭 고려해야한다.
'개발언어 Back-End > Python' 카테고리의 다른 글
데이터 클래스(dataclasses ) 의 사용목적, 단점, 사용 예시 (1) | 2024.02.01 |
---|---|
리스트에서 데이터 삭제하기 - del, pop, slicing, remove (0) | 2023.12.18 |
파이썬 버전 관리 도구 pyenv, 패키지 관리도구 Poetry 총 정리 - 완결편 (0) | 2023.11.03 |
타입 힌트 Callable 그리고 여러 유형의 반환 값을 위한 Union (0) | 2023.04.09 |
__all__을 사용하는 이유 (0) | 2021.07.05 |
댓글