PHpullh
학습 라이브러리/Python/데코레이터 체이닝

PYTHON · 함수

데코레이터 체이닝

여러 데코레이터를 조합하여 함수에 다중 관심사를 분리 적용합니다. 실행 순서를 이해하는 것이 핵심입니다.

함수고급decorator체이닝chaining관심사 분리

핵심 설명

여러 데코레이터를 조합하여 함수에 다중 관심사를 분리 적용합니다. 실행 순서를 이해하는 것이 핵심입니다.

Python code

import functools, time

def log_call(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        print(f"[LOG] {func.__name__} 호출")
        return func(*args, **kwargs)
    return wrapper

def timer(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        start = time.perf_counter()
        result = func(*args, **kwargs)
        elapsed = time.perf_counter() - start
        print(f"[TIME] {func.__name__}: {elapsed:.4f}초")
        return result
    return wrapper

def validate_positive(func):
    @functools.wraps(func)
    def wrapper(n, *args, **kwargs):
        if n < 0:
            raise ValueError(f"양수가 필요합니다: {n}")
        return func(n, *args, **kwargs)
    return wrapper

# 아래→위 순서로 감싸짐, 위→아래 순서로 실행
@log_call          # 3. 가장 바깥
@timer             # 2. 중간
@validate_positive # 1. 가장 안쪽
def factorial(n):
    return 1 if n <= 1 else n * factorial(n - 1)

print(factorial(10))

학습 팁

데코레이터는 아래에서 위로 적용되고, 호출 시에는 위에서 아래로 실행됩니다.

주의할 점

데코레이터 순서를 바꾸면 동작이 달라집니다. 예를 들어 @timer@log_call 위에 두면 로깅 시간도 포함됩니다.

자주 묻는 질문

데코레이터 체이닝란 무엇인가요?

여러 데코레이터를 조합하여 함수에 다중 관심사를 분리 적용합니다. 실행 순서를 이해하는 것이 핵심입니다.

데코레이터 체이닝 학습 시 주의할 점은 무엇인가요?

데코레이터 순서를 바꾸면 동작이 달라집니다. 예를 들어 @timer 를 @log_call 위에 두면 로깅 시간도 포함됩니다.