더북(TheBook)

이 데코레이터 함수를 보면 중요한 부분이 누락된 것을 알 수 있다. 기존 함수 func의 인수가 보이지 않는다. func 함수에 인수가 있다면 래퍼 함수는 함수 func를 제대로 호출할 수 없게 된다.

해결책은 앞 절에서 소개한 *args**kwargs 기능을 포함하는 것이다. 완전한 데코레이터 예시를 살펴보자.

import time

def make_timer(func):
    def wrapper(*args, **kwargs):
        t1 = time.time()
        ret_val = func(*args, **kwargs)
        t2 = time.time()
        print('소요 시간 :', t2 - t1)
        return ret_val
    return wrapper

신규 함수가 래퍼인 것을 기억하라. 임시로 wrapper로 명명한 래퍼 함수는 결국 func 대신 호출될 것이다. 이 래퍼 함수는 어떤 숫자의 인수나 키워드 인수를 취할 수 있게 된다. 기존 함수 func에 모든 인수를 전달해 보자. 다음과 같이 말이다.

ret_val = func(*args, **kwargs)
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.