<aside> 💡 파이썬에서 데코레이터는 다른 함수를 수정하지 않고 기능을 추가하거나 변경할 수 있는 강력한 도구입니다. 데코레이터는 함수를 인자로 받아 다른 함수를 반환하는 함수입니다.

</aside>

데코레이터의 구조와 적용 방식

  1. 데코레이터 함수 정의
  2. 데코레이터 내부에 또 다른 함수(내부 함수)를 정의
  3. 내부 함수에서 외부 함수의 인자로 받은 함수를 호출
  4. 내부 함수를 반환
  5. 외부 함수에 @ 심볼을 이용하여 다른 함수에 적용
# 1.
def my_decorator(func):
    # 2.
    def wrapper():
        print("함수 실행 전")
        func() # 3.
        print("함수 실행 후")
    return wrapper #4.

@my_decorator # 5.
def say_hello():
    print("안녕하세요!")

say_hello()

함수의 실행 시간 측정

import time

def timer(func):
    def wrapper(*args, **kwargs): # 함수에 어떤 매개변수가 사용되는지 모르므로
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"⏲️ {func.__name__} 실행 시간: {end_time - start_time}초")
        return result
    return wrapper

@timer
def exp_func():
    total = 0
    for i in range(1, 10000000):
        total += (i * i - i) / i
    return total

exp_func()

함수 로깅

import functools

def logger(func):
    # 함수의 매개변수들 사용
    def wrapper(*args, **kwargs):
        print(f"✏️ {func.__name__} 함수 호출 - 인자: {args}, {kwargs}")
        return func(*args, **kwargs)
    return wrapper

@logger
def arith(x, y, *, func):
    return func(x, y)

arith(3, 4, func=lambda x, y: x + y)
arith(10, 20, func=lambda x, y: x * y)