반응형

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)

반응형

+ Recent posts