• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

python 데코레이터 질문입니다!

20.09.01 22:39 작성 조회수 430

2

안녕하세요. 우선 양질의 강의에 감사인사부터 드립니다. 다름이 아니라 파이썬 데코레이터 함수에 관해 2가지만 여쭈어 보겠습니다.

1. 위 코드 중 38,39번 셀이랑 40,41번 셀 차이점이 print() 여부인데, print()를 해주면 None결과값이 생기는 이유가 무엇때문인건가요!? 

2. 위 코드에서 closure함수 부분에서 

return func(digit1, digit2) 라고 했을 때랑 return을 빼버린 func(digit1, digit2) 랑 결과물은 같게 나오는데, return 존재 여부가 나중에 어떤 영향을 끼치는 건가요..!? 

두 개 모두 사소한 질문일 수 있는데 궁금해서요..! 

답변 4

·

답변을 작성해보세요.

0

와우 감사합니다! MIKE님 덕에 이해가 됬네요! 어찌됬건 return을 사용하는 것이 좋겠네요! 감사합니다 ~ :)

0

MIKE.aeon님의 프로필

MIKE.aeon

2020.09.09

저도 이부분이 헷갈려서 여러번 교제를 읽어 보았습니다. 

devide_func 함수의 리턴값이 없어서 동일한 결과를 가져오는 것처럼 보입니다. 만약에 devide_func  를 수정해서 리턴값을 가지게 하면  inner_func 에서 리턴을 할때와 안할때의 차이가 발생합니다. 그래서 일반적으로 return 을 넣어두면 2가지의 경우를 모두 처리가능해서 일반적인 데코레이터 만들때 return을 넣는것으로 이해했습니다.

연습문제 중에 type_checker 데코레이터 만들기 에서 inner 함수의 리턴을 빼면 정상입력시 결과값이 출력되지 않습니다. 저는 이부분을 보시면서 감이 조금 왔습니다.

저는 이렇게 이해했는데, 틀렸다면 댓글 부탁드립니다.

0

감사합니다! 첫 번째 질문은 이해가 된 것 같은데 혹시 두 번째 질문답변 중에서 "return func(digit1, digit2)  은 결국 return 이라고 쓴 셈이나 동일하고요." 이 문장이 잘 이해가 가지 않는데 이 뜻이...

#outer_func은 제외하고 작성했습니다

def inner_func(digit1, digit2):

     if digit2 == 0:

        print('0으로나누어질 수 없습니다')

        return

    return func(digit1, digit2)

위 코드랑

def inner_func(digit1, digit2):

     if digit2 == 0:

        print('0으로나누어질 수 없습니다')

        return

    func(digit1, digit2) 

이거랑 결국 동일하다는 말씀이신건가요..!? ㅜㅜ 어렵네요..흑

0

안녕하세요. 우선 양질의 강의라고 생각해주셔서 정말 감사합니다. 백엔드 강의가 실제 장기적으로 도움이 될 수 있도록 꾸민 측면이 어떻게 느껴지실까 조금 걱정이 있었는데, 다행이네요.

1번에서는

40번과 41번에서 2.0 이나, 0으로 나누어질 순 없습니다. 이 부분은 함수 안에 있는 print 문을 통해 출력이 되는 것이고요.

None 은 divide_func() 함수의 리턴값을 출력한 것입니다. 그런데, 데코레이터에는 

return 만 있고, 별 값을 리턴안하거나, (digit2 가 0인 경우), 아예 return 구문이 없죠. 이 때에는 해당 함수의 리턴값이 None 입니다.

print(divide(4,2)) 와 같이 쓸 경우, 결국 divide() 함수가 다 실행되고 그 결과, 즉 리턴값을 print 하라는 명령인 셈이 되기 때문에, 해당 함수의 리턴값인 None 이 출력되는 것입니다.

2번에서는

return 을 명시적으로 해주거나, 명시적으로 안해주더라도, 함수가 끝나면 일반적으로 프로그래밍 언어는 리턴 처리를 합니다. 그런데 지금 케이스에서는 func(digit1, digit2) <-- 이 함수 자체가 리턴값이 없죠. 그렇다면,

return func(digit1, digit2)  은 결국 return 이라고 쓴 셈이나 동일하고요. 이 경우는 None 이 리턴되는 것이고, return 을 안붙여도 함수가 끝났으니 파이썬이 리턴 처리를 하면서 None 을 리턴하니, 결국 둘다 None 이 리턴되는 것입니다.

감사합니다.