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.
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)Calling multiply with args: (5, 4)
multiply returned: 20Implementació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
Domina las funciones de Python. Aprenda a escribir código reutilizable usando def, definir argumentos, valores de retorno y comprender el alcance a nivel local y global.
Administradores de contexto de PythonAprenda a escribir administradores de contexto personalizados en Python. Domine el decorador de contextmanager y los métodos __enter__/__exit__ para la seguridad de los recursos.
Recursos recomendados de Python
Amplíe sus conocimientos con tutoriales interactivos relacionados, hojas de trucos y comparaciones de códigos.
Cómo ordenar una lista en Python
Aprenda a ordenar una lista en Python usando el método sort() y la función sorted(). Descubra ejemplos de ordenación inversa y clasificación de claves personalizadas.
Hoja de trucos sobre métodos de cadenas de Python
Una guía de referencia completa para la manipulación de cadenas de Python. Domine el formateo, la búsqueda, la división, el reemplazo y la verificación de las propiedades de las cadenas.
Python vs JavaScript: ¿Qué lenguaje de programación es mejor?
Una comparación completa entre Python y JavaScript. Explore las diferencias de sintaxis, el rendimiento, los casos de uso (backend frente a frontend) y ejemplos de codificación.