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 위에 두면 로깅 시간도 포함됩니다.
Continue Learning
Python 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.