¿Cómo funcionan los decorators? Escribe un decorator que registre cuánto tarda una función.
Respuesta
- Las funciones son objetos: puedes pasarlas y devolverlas.
@deco encima de def f significa f = deco(f).- El decorator devuelve un wrapper que ejecuta código antes o después de llamar a la original.
- Usa
functools.wraps para conservar el nombre original y el docstring. - Con argumentos añades un nivel de factory:
@retry(3) significa f = retry(3)(f).
import functools, time
def timed(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = time.perf_counter()
try:
return func(*args, **kwargs)
finally:
ms = (time.perf_counter() - start) * 1000
print(f"{func.__name__} took {ms:.1f} ms")
return wrapper
Practica esta pregunta en Repaso