Python의 함수는 일급 객체라는 특성 상, Decorator라는 문법을 이용해 특정 함수에 미리 만들어 둔 함수를 전달해 기능을 추가할 수도 있습니다. Python 2.4에서 추가되었고, PEP 318에서 확인해볼 수 있습니다. 간단하게, 함수가 호출되기 전에 '함수가 실행됩니다'라는 문자열을 출력해 봅시다.

천천히 살펴봅시다.

  • decorator 함수는 인자로 fn이라는 함수를 받습니다.
  • decorator 함수는 '함수가 실행됩니다.'라는 문자열을 출력하며 fn을 호출하고 그 결과를 반환하는 내부 함수 wrapper를 가지고 있습니다.
  • decorator 함수는 내부 함수인 wrapper를 리턴합니다.

wrapper 함수는 클로저로 인해 decorator 함수가 가진 지역변수 fn에 접근할 수 있게 됩니다. 그럼 코드의 흐름을 살펴 봅시다.

  • decorator 함수에 'hello'라는 문자열을 출력하는 print_hello 함수를 전달했습니다.
  • decorator 함수는 wrapper 함수를 리턴합니다. 이를 decorated_print_hello라는 변수에 할당했습니다.
  • 해당 변수의 타입은 함수이므로, 그대로 호출하면 wrapper 함수가 호출되며 '함수가 실행됩니다.'라는 문자열이 출력되고, 전달했던 print_hello 함수가 호출되어 'hello'까지 출력되었습니다.

Decorator expression

일반적으로 위와 같이 함수를 넘겨주고, 함수를 받고, 그걸 다시 실행하는 복잡한 구조는 잘 사용하지 않습니다. Python은 데코레이터를 쉽게 사용할 수 있도록 @ 심볼을 제공하며, 이 부분은 Java의 어노테이션과 비슷합니다.

인자가 있는 함수 데코레이팅하기

인자를 가진 함수를 데코레이팅하고 싶다면, 내부(wrapper) 함수에 *args**kwargs를 추가하면 됩니다.

여기서 wrapper 함수는 데코레이팅과 함께 인자를 중계해주는 형태입니다.

'Python 계열 > Python 레거시 글' 카테고리의 다른 글

[Python] Generator  (0) 2018.07.23
[Python] Iterable, Sequence, Iterator  (0) 2018.07.22
[Python] Closure  (0) 2018.07.20
[Python] 문자열의 메모리 할당 방식  (0) 2018.07.19
[Python] 함수 인자의 기본값 평가  (0) 2018.07.14

+ Recent posts