Contenido del curso

Fundamentos de Programación y Python

Programación Orientada a Objetos en Python

Decoradores anidados con parámetros en Python

Resumen

Aplicar varios decoradores a una misma función y pasarles parámetros es una técnica que vas a usar en proyectos reales de Python cuando necesites combinar validaciones, registros y permisos sin ensuciar tu lógica principal. Aquí aprendes cómo encadenar decoradores anidados y decoradores con parámetros para escribir código modular y reutilizable.

¿Qué son los decoradores anidados y con parámetros?

Los decoradores son funciones que envuelven a otras funciones para extender su comportamiento sin modificar su código original. Cuando los combinas, ganas flexibilidad real.

¿Qué es un decorador anidado? Es la aplicación de dos o más decoradores sobre la misma función. Cada uno añade una capa de funcionalidad y se ejecutan en orden, de arriba hacia abajo en la pila de decoradores.

¿Qué es un decorador con parámetros? Es un decorador que recibe argumentos extra para tomar decisiones dinámicas, como validar un rol o configurar un comportamiento específico.

Esta combinación te permite, por ejemplo, validar permisos y registrar acciones en una sola función sin repetir código.

¿Cómo construir un decorador con parámetros paso a paso?

El ejemplo de la clase simula una acción donde un empleado intenta eliminar a otro, pero solo los administradores tienen permiso. Para resolverlo necesitas tres niveles de funciones anidadas [01:30].

La estructura del decorador checkAccess sigue este patrón:

  • La función externa recibe el parámetro, en este caso el rol requerido.
  • La función intermedia recibe la función original que será decorada.
  • La función wrapper recibe los argumentos reales, como la información del empleado, y ejecuta la lógica de validación.

python def check_access(rol): # Decorador que comprueba si un empleado tiene un rol específico def decorador(func): def wrapper(empleado): # Comprobamos si el rol del empleado coincide con el rol requerido if empleado["rol"] == rol: return func(empleado) else: print(f"Acceso denegado. Solo {rol} pueden realizar esta acción.") return wrapper return decorador

Fíjate que se retornan tres cosas: la función original cuando se cumple la condición, el wrapper dentro del decorador y el decorador dentro de la función externa. Ese triple return es lo que hace posible pasar parámetros [02:50].

¿Cómo añadir un segundo decorador para registrar la acción?

El segundo decorador, logAction, no necesita parámetros externos. Solo registra la acción antes de ejecutar la función original.

python def log_action(func): def wrapper(empleado): print(f"Registrando acción para el empleado {empleado['nombre']}") return func(empleado) return wrapper

En un proyecto real, aquí escribirías en una base de datos o archivo de logs. La clase usa un print para enfocarse en la mecánica del decorador [05:10].

¿Cómo aplicar dos decoradores a la misma función?

El orden de aplicación importa. Cuando apilas decoradores, el de arriba envuelve al de abajo. Por eso debes pensar en el flujo lógico antes de escribir el código.

python @check_access("admin") @log_action def eliminar_empleado(empleado): print(f"El empleado {empleado['nombre']} ha sido eliminado")

Al ejecutar eliminar_empleado con un usuario admin, primero se valida el rol, luego se registra la acción y finalmente se elimina al empleado. Si pasas un usuario con rol empleado, el flujo se corta en la validación y nunca llega al registro ni a la eliminación [06:20].

¿Por qué importa el orden de los decoradores? El primer decorador en aparecer es el más externo y controla qué tanto del flujo se ejecuta. Si checkAccess va arriba, ninguna acción se registra cuando el acceso es denegado.

¿Qué resultados obtienes al ejecutar el código?

Los dos escenarios del ejemplo dejan claro el comportamiento:

  • Con un administrador: se imprime "Registrando acción para el empleado Carlos" y luego "El empleado Carlos ha sido eliminado".
  • Con un empleado regular: se imprime "Acceso denegado. Solo admin pueden realizar esta acción" y el flujo termina ahí.

Este comportamiento confirma que los decoradores anidados se ejecutan en cadena, pero respetan las condiciones de cada capa.

¿Cuándo usar decoradores anidados en proyectos reales?

Esta técnica brilla cuando necesitas separar responsabilidades y mantener tu código principal limpio. Algunos casos típicos donde la vas a aplicar:

  • Validación de permisos y roles antes de ejecutar acciones sensibles.
  • Registro de auditoría o logs de operaciones críticas.
  • Medición de tiempos de ejecución combinada con manejo de errores.
  • Caché de resultados junto con autenticación de usuarios.

Dominar decoradores con parámetros y decoradores anidados te da control sobre el flujo de ejecución sin acoplar lógica transversal a cada función. Es una de esas habilidades que diferencian código junior de código senior.

¿Ya pensaste en qué parte de tu proyecto actual podrías aplicar esta técnica? Cuéntame en los comentarios cómo combinarías dos decoradores para resolver un problema real.