CodeForge

Python de Cero a Experto / Python avanzado

Decoradores desde cero

Teoría24 min20 XP

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.