• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

매개변수

21.09.19 14:50 작성 조회수 87

0

def bold(func):

    def line(*args, **kwargs):#매개변수 개수에 제한없음

        return '<b>'+func(*args, **kwargs)+'</b>'

    return line

 

def italic(func):

    def line(*args, **kwargs):

        return '<i>'+func(*args, **kwargs)+'</i>'

    return line

 

 

@bold

@italic

def write(a, b):

    return a+b

 

print(write('hello ', 'world'))

 

이 코드에서 첫번째 데코레이터인 bold에서는

매개변수 *args, **kwargs가 없어도 될거라 생각해서

매개변수를 지운후에 코드를 돌려보니까 에러가 뜨더라구요..

어차피 bold함수에서 매개변수로 받은 func에서 

데코레이터italic이 먼저 실행되고 그 결과를 func에다가만 집어넣으면 되는것같은데

왜 bold데코레이터에서도 매개변수를 입력해야 하는건가요...??

 

감사합니다!!

 

답변 1

답변을 작성해보세요.

1

안녕하세요.

우선은 write(a, b): 라고 한다면, @bold / @italic 이 실행되면서, 각 함수의 본체가 a 와 b 가 인자로 들어가는 것이니까요. 이 부분을 지원하려면, 말씀하신 인자 선언이 들어가야 맞을 것 같습니다. 인자가 왜 안들어가도 된다고 생각하시는지 사실 정확히 이해는 안가는데, 제 생각에는 인자값을 포함한 함수가 그대로 넘겨지니까, 다연히 내부에서도 그렇게 선언되어야 맞는 것 같고요.

보통 데코레이터 부분에 상당히 많은 분들께서, 비슷한 문의를 많이 해주셨는데요. 아무래도 이해하기가 쉽지 않다보니, 그럴 수 있는데, 제 생각에는 이렇게 이해하기 어려운 부분 같은 경우는 영상을 두세번 반복해보셔도 더 도움이 될 것 같습니다. 

ssujun님의 프로필

ssujun

질문자

2021.09.21

감사합니다!!

가람님의 프로필

가람

2021.09.22

인자가 왜 안들어가도 된다고 생각하시는지 사실 정확히 이해는 안가는데

-> Decorator에 유효성 검사 같이 a나 b같은 인자들을 사용하는 기능이 없으면 인자가 필요없어서 *args,**kwargs를 안써도 된다고 생각할 수 있을것 같아요!

아무래도 파라미터가 있는 함수 첫 예시가 유효성 검사이다 보니  '인자들 가지고 뭘 하려면 저렇게 해야되는구나' 라고 생각이 들었습니다.

이 질문을 보고 데코레이터가 꾸며주는 함수 자체에 인자가 있고 없고에 따라 *args,**kwargs를 붙여주면 되는구나 하고 또 배워갑니다!

왠만한 데코레이터는 에러방지를 위해 기본적으로 (*args, **kwarg)를 쓰면 좋겠네요