#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
이제 보인다!