superkind
1/4/2018 - 7:27 AM

데커레이터 #python #tutorial

데커레이터 #python #tutorial

데커레이터

데커레이터는 하나의 함수를 또 다른 함수로 반환하는 함수이다. 아래 documnet_it() 함수는 다음과 같이 데커레이터를 정의한다.

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))

함수는 여러 개의 데커레이터를 가질 수 있다. 실행 순서는 함수에서 가장 가까운 데커레이터 부터 실행된다.

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

데코레이터의 순서를 바꾸면 결과는 같지만 중간 과정이 바뀐다.

@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