파이썬 - 데코레이터(decorator)에서 인자를 받도록 설정하는 방법

jomminii_before·2020년 1월 30일
3

문제의 발단은 아래와 같았습니다. 아래의 조건을 만족하는 name_decorator라는 데코레이터를 만들어야 했습니다.

@name_decorator("정우성")
def greeting():
    return "Hello, "

greeting()
>>>
"Hello, 정우성"

조금 전에 공부한 데코레이터 문법 설명에서는 분명히 데코레이터를 사용할 때 옆에 인자가 들어갈 수 있다는 내용이 없었고, 데코레이터 내부에서 다음 줄에 나오는 함수를 인자로 받아 사용한다고 했습니다. 그런데 데코레이터에서 인자를 받는다니...?

데코레이터라는 개념을 막 바로 접한지라 말 그대로 멘붕 상태였는데, 두 시간(...) 정도 쥐어짜다보니 이해를 할 수 있게 되었습니다.

기본 형태의 데코레이터 사용방법을 보면 @name_decorator처럼 코드를 작성할 때 따로 인자를 받지 않고, 아래에 위치한 함수가 실행이 되면 인자로 해당 함수를 받아 실행하는 형태를 띕니다.

근데 문제에는 코드를 작성할 때 인자를 받는 함수 형태로 작성이 되어 있으니, 기본 형태의 decorator를 감싸는 한 단계 위의 함수가 또 필요하다고 판단했습니다. @name_decorator("정우성") 이 형태가 기본 형태의 decorator역할을 해야하니, ("정우성")을 인자로 받는 name_decorator 함수가 별개로 필요하다고 생각을 한거죠.

그래서 아래와 같이 코드를 작성했습니다.

def name_decorator(name): #  decorator에 인자로 붙은 ("장동건")을 처리할 새로운 함수 부분
    def real_decorator(func): # 기본 형태의 decorator가 역할을 하는 부분
        def wrap(*args,**kwargs):
            return func(*args,**kwargs) + name
        return wrap
    return real_decorator


@name_decorator("장동건")
def greeting():
  return "Hello, "

이렇게 작성하니 코드가 정상적으로 작동했습니다.

>>> greeting()
"Hello, 장동건"

클로저 부분을 좀 더 깊게 이해하게 되면 보다 쉽게 다가오겠지만, 아직은 이 정도로만 받아들여집니다. 추후 클로저와 데코레이터에 대해 더 깊게 알게 되면 추가 설명 덧붙이겠습니다~

profile
https://velog.io/@jomminii 로 이동했습니다.

0개의 댓글