brunch

You can make anything
by writing

C.S.Lewis

by 유윤식 Sep 04. 2022

Python : @Wrap

#time.time() #taken_time #decorator #데코

Func: loop_back ((10,), {}) -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Taken time is 1.033301830291748

Help on function wrapper in module __main__:


wrapper(*args, **kwargs)

    #@wraps(func)


Python @wrap

어떤 방식으로 사용할 수 있는지 공부.


우선, "파이썬에서 함수를 파라미터로 넘길 수 있다" 라는 부분에서 동의가 필요하다.


예를 들어,


import time

from types import FunctionType


def record_lap(func: FunctionType):
    def wrapper(*args, **kwargs):
        st = time.time()
        res = func(*args, **kwargs)
        print(f'Func: {func.__name__} ({args}, {kwargs}) -> {res}')
        print(f"Taken time is {time.time() - st}")
        return res
    return wrapper


위의 함수에서 FunctionType 의 파라미터를 하나 넘겨받는다. 

그리고 wrapper 함수 내부에서 func 를 실행하고 실행 시간, 함수의 이름을 print 한다.


나는 record_lap 을 데코레이터로 감싸서 lop_back 이라는 함수에서 사용하려고 한다.

나는 loop를 몇 번 돌릴 것인지만 신경쓰면 된다. 해당 함수가 실행되어 결과를 반환할 때 까지 걸리는 시간은 record_lap 에 위임한다.



@record_lap
def loop_back(n):

    '''

         params: n(iter)
         desc  : help
    '''
    list_back = []
    for i in range(n):
        list_back.append(i)
        time.sleep(0.1)
    return list_back


해당 함수위에 @record_lap 부분을 데코레이터 했다고 명명하자.

loop_back 은 record_lap 의 파라미터로 넘어간다.


실제로 실행해보면,


if __name__ == '__main__':
    loop_back(10)
    help(loop_back)


=> Func: loop_back ((10,), {}) -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Taken time is 1.033301830291748

Help on function wrapper in module __main__:


wrapper(*args, **kwargs)


오! loop_back을 10번 돌렸더니 총 실행시간이 약 1초 정도로 기록되었다.

이를 확장해보면 해당 함수의 실행 시간 및 파라미터 변수 값 등을 logger 를 통해서 외부 데이터베이스에 저장 / 기록 할 수 있을 것이다.


근데,

한가지 이상한 부분이 있다. loop_back 의 함수를 help 했는데, wrapper 로 표시된다.

이 뜻은 loop_back 함수를 찾지 못했다고 말할 수 있다.

함수를 찾지 못했다? 이게 무슨 뜻일까?

>> inaccessible


그럼 어쩌지...

코드 두줄만 추가해보면 바로 해결 할 수 있다.


from functools import wraps


def record_lap(func: FunctionType):
    @wraps(func)
    def wrapper(*args, **kwargs):
        st = time.time()
        ...



다시 실행해보면!

>> Func: loop_back ((10,), {}) -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Taken time is 1.019080400466919

Help on function loop_back in module __main__:


loop_back(n)

    params: n(iter)

    desc  : help


이제 보인다!

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari