Python_함수를 return할 때 괄호 유무 차이

이정아·2021년 9월 17일
0

Python

목록 보기
17/20
post-thumbnail

예제)
greeting 함수에 적용될 decorator 함수를 구현하여 greeting 함수에 적용해주세요.

greeting 함수가 호출 되었을때 decorator 함수에 parametor 값이 greeting 함수 리턴값의 다음에 붙혀져서 리턴되어야 합니다.

Decorator 함수의 이름은 welcome_decorator 여야 합니다.

예를 들어, 다음 처럼 정의 하여 welcome_decorator decorator를 적용하여 greeting을 호출하면:

@welcome_decorator
def greeting():
    return "Hello, "

greeting()

결과값은 다음과 같아야 합니다.

"Hello, welcome to WECODE!"

def welcome_decorator(func):
  def wrapper():
    return func()+"welcome to WECODE!"
    	# greeting()+"welcome to WECODE!" 
  return wrapper


@welcome_decorator
def greeting():
  return "Hello, "

처음에 return wrapper 뒤에 ()괄호를 붙였는데 오류가나서 지웠더니 해결이 됐다. 하지만 아직 궁금하고 이해가 안된다.
return wrapper 뒤에 ()괄호가 없는데 wrapper 중첩함수가 어떻게 호출이 되는거지?


처음엔 구글링을 하기 시작했고 내가 찾고싶은 내용을 못 찾고 해매다 결국 위코드 멘토님께 찾아갔고 아래 두가지 상황을 접목시켜보라는 답변을 받았다.

  1. 함수를 객체로 받을 때의 상황은 언제인지?
    ㄴ 괄호를 쓰지 않았을 때

  2. 함수를 함수 본연의 기능으로 쓰고자 할 때의 상황은 언제인지?
    ㄴ () 괄호를 써서 호출할 때


일단 저 두 질문에 답을 찾고 코드를 다시 살펴봤다.

def welcome_decorator(func):
# 함수를 객체로 받는 상황: 인자로 greeting 함수 객체를 받는다.
# 처음엔 괄호 붙인 greeting()이 인자로 들어가는 줄 알아서 이해하는데 더 힘들었다.
  def wrapper():
    return func() + "welcome to WECODE!"
  return wrapper
	

@welcome_decorator
def greeting():
  return "Hello, "

print(greeting())
>>> "Hello, welcome to WECODE!"

greeting()
=> welcome_decorator(greeting)()
=> wrapper()
이라고 생각했고 맞는지 여러가지 코드를 돌려봤다.

1) 내가 생각한 코드

print(welcome_decorator(greeting)())
>>> "Hello, welcome to WECODE!"

제대로 값이 나왔다.


2) 소괄호를 빼보면?

print(welcome_decorator(greeting))
>>> <function welcome_decorator.<locals>.wrapper at 0x7fab2a006700>

wrapper 함수의 주소가 나온다.
wrapper를 리턴해줬고, 즉 호출이 되지 않은 상태이다.


✏️ 코드를 실행하고 내가 생각한 값들이 출력됐다.
생각보다 이해하는데 오래 걸렸지만..풀렸을 때 희열을 느꼈다.

0개의 댓글