PHpullh
학습 라이브러리/Python/데코레이터 심화 (파라미터)

PYTHON · 함수

데코레이터 심화 (파라미터)

인자를 받는 데코레이터는 3단 중첩 함수로 구현합니다. 실행 횟수 제한, 권한 검사 등에 활용됩니다.

함수고급decorator데코레이터wraps파라미터

핵심 설명

인자를 받는 데코레이터는 3단 중첩 함수로 구현합니다. 실행 횟수 제한, 권한 검사 등에 활용됩니다.

Python code

import functools
from typing import Callable, Any

def retry(max_attempts: int = 3, delay: float = 1.0):
    """재시도 데코레이터 (파라미터 포함)"""
    def decorator(func: Callable) -> Callable:
        @functools.wraps(func)
        def wrapper(*args: Any, **kwargs: Any) -> Any:
            last_exc = None
            for attempt in range(1, max_attempts + 1):
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    last_exc = e
                    print(f"시도 {attempt}/{max_attempts} 실패: {e}")
            raise last_exc
        return wrapper
    return decorator

@retry(max_attempts=3, delay=0.5)
def unstable_api():
    import random
    if random.random() < 0.7:
        raise ConnectionError("서버 응답 없음")
    return "성공!"

try:
    result = unstable_api()
    print(result)
except ConnectionError as e:
    print(f"최종 실패: {e}")

학습 팁

@functools.wraps(func)를 반드시 사용하세요. 원본 함수의 이름, 독스트링 등 메타데이터를 보존합니다.

주의할 점

파라미터 있는 데코레이터에서 괄호를 빼먹으면 (@retry vs @retry()) 함수 자체가 첫 번째 인자로 전달됩니다.

자주 묻는 질문

데코레이터 심화 (파라미터)란 무엇인가요?

인자를 받는 데코레이터는 3단 중첩 함수로 구현합니다. 실행 횟수 제한, 권한 검사 등에 활용됩니다.

데코레이터 심화 (파라미터) 학습 시 주의할 점은 무엇인가요?

파라미터 있는 데코레이터에서 괄호를 빼먹으면 ( @retry vs @retry() ) 함수 자체가 첫 번째 인자로 전달됩니다.