함수에 데코레이터 적용 시 실행 순서
# 실행 순서 4 - deco 함수가 실행되는데, 인자로 hello 함수를 받음
def deco(func):
# wrapper 함수 = hello 함수
def wrapper():
# 실행 순서 5 - "start wrapper" 출력
print("start wrapper")
# 실행 순서 6 - hello 함수 실행
func(10)
# 실행 순서 8 - "end wrapper" 출력
print("end wrapper")
# 실행 순서 9 - return으로 내부 함수(여기서는 hello 함수) 자체를 반환
# 함수 자체를 반환할 때는 () 없이 함수 이름만 써야함
return wrapper
# hello 함수를 실행하려고 했는데 데코레이터로 데코레이팅 되어있음
# 실행 순서 3 - 정의된 deco 데코레이터 먼저 실행
@deco # hello = deco(hello) # hello = wrapper
def hello(a): # hello는 deco 의 func에 전달
# 실행 순서 7 - "Hello" 출력
print("Hello")
if __name__ == "__main__":
# 실행 순서 1 - "main start" 출력
print("main start")
# 실행 순서 2 - hello 함수 호출
# 즉, deco 데코레이터 먼저 실행 후 hello 함수 실행
hello()
# 실행 순서 10 - hello 함수 호출 및 리턴 과정 모두 끝내고 "main end"호출
print("main end")
main start
start wrapper
Hello
end wrapper
main end
동적으로 데이터를 추가해주는 예시
def test_func(**kwargs):
# 실행 순서 3 - 출력
print("kwargs=", end=""), print(kwargs)
# 실행 순서 4 - kwargs에 추가
kwargs["d"] = 4
# 실행 순서 5
for key in kwargs.keys():
# 5-1
print("key=", end=""), print(key)
# 5-2
print("value=", end=""), print(kwargs[key])
return
if __name__ == "__main__":
# 실행 순서 1 - 출력
print("start")
# 실행 순서 2
test_func(a=1, b=2, c=3)
# 실행 순서 6
print("end")
start # 1
kwargs={'a': 1, 'b': 2, 'c': 3} # 3
key=a # 5-1
value=1 # 5-2
key=b # 5-1
value=2 # 5-2
key=c # 5-1
value=3 # 5-2
key=d # 5-1 동적으로 추가된 데이터
value=4 # 5-2
end # 6