이 코드는 반환값도 처리하고 있다. 래퍼는 당연히 func 함수와 같은 값을 반환한다. 함수 func의 반환값이 없다면 어떻게 될까? 문제없다. 파이썬 함수는 기본적으로 반환값이 없을 때 None을 반환하기 때문이다. 이런 경우 값 None이 단순하게 전달된다. (반환값의 존재 유무를 테스트할 필요는 없다. 무조건 반환하기 때문이다!9)
데코레이터 make_timer를 정의하고 나면 어떤 함수라도 make_timer로 래핑된 버전을 만들 수 있다. 그렇게 되면 (거의 마지막 트릭) 함수 이름을 재대입하여 함수의 래핑된 버전을 참조하게 된다.
def count_nums(n):
for i in range(n):
for j in range(1000):
pass
count_nums = make_timer(count_nums)
래퍼 함수는 make_timer에 의해서 다음과 같은 코드를 생산한다. (식별자 func가 재대입되지 않아야 한다. 조금 뒤에 이 상황을 알아볼 것이다.)
def wrapper(*args, **kwargs):
t1 = time.time()
ret_val = func(*args, **kwargs)
t2 = time.time()
print('소요 시간 :', t2 - t1)
return ret_val
9 역주 반환값이 없는 함수이더라도 None이 반환된다는 것을 언급하고 있다.