오늘은 "파이썬 문법 심화"에 들어갔는데 뒤에 배운 데코레이트 함수에 대해 조금 의문점이 생겼다.
일단 함수는 다음과 같다.
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 |