En Python, los decoradores se convirtieron en parte del lenguaje a partir de la versión 2.4, proporcionando la posibilidad de modificar el comportamiento de funciones y clases. Los decoradores para parámetros de funciones son un patrón más complejo que se implementa manualmente, ya que no hay soporte sintáctico directo para tales decoradores en el lenguaje. Sin embargo, a través de anotaciones y metaprogramación se puede implementar su funcionalidad.
Los decoradores comunes afectan a toda la función o método. A veces, es necesario validar, registrar o cambiar solo ciertos parámetros de la función a un nivel de abstracción determinado. Por ejemplo, verificar el tipo de argumento, transformar el valor del parámetro o imponer restricciones sobre la entrada.
Los decoradores de parámetros de funciones se crean como metadatos (por ejemplo, a través de anotaciones de tipos) y se procesan en un decorador envolvente externo. La esencia del patrón es conservar la información necesaria sobre los parámetros, y luego el decorador "funcional" la utiliza para procesar los valores al llamar a la función.
Ejemplo de código:
import inspect from functools import wraps def positive_param(fn): """Anotación para la verificación obligatoria de la positividad del argumento.""" fn._positive = True return fn # Decorador externo completo 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"El argumento {name} debe ser positivo") return func(*args, **kwargs) return wrapper @validate_decorator def deposit(amount: positive_param): print(f"Depositado {amount}") deposit(10) # OK deposit(-5) # ValueError
Características clave:
¿En qué se diferencian los decoradores de parámetros de los decoradores de funciones estándar?
Un decorador estándar envuelve toda la función, independientemente de los parámetros. Un decorador de parámetro se enfoca en un argumento específico y se aplica solo a él, lo que requiere técnicas no estándar de procesamiento y análisis de la firma.
¿Pueden los decoradores de parámetros implementarse a través de la sintaxis @ en Python, como se hace en TypeScript o C#?
No, en Python la sintaxis de decoradores a través de @ se aplica solo a funciones y clases, no a parámetros individuales de funciones. Para parámetros se utilizan anotaciones y luego se procesan al envolver la función.
¿Se pueden aplicar automáticamente decoradores a los parámetros de los argumentos de una función sin una anotación explícita?
No, Python no aplica decoradores a los parámetros automáticamente, pero es posible implementar un mecanismo propio, por ejemplo, mediante una fábrica de decoradores personalizada que analice la firma de la función y reemplace los valores de los parámetros al invocarla.
Un desarrollador está convencido de que se puede usar @ en el parámetro, como en otros lenguajes, y escribe:
def f(@validate_positive x): ...
Ventajas:
Desventajas:
El desarrollador usa anotaciones y un decorador externo, como en el ejemplo anterior, y procesa los parámetros a través de la firma y anotaciones:
Ventajas:
Desventajas: