Contenidos
- ¿Qué son los decoradores y por qué importan?
- Entendiendo la base: funciones como objetos
- Tu primer decorador paso a paso
- El problema real: evitar duplicación de código
- Decorador para logging reutilizable
- Importante: conservar metadatos con functools.wraps
- Validación de argumentos con decoradores
- Decoradores con parámetros
- Combinando decoradores
- Casos reales donde usar decoradores
- Errores comunes al usar decoradores
- Cuándo NO usar decoradores
- Buenas prácticas clave
- Conclusión
- Aprende sobre Lenguajes de Programación con la Ruta de Frogames Formación
- Preguntas Frecuentes
Si llevas un tiempo programando en Python, probablemente ya hayas oído hablar de los decoradores. Puede que incluso los hayas usado… o que los hayas evitado porque te parecían confusos. Es normal. A primera vista, los decoradores en Python pueden parecer magia negra.
Pero cuando entiendes cómo funcionan, se convierten en una de las herramientas más potentes para escribir código limpio, reutilizable y fácil de mantener. En este artículo vamos a ver cómo sacarles partido de verdad, especialmente para dos casos muy prácticos: logging y validación.
¿Qué son los decoradores y por qué importan?
Un decorador es, en esencia, una función que envuelve otra función para añadirle comportamiento sin modificar su código original.
Dicho de otra forma: puedes “inyectar” lógica extra (como logs, validaciones o control de errores) sin tocar la función principal.
Este patrón es clave si quieres:
- Evitar duplicar código
- Mantener funciones limpias
- Separar responsabilidades
Cuando empiezas a dominar los Decoradores en Python, tu forma de estructurar el código cambia por completo.
Entendiendo la base: funciones como objetos
Para entender los decoradores, primero necesitas recordar algo fundamental: en Python, las funciones son objetos.
Esto significa que puedes:
- Pasarlas como argumento
- Devolverlas desde otra función
- Asignarlas a variables
Ejemplo:
def saludar():
return "Hola"
def ejecutar(func):
return func()
print(ejecutar(saludar))
Este concepto es la base sobre la que se construyen los Decoradores en Python.
Tu primer decorador paso a paso
Vamos a crear un decorador sencillo:
def mi_decorador(func):
def wrapper():
print("Antes de ejecutar la función")
func()
print("Después de ejecutar la función")
return wrapper
Y lo aplicamos:
@mi_decorador
def decir_hola():
print("Hola")
decir_hola()
Esto imprimirá:
Antes de ejecutar la función
Hola
Después de ejecutar la función
Ya estás usando uno de los patrones más importantes de los Decoradores en Python.
El problema real: evitar duplicación de código
Imagina que tienes varias funciones y quieres añadir logging:
def funcion1():
print("Ejecutando función 1")
def funcion2():
print("Ejecutando función 2")
Sin decoradores, acabarías haciendo algo así:
def funcion1():
print("Inicio log")
print("Ejecutando función 1")
print("Fin log")
Esto escala fatal.
Aquí es donde los Decoradores en Python brillan de verdad.
Decorador para logging reutilizable
Vamos a crear un decorador útil de verdad:
def log_decorador(func):
def wrapper(*args, **kwargs):
print(f"Iniciando {func.__name__}")
resultado = func(*args, **kwargs)
print(f"Finalizando {func.__name__}")
return resultado
return wrapper
Uso:
@log_decorador
def sumar(a, b):
return a + b
Ventajas:
- No ensucias la función
- Reutilizas lógica
- Centralizas el comportamiento
Este es uno de los usos más comunes de los Decoradores en Python en entornos profesionales.
Importante: conservar metadatos con functools.wraps
Si inspeccionas la función decorada:
print(sumar.__name__)
Verás que aparece wrapper, no sumar.
Para solucionarlo:
from functools import wraps
def log_decorador(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(f"Iniciando {func.__name__}")
return func(*args, **kwargs)
return wrapper
Esto es una buena práctica esencial cuando trabajas con Decoradores en Python.
Validación de argumentos con decoradores
Otro caso muy potente: validar datos antes de ejecutar la función.
Ejemplo:
def validar_no_vacio(func):
def wrapper(*args, **kwargs):
if not args:
raise ValueError("No se han pasado argumentos")
return func(*args, **kwargs)
return wrapper
Uso:
@validar_no_vacio
def procesar(nombre):
print(f"Procesando {nombre}")
Este tipo de validaciones son ideales para:
- APIs
- Formularios
- Procesamiento de datos
Los Decoradores en Python permiten aplicar estas reglas de forma consistente.
Decoradores con parámetros
A veces necesitas configurar el decorador:
def log_nivel(nivel):
def decorador(func):
def wrapper(*args, **kwargs):
print(f"[{nivel}] Ejecutando {func.__name__}")
return func(*args, **kwargs)
return wrapper
return decorador
Uso:
@log_nivel("INFO")
def mi_funcion():
pass
Esto añade flexibilidad y hace que los Decoradores en Python sean aún más potentes.
Combinando decoradores
Puedes usar varios decoradores a la vez:
@log_decorador
@validar_no_vacio
def guardar_dato(dato):
print("Guardando...")
Orden importante:
- Se aplican de abajo hacia arriba
Esto permite construir pipelines de comportamiento sin complicar la función principal.
Casos reales donde usar decoradores
1. Logging en producción
Registrar entradas, salidas y errores.
2. Validación de datos
Evitar inputs inválidos antes de ejecutar lógica.
3. Control de acceso
Verificar permisos antes de ejecutar funciones.
4. Medición de rendimiento
import time
def medir_tiempo(func):
def wrapper(*args, **kwargs):
inicio = time.time()
resultado = func(*args, **kwargs)
fin = time.time()
print(f"Tardó {fin - inicio} segundos")
return resultado
return wrapper
Los Decoradores en Python son especialmente útiles en este tipo de escenarios transversales.
Errores comunes al usar decoradores
1. Olvidar *args y **kwargs
Limita la reutilización.
2. No devolver el resultado
Rompe la función original.
3. No usar wraps
Pierdes información de la función.
4. Sobrecargar la lógica
Un decorador debe ser simple y claro.
Cuándo NO usar decoradores
Aunque son muy útiles, no siempre son la mejor opción.
Evítalos cuando:
- La lógica es demasiado compleja
- Dificultan la lectura
- Solo se usan una vez
A veces, una función normal es más clara.
Buenas prácticas clave
Para trabajar bien con Decoradores en Python, ten en cuenta:
- Mantén los decoradores pequeños y específicos
- Usa nombres claros (
log_decorador,validar_usuario) - Documenta qué hacen
- Evita lógica innecesaria
- Testea los decoradores por separado
Conclusión
Los decoradores no son solo una curiosidad del lenguaje: son una herramienta clave para escribir código profesional en Python.
Te permiten separar responsabilidades, reducir duplicación y añadir comportamiento de forma elegante. Especialmente en tareas como logging y validación, marcan una gran diferencia en la calidad del código.
Si hasta ahora los evitabas, es el momento de darles una oportunidad. Empieza por casos simples, como los que has visto aquí, y poco a poco verás cómo los Decoradores en Python se convierten en una parte natural de tu forma de programar.
Cuando los dominas, no solo escribes menos código: escribes mejor código.
Aprende sobre Lenguajes de Programación con la Ruta de Frogames Formación
Si te ha interesado lo que has leído en este post, te encantará saber que puedes profundizar en este tema y en todas las competencias esenciales de los Lenguajes de Programación a través de la Ruta de Aprendizaje de Frogames Formación.
Esta ruta ha sido creada para quienes desean adentrarse desde cero en el mundo de la programación y avanzar paso a paso hasta dominar los lenguajes, herramientas y técnicas que utilizan los profesionales del sector. Aprenderás de forma práctica y progresiva a escribir, estructurar y optimizar código capaz de resolver problemas reales.
A lo largo del recorrido, explorarás conceptos fundamentales como la lógica de programación, las estructuras de datos, la programación orientada a objetos y el desarrollo de algoritmos. También trabajarás con lenguajes clave como Python, JavaScript, Java o Swift, siempre aplicados a proyectos prácticos.
Cada módulo está diseñado para que pongas en práctica lo aprendido mediante ejercicios y proyectos reales, construyendo paso a paso un portafolio que demuestre tu capacidad para desarrollar soluciones eficientes, optimizadas y listas para el mundo profesional.
Si quieres aprender a programar, resolver problemas mediante código y comprender cómo funcionan los lenguajes que impulsan la tecnología actual, la Ruta de Lenguajes de Programación de Frogames Formación es justo lo que necesitas.
¡Da el primer paso hacia una de las profesiones más demandadas, innovadoras y con mayor proyección del futuro!
¡Nos vemos en clase!
Preguntas Frecuentes
¿Qué son los decoradores en Python?
Son funciones que envuelven otras funciones para añadir comportamiento sin modificar su código original.
¿Para qué sirven los decoradores en Python?
Sirven para reutilizar lógica como logging, validación, control de acceso o medición de rendimiento sin duplicar código.
¿Por qué usar functools.wraps en un decorador?
Para conservar el nombre y los metadatos de la función original.
¿Se pueden pasar parámetros a un decorador?
Sí, usando una función adicional que actúa como fábrica de decoradores.
¿Cuándo no es recomendable usar decoradores?
Cuando la lógica es demasiado compleja, dificulta la lectura o solo se va a usar una vez.