함수 데커레이터는 소스 코드에 있는 함수를 '표시'해서 함수의 작동을 개선할 수 있게 해주고, 강력한 기능이지만, 데커레이터를 자유자재로 사용하려면 먼저 클로저를 알아야 한다.
파이썬 3.0에 추가된 nonlocal은 최근에 추가된 예약 키워드 중 하나로, 클래스 중심의 엄격한 객체지향 방식을 고수한다면 이 기능을 사용하지 않고 파이썬 프로그래머로서의 삶에 아무런 지장을 받지 않을 수 잇지만 자기만의 데커레이터를 구현하고자 한다면 클로저를 속속들이 이해해야 하며, 그러고 나면 nonlocal이 필요해진다.
데커레이터에서 사용하는 것 외애도, 클로저는 콜백을 이용한 효율적인 비동기 프로그래밍과 필요에 따라 함수형 스타일로 코딩한다.
단순한 등록 데커레이터에서부터 복잡한 매개변수화된 데커레이터에 이르기까지 함수 데커레이터가 정확히 어떻게 작동하는지 설명한다.
데커래아토눈 다른 함수를 인수로 받는 콜러블(데커레이터된 함수)이다. 즉, 데커레이터는 데커레이트된 함수에 어떤 처리를 수행하고, 함수를 반환하거나 함수를 다른 함수나 콜러블 객체로 대체한다.
@decorate
def target():
print('running target()')
target = decorate(target)
"""
결과는 동일하고, 두 코드를 실행한 후 target는 꼭 원래의 target()함수를 가리키는 것이 아니며, decorate(target)이 반환한 함수를 가리키게 된다.
"""
#일반적으로 데커레이터는 함수를 다른 함수로 대체한다.
def deco(func):
def inner():
print('running inner()')
return inner
@deco
def target():
print('running target()')
target()
target
"""
엄밀히 말하면, 데커레이터는 편리 구문으로, 다른 함수를 인수로 전달해서 호출하는 일반적인 콜러블과 동일하고, 런타임에 프로그램 행위를 변경하는 메타프로그래밍을 할 때, 데커레이터가 상당히 편리하다.
첫째, 데커레이터는 데커레이트된 함수를 다른 함수로 대체하고, 모듈이 로딩될 때 바로 실행된다.
"""