Python de Cero a Experto / Python avanzado
Decoradores desde cero
Los DECORADORES tienen fama de misteriosos, pero la idea es simple y poderosa: una función que ENVUELVE otra
para agregarle comportamiento —cronometrarla, cachear su resultado, validar sus argumentos, registrar cada
llamada— SIN tocar su código. El @decorador que ves antes de tantas funciones (@property,
@dataclass, @app.route) es esto. Y como las funciones son valores (módulo 3), los construirás desde
cero. Hoy desmitificas los decoradores.
El envoltorio con superpoderes
Un decorador desde cero
Un decorador es una función que RECIBE una función y DEVUELVE una nueva que la envuelve:
El decorador con_cronometro recibe una función func y devuelve una nueva función envoltura que:
ejecuta código ANTES (marca el inicio), llama a la original (func(*args, **kwargs)), ejecuta código
DESPUÉS (mide el tiempo), y devuelve el resultado. La sintaxis @con_cronometro encima de una función es
azúcar para sumar_muchos = con_cronometro(sumar_muchos) —reemplaza la función por su versión envuelta—. El
*args, **kwargs en la envoltura hace que el decorador funcione con CUALQUIER función, sin importar sus
argumentos.
functools.wraps y decoradores útiles
¿Qué es un decorador y qué hace la sintaxis @decorador sobre una función?
Mini-reto
Construye decoradores para Mi Bolsillo: 1) un decorador registrar que imprima "Llamando a <nombre>"
antes de ejecutar la función y "Terminó" después (usa *args, **kwargs y func.__name__); 2) aplícalo
con @registrar a una función calcular_total(gastos); 3) usa @wraps para conservar el nombre de la
función y verifícalo con .__name__. Bonus: un decorador validar_positivo que lance ValueError si el
primer argumento es negativo antes de llamar a la función.
Qué sigue
Ya dominas los decoradores. La próxima lección moderniza algo que ya conoces: el TYPING de Python —las
anotaciones de tipo modernas (list[str], dict | None, Optional, TypedDict)—, que traen a Python
mucho de lo que aprendiste en TypeScript. Código más seguro y autodocumentado.