Intermediopython
Decoradores y Funciones de Orden Superior
Aprende a extender y modificar el comportamiento de funciones y métodos usando decoradores en Python.
Funciones como ciudadanos de primera clase
En Python, las funciones pueden asignarse a variables, pasarse como argumentos y devolverse desde otras funciones. Un decorador es simplemente una función que recibe otra función como argumento y devuelve una versión mejorada de ella.
python
1def mi_decorador(func):
2 def wrapper(*args, **kwargs):
3 print("Antes de ejecutar la función...")
4 resultado = func(*args, **kwargs)
5 print("Después de ejecutar la función...")
6 return resultado
7 return wrapper
8
9@mi_decorador
10def saludar(nombre):
11 print(f"Hola, {nombre}!")
12
13saludar("Carlos")Preservar metadatos con functools.wraps
Al envolver una función, se pierde su nombre original (
__name__) y su docstring (__doc__). La solución profesional es usar el decorador @wraps del módulo estándar functools.python
1from functools import wraps
2import time
3
4def medir_tiempo(func):
5 @wraps(func)
6 def wrapper(*args, **kwargs):
7 inicio = time.time()
8 res = func(*args, **kwargs)
9 fin = time.time()
10 print(f"[{func.__name__}] tardó {fin - inicio:.4f}s")
11 return res
12 return wrapper
13
14@medir_tiempo
15def calculo_pesado():
16 """Realiza un cálculo intensivo."""
17 return sum(i * i for i in range(1_000_000))
18
19calculo_pesado()
20print(calculo_pesado.__name__) # Imprime "calculo_pesado", no "wrapper"