Conceptos básicos de los decoradores
¿Qué son los decoradores?
Los decoradores son una poderosa característica de Python que te permite modificar o mejorar funciones y métodos sin cambiar directamente su código fuente. Proporcionan una forma limpia y reutilizable de extender la funcionalidad.
Estructura básica de un decorador
def my_decorator(func):
def wrapper(*args, **kwargs):
## Code before function execution
result = func(*args, **kwargs)
## Code after function execution
return result
return wrapper
@my_decorator
def example_function():
pass
Visualización del flujo de un decorador
graph TD
A[Original Function] --> B[Decorator Wrapper]
B --> C{Pre-processing}
C --> D[Original Function Call]
D --> E{Post-processing}
E --> F[Return Result]
Tipos de decoradores
Tipo de decorador |
Descripción |
Caso de uso |
Decoradores de función |
Modifican el comportamiento de una función |
Registro (logging), medición de tiempo, autenticación |
Decoradores de clase |
Modifican el comportamiento de una clase |
Patrón singleton, caché |
Decoradores de método |
Mejoran la funcionalidad de un método |
Validación, control de acceso |
Técnicas avanzadas de decoradores
Decoradores parametrizados
def repeat(times):
def decorator(func):
def wrapper(*args, **kwargs):
for _ in range(times):
result = func(*args, **kwargs)
return result
return wrapper
return decorator
@repeat(times=3)
def greet(name):
print(f"Hello, {name}!")
import functools
def my_decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
"""Wrapper function documentation"""
return func(*args, **kwargs)
return wrapper
Decoradores específicos para corutinas
Los decoradores pueden ser especialmente poderosos con corutinas:
import asyncio
import time
def timer_decorator(func):
async def wrapper(*args, **kwargs):
start = time.time()
result = await func(*args, **kwargs)
end = time.time()
print(f"Execution time: {end - start} seconds")
return result
return wrapper
@timer_decorator
async def async_operation():
await asyncio.sleep(1)
return "Operation completed"
Patrones comunes de decoradores
Patrón |
Descripción |
Ejemplo |
Registro (Logging) |
Realiza un seguimiento de las llamadas a funciones |
Registrar entrada/salida de un método |
Caché |
Almacena los resultados de una función |
Memoización |
Autenticación |
Controla el acceso |
Comprobaciones de permisos de usuario |
Reintentos |
Implementa lógica de reintento |
Manejar fallos transitorios |
Mejores prácticas
- Mantén los decoradores simples y enfocados.
- Utiliza
functools.wraps
para preservar los metadatos de la función.
- Evita la lógica compleja en los decoradores.
- Considera las implicaciones de rendimiento.
Consideraciones de rendimiento
Los decoradores añaden una pequeña sobrecarga debido al envoltorio de la función. En código crítico para el rendimiento, utilízalos con moderación.
Al dominar los decoradores, los desarrolladores pueden escribir código más modular y mantenible, una habilidad muy valorada en los entornos de programación avanzados de LabEx.