데코레이터는 함수를 받아 명령을 추가한 뒤 이를 다시 함수의 형태로 반환하는 함수이다.
대략적인 구조는 다음과 같다.
def outer_function(func): # 기능을 추가할 함수를 인자로 받고,
def inner_function(*args, **kwargs): # 여기서 func 함수에서 받을 인자를 정의.
return func(*args, **kwargs)
return inner_func
그럼 데코레이터는 언제 쓰게 될까?
- 함수마다 공통적으로 호출되는 기능들을 하나로 묶을 때
- 함수의 내부를 수정하지 않고 변화를 주고자 할 때
- 특정 함수를 실행하는데 있어서 전처리 혹은 후처리가 필요한 경우
예를 들어, 다음과 같이 함수의 실행 속도를 측정하는 기능을 데코레이터로 만들어서 붙일 수 있다.
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 |