문제의 발단은 아래와 같았습니다. 아래의 조건을 만족하는 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, 장동건"
클로저 부분을 좀 더 깊게 이해하게 되면 보다 쉽게 다가오겠지만, 아직은 이 정도로만 받아들여집니다. 추후 클로저와 데코레이터에 대해 더 깊게 알게 되면 추가 설명 덧붙이겠습니다~