본문 바로가기

내일 배움 캠프/TIL

TIL) 2주차 2일

오늘은 "파이썬 문법 심화"에 들어갔는데 뒤에 배운 데코레이트 함수에 대해 조금 의문점이 생겼다.

일단 함수는 다음과 같다.

def decorator(func):

    def wrapper():
        # func.__name__에는 데코레이터를 호출 한 함수의 이름이 들어갑니다.
        print(f"{func.__name__} 함수에서 데코레이터 호출")
        func()
        print(f"{func.__name__} 함수에서 데코레이터 끝")

    # wrapper 함수를 리턴합니다.
    return wrapper


@decorator
def decorator_func():
    print("decorator_func 함수 호출")


decorator_func()

여기서 의문이 들은점은, 왜 wrapper() 함수가 필요한 것일까? 라는 점이다. 그래서 코드를 아래와 같이 바꾼후 실행 시켜보았다.

def decorator(func):

    # func.__name__에는 데코레이터를 호출 한 함수의 이름이 들어갑니다.
    print(f"{func.__name__} 함수에서 데코레이터 호출")
    func()
    print(f"{func.__name__} 함수에서 데코레이터 끝")


@decorator
def decorator_func():
    print("decorator_func 함수 호출")


decorator_func()

결과는 아래와 같이 에러가 나왔다.

TypeError: 'NoneType' object is not callable

 

왜 이런 에러가 나온걸까?

이유는 다음과 같다. @decorator를 사용하기 위해서는 기존의 형식을 유지 해줘야 한단다. 왜냐하면 @decorator를 풀어서 쓰면 new_decorator = decorator(decorator_func); new_decorator() 이다. 즉, new_decorator라는 변수 안에 어떤 값을 넣어줄려면 결국 return값이 필요하기때문에 형식을 지켜줘야한다.

 

그래서 뭘배웠나?

  • 변수에 함수를 넣어주려면 return값이 필요하다.

 

참조) https://www.youtube.com/watch?v=Zk66pyXpUR0

'내일 배움 캠프 > TIL' 카테고리의 다른 글

TIL) 2주차 4일  (0) 2023.03.23
TIL) 2주차 3일  (1) 2023.03.22
TIL) 2주차 1일  (0) 2023.03.20
TIL) 1주차 5일차  (1) 2023.03.17
1주차 3일  (0) 2023.03.15