All Articles

python - 데코레이터 복습

함수에 데코레이터 적용 시 실행 순서

# 실행 순서 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