더북(TheBook)

다음 예시에서 함수를 인수로 받아 time.time 함수 호출 코드를 추가하여 래핑하는 데코레이터 함수를 확인할 수 있다. time은 패키지이므로 time.time 함수가 호출되기 전에 반드시 탑재되어야 한다는 것을 잊지 말자.

import time

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

이 예시에는 (아직 그렇게 복잡하지는 않지만) 여러 함수를 포함하고 있으니 하나씩 살펴보자.

인수로 입력되는 함수. 이 함수를 기존 함수(F1)로 부르자. 이 함수에 우리가 원하는 문장을 추가(decorated)하고 싶다고 해 보자.

래퍼 함수는 우리가 원하는 문장을 추가한 결과다. 이 코드는 기존 함수가 실행되면서 걸린 시간을 초 단위로 반환하는 문장을 추가했다.

데코레이터는 래퍼 함수를 생성하여 반환하는 작업을 수행한다. 이 데코레이터는 함수 내부에 def 키워드로 신규 함수를 정의하기 때문에 이 작업이 가능해진다.

결국 이 절에서 보았듯이 함수 이름을 재대입하면서 기존 버전이 래핑된 버전으로 교체된다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.