Intro
안녕하세요, 오늘은 우리가 python코드를 보다보면 발견할 수 있는 decorator에 대해서 정리해보려고 합니다.
decorator는 class나 method를 정의할 때, 그 위에 @로 시작하는 구문을 얘기합니다.
Java의 annotation vs. Python의 decorator
Java언어에도 @을 사용하는 annotation 이 있죠.
하지만, 두 단어의 이름이 다르듯이, 의미또한 다릅니다.참고
Java의 _annotation_은 @을 달아주는 객체에 대한 추가적인 meta data를 제공해주는 역할을 합니다. 이것 자체가 어떤 로직으로서의 역할을 한다기 보다는, 컴파일러가 이 정보를 참고해서 코드를 실행하는데 도움을 주는 역할로 보면 될 거 같습니다. (잘 활용하면 로직으로서도 사용이 가능하다는 거 같은데... 정확히는 모르겠습니다.)
반면에 Python의 decorator는 로직으로서의 역할을 합니다. 즉, 정의 위에 decorator가 붙은 함수를 실행하면, 그 함수 이외에 실행되는 로직이 있고, 그 로직을 수행할 함수의 이름을 @뒤에 써주는 겁니다.
Code test
간단한 예시를 통해서 decorator의 쓰임을 확인해보겠습니다.default_path
에 위치한 config.json
파일의 전체 filepath를 반환해주는 함수 get_config_fp()
이 있다고 합시다.
그런데 처음에 이 함수를 짤 때, 실수로 인자로 받은 default_path
를 그대로 반환하게 실수했다고 합니다. (또는 기존의 함수에 어떤 기능을 추가하고 싶다고 합시다.)
def get_config_fp(default_path):
return default_path
decorator를 사용하면, 원래 함수의 수정없이 원하는 기능을 추가해줄 수 있습니다. decorator의 활용법을 두루 익히기 위해서, 불필요하지만 아래 2개의 decorator역할을 해줄 함수를 정의했습니다.
## default_path뒤에 "/"를 추가해주는 decorator
def add_slash(func):
def slash_decorator(default_path):
return f"{func(default_path)}/"
return slash_decorator
## default_path뒤에 파일 이름을 추가해주는 decorator
def add_fn(filename):
def fn_decorator(func):
def func_wrapper(default_path):
return f"{func(default_path)}{filename}"
return func_wrapper
return fn_decorator
add_slash
는 기능을 추가하고자 하는 함수 외에 다른 인자를 받지않는 decorator이고, add_fn
는 다른 인자도 함께 받는 decorator입니다.
위의 구현에서도 보이듯이, 추가 인자를 받지 않는 add_slash
는 func -> func의 인자 순으로 입력을 받고, add_fn
은 추가 인자 -> func -> func의 인자 순으로 입력을 받아 처리하는 것을 알 수 있습니다.
decorator의 동작을 조금더 자세히 보기 위해서, get_config_fp()
와 같은 기능을 하는 함수들을 아래와 같이 정의했습니다.
def get_config_fp(default_path):
return default_path
@add_slash
def get_config_fp2(default_path):
return default_path
@add_fn('config.json')
@add_slash
def get_config_fp3(default_path):
return default_path
보시는 바와 같이 decorator는 여러 개를 사용할 수 있습니다. 실행되는 순서는 target fucntion과 가까운게 먼저 실행됩니다.
전체 코드 및 수행 결과는 아래와 같습니다.
마무리
오늘은 python의 decorator에 대해서 간단히 살펴봤습니다.
다음에는 python에서 많이 사용되는 주요 decorator들과 그 사용법에 대해서 정리하겠습니다.
감사합니다. 좋은 하루 보내세요!
References
PEP 318 -- Decorators for Functions and Methods(LINK)
'[Python]' 카테고리의 다른 글
[Python] timeit 모듈과 pandas함수들의 속도 비교 테스트 (0) | 2021.07.18 |
---|---|
[Python] Mixin 이란? (0) | 2021.07.10 |
[Python] Decorator(4) - dataclass, functools (0) | 2021.07.04 |
[Python] Decorator(3) - @classmethod, @staticmethod (0) | 2021.06.28 |
[Python] Decorator (2) - @property (0) | 2021.06.20 |