Decoradores de Python: funciones de ajuste y modificación

Aprenda decoradores de Python para modificar dinámicamente el comportamiento de las funciones. Comprender las funciones contenedoras, la sintaxis @ y el manejo de argumentos en decoradores.

Pruébelo en el editor

Descripción general

Los decoradores son uno de los patrones de diseño más elegantes y poderosos de Python. Permiten a los desarrolladores modificar o ampliar el comportamiento de una función, método o clase sin cambiar permanentemente su código fuente. Piense en un decorador como si envolviera una función dentro de otra función para ejecutar pasos previos y posteriores al procesamiento. Esto hace que los decoradores sean perfectos para implementar cuestiones transversales como el registro, la sincronización, la validación o el control de acceso.

En esencia, los decoradores trabajan porque las funciones de Python son ciudadanos de primera clase. Esto significa que las funciones pueden pasarse como argumentos a otras funciones, devolverse desde funciones y asignarse a variables. Un decorador es simplemente una función que toma otra función como argumento, define una función contenedora anidada que ejecuta la función original junto con algo de lógica adicional y devuelve esta función contenedora para reemplazar la original.

Para que la aplicación de decoradores sea simple y limpia, Python proporciona el azúcar sintáctico `@decorator_name`, colocado inmediatamente encima de la definición de la función de destino. Al llamar a la función decorada, Python invoca el contenedor. Si la función acepta parámetros, el contenedor debe aceptar argumentos arbitrarios (`*args` y `**kwargs`) y reenviarlos correctamente. Comprender a los decoradores le permite escribir código altamente modular, limpio y SECO (No se repita).

Código y salida de ejecución

Un decorador personalizado que rastrea y registra los detalles de ejecución de funciones.

def call_tracker(func):
    """Decorator that tracks and logs function execution details."""
    def wrapper(*args, **kwargs):
        print(f"Calling {func.__name__} with args: {args}")
        result = func(*args, **kwargs)
        print(f"{func.__name__} returned: {result}")
        return result
    return wrapper

@call_tracker
def multiply(a, b):
    return a * b

# Calling the decorated function
result = multiply(5, 4)
Salida terminal
Calling multiply with args: (5, 4)
multiply returned: 20

Implementación paso a paso

  • Registro de métricas de tiempo de ejecución en monitores de rendimiento
  • Hacer cumplir las comprobaciones de autenticación y autorización en las rutas
  • Almacenamiento en caché o memorización de costosos resultados computacionales

Preguntas frecuentes

¿Cómo manejan los decoradores los argumentos?

Utilizando *args y **kwargs en la función contenedora anidada, lo que le permite recibir y reenviar cualquier parámetro posicional o de palabra clave a la función empaquetada.

¿Puedes aplicar varios decoradores a una función?

Sí, puedes apilarlos. Se ejecutarán en orden de arriba hacia abajo (envoltura más interna a más externa).

Temas relacionados

Recursos recomendados de Python

Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.