데코레이터는 함수를 받아 명령을 추가한 뒤 이를 다시 함수의 형태로 반환하는 함수이다.

대략적인 구조는 다음과 같다.

def outer_function(func):  # 기능을 추가할 함수를 인자로 받고,

    def inner_function(*args, **kwargs):  # 여기서 func 함수에서 받을 인자를 정의.
        return func(*args, **kwargs)

    return inner_func

그럼 데코레이터는 언제 쓰게 될까?

  1. 함수마다 공통적으로 호출되는 기능들을 하나로 묶을 때
  2. 함수의 내부를 수정하지 않고 변화를 주고자 할 때
  3. 특정 함수를 실행하는데 있어서 전처리 혹은 후처리가 필요한 경우

예를 들어, 다음과 같이 함수의 실행 속도를 측정하는 기능을 데코레이터로 만들어서 붙일 수 있다.

import time


def measure_performance(func):
    def wrapper(*args, **kwargs):  
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        elapsed = end - start
        print('Elapsed: {}'.format(elapsed))
        return result  # 데코레이터를 사용하는 함수의 결과값을 리턴
    return wrapper

이 함수를 데코레이터로 이용한 피보나치 계산 함수를 다음과 같이 선언해 본다.

data = {0: 1, 1: 1}


def _fibonacci(n):
    if n in data:
        return data[n]

    data[n] = _fibonacci(n-1) + _fibonacci(n-2)
    return data[n]


@measure_performance
def fibonacci_wrapper(n):
    val = _fibonacci(n)
    return val

그리고, 위에서 선언한 fibonacci_wrapper 함수를 한번 실행해 보자.

answer = fibonacci_wrapper(900)
print(answer)

다음과 같이 실행 결과를 가져오는 것을 확인할 수 있다.

Elapsed: 0.00044655799865722656
88793027306605937532517516910637647045239090036365766884466525589158360259770006891772711976920559280382807770394537471560061517120086971996377683290300054868066659454250625417891167369401

이렇듯 어렵지 않게 데코레이터를 사용할 수 있는데, 데코레이터 사용시에 주의해야 할 점으로는 무엇이 있을까?

다음 시간에서 이를 정리해 보고자 한다.

반응형

'Python' 카테고리의 다른 글

CentOS 7에서 파이썬 3 설치  (0) 2019.04.24
파이썬에서 __init__ 함수는 어떤 역할을 하는가?  (0) 2019.04.19

+ Recent posts