개발언어 Back-End/Python

@wraps를 사용하는 이유 - 다중 decorator 사용하기

bluebamus 2021. 7. 4.

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로 표시된다.

 

몰라도 큰 문제는 되지 않겠지만, 디버깅 및 로깅을 만들때 꼭 고려해야한다.

댓글