Python에서 데코레이터는 2.4 버전부터 언어의 일부가 되어 함수와 클래스의 동작을 수정할 수 있게 해주었습니다. 파라미터 데코레이터는 언어에서 직접적인 구문 지원이 없기 때문에 수동으로 구현해야 하는 더 복잡한 패턴입니다. 그러나 주석과 메타 프로그래밍을 통해 그 기능성을 구현할 수 있습니다.
일반적인 데코레이터는 전체 함수나 메소드에 영향을 미칩니다. 때때로 특정 추상화 레벨에서 함수의 개별 파라미터를 검증하거나, 로깅하거나, 수정해야 할 필요가 있습니다. 예를 들어, 인자의 타입을 확인하거나 파라미터 값을 변환하거나 입력에 대한 제한을 설정하는 것입니다.
파라미터 데코레이터는 메타데이터(예: 타입 주석)를 통해 생성되며 외부 래핑 데코레이터에서 처리됩니다. 패턴의 본질은 파라미터에 대한 필요한 정보를 저장한 다음, "함수" 데코레이터가 이를 사용하여 함수 호출 시 값을 처리하는 것입니다.
코드 예:
import inspect from functools import wraps def positive_param(fn): """인자의 양수 여부를 강제하기 위한 주석입니다.""" fn._positive = True return fn # 외부 완전한 데코레이터 def validate_decorator(func): spec = inspect.getfullargspec(func) @wraps(func) def wrapper(*args, **kwargs): bound_args = inspect.signature(func).bind(*args, **kwargs) for name, value in bound_args.arguments.items(): param = func.__annotations__.get(name, None) if getattr(param, '_positive', False) and value <= 0: raise ValueError(f"Argument {name} must be positive") return func(*args, **kwargs) return wrapper @validate_decorator def deposit(amount: positive_param): print(f"Deposited {amount}") deposit(10) # OK deposit(-5) # ValueError
주요 특징:
파라미터 데코레이터는 일반 함수 데코레이터와 어떻게 다른가요?
일반 데코레이터는 모든 함수를 래핑하지만, 파라미터 데코레이터는 특정 인자에 중점을 두고 오직 그 인자에게만 적용되며, 이는 구문 분석 및 처리 기술에서 비정상적인 기술이 필요합니다.
Python의 @ 구문을 사용하여 파라미터 데코레이터를 구현할 수 있나요? TypeScript나 C#처럼요?
아니요, Python에서 @ 구문은 함수 및 클래스에만 적용되며, 함수의 개별 파라미터에는 적용되지 않습니다. 파라미터에 대해서는 주석을 사용하고, 이후 함수 래핑 시 주석 처리를 진행합니다.
명시적 주석 없이도 함수 인자 파라미터에 데코레이터를 자동으로 적용할 수 있나요?
아니요, Python은 파라미터에 데코레이터를 자동으로 적용하지 않지만, 함수의 시그니처를 분석하고 호출 시 파라미터 값을 대체하는 사용자 데코레이터 팩토리를 통해 자체 메커니즘을 구현할 수 있습니다.
개발자는 다른 언어처럼 @를 파라미터에 사용할 수 있다고 확신하고 작성합니다:
def f(@validate_positive x): ...
장점:
단점:
개발자는 위 예시처럼 주석을 사용하고 외부 데코레이터를 사용하여 시그니처와 주석을 통해 파라미터를 처리합니다:
장점:
단점: