# 데커레이터
데커레이터는 하나의 함수를 또 다른 함수로 반환하는 함수이다.
아래 documnet_it() 함수는 다음과 같이 데커레이터를 정의한다.
```python
def document_it(func):
def new_function(*args, **kwargs):
print('Running function:', func.__name__)
print('Positional arguments:', args)
print('Keyword arguments:', kwargs)
result = func(*args, **kwargs)
print('Result:', result)
return result
return new_function
# cooler_add_inits = document_it(add_inits) # 데커레이터를 수동으로 할당
# cooler_add_inits(3, 5)
@document_it # 데커레이터를 자동으로 할당
def add_inits(a, b):
return a + b
print(add_inits(3, 5))
```
함수는 여러 개의 데커레이터를 가질 수 있다. 실행 순서는 함수에서 가장 가까운 데커레이터 부터 실행된다.
```python
def square_it(func):
def new_function(*args, **kwargs):
result = func(*args, **kwargs)
return result * result
return new_function
@document_it
@square_it
def add_inits(a, b):
return a + b
add_inits(3, 5)
```
```
Running function: new_function
Positional arguments: (3, 5)
Keyword arguments: {}
Result: 64
64
```
데코레이터의 순서를 바꾸면 결과는 같지만 중간 과정이 바뀐다.
```python
@square_it
@document_it
def add_inits(a, b):
return a + b
print(add_inits(3, 5))
```
```
Running function: add_inits
Positional arguments: (3, 5)
Keyword arguments: {}
Result: 8
64
```