2019년 4월 14일 일요일

[공부]python의 decorator

https://jupiny.com/2016/09/25/decorator-function/

어떤 함수가 있다.
def plus(a, b):
    return a + b

if __name__ == '__main__':
    plus(1, 2)

그 함수가 일어날 때 마다 어떤 동작 (소요시간 체크, 결과값 확인)이 일어나게 하고 싶다.
def plus(a, b):
    return a + b

import time
def tictoc(func, a, b):
    start_t = time.time()
    ret = func(a, b)
    end_t = time.time()

    print(end_t - start_t)  # 소요시간
    print(ret)                 # 결과값
    return ret

if __name__ == '__main__':
    # plus(1, 2)    tictoc(plus, 1, 2)

tictoc함수에 함수 plus를 인자로 넣어줌으로써 해결하였지만, 문제점이 있다.
함수의 인자가 늘어나면 또 새로운 tictoc함수를 만들어줘야 한다. 

decorator를 사용하면 더 간단하게 해결가능하다.

import time
def tictoc_decorator(func):
    def wrapper(*args, **kwargs):
        start_t = time.time()
        ret = func(*args, **kwargs)
        end_t = time.time()

        print(end_t - start_t)
        print(ret)
        return ret
    return wrapper
@tictoc_decorator
def plus(a, b):
    return a + b

if __name__ == '__main__':
    plus(1, 2)

    help(plus)

그런데 이런 함수형 decorator는 지저분하기에 class형 decorator를 쓰는 것이 더 깔끔하다

class tictoc():
def __init__(self, func):
self.func = func

def __call__(self, *args, **kwargs):
start_t = time.time()
ret = self.func(*args, **kwargs)
end_t = time.time()

print(end_t - start_t)
print(ret)

return ret