Guía Completa sobre Decoradores en Python

Los decoradores en Python son una característica poderosa y versátil que permite modificar el comportamiento de las funciones o métodos. En este artículo, exploraremos qué son los decoradores, su sintaxis y cómo crearlos para optimizar tus programas en Python.

¿Qué son los Decoradores?

Un decorador es una función que toma otra función como argumento y extiende o modifica su comportamiento sin cambiar su código original. La idea es proporcionar una interfaz para “decorar” la función, agregarle funcionalidades adicionales antes de ejecutarla.

Los decoradores son ampliamente utilizados en Python para implementar funcionalidades como el registro de eventos, la autenticación y la autorización, además de ser comúnmente utilizados en frameworks como Flask y Django.

Sintaxis de los Decoradores

La sintaxis básica de un decorador es:

def decorador(func):
    def envoltura(*args, **kwargs):
        # Código que se ejecuta antes de llamar a func
        resultado = func(*args, **kwargs)
        # Código que se ejecuta después de llamar a func
        return resultado
    return envoltura

Para aplicar un decorador a una función, se utiliza el símbolo @ seguido del nombre del decorador:

@decorador
def funcion_a_decorar():
    pass

Ejemplo Básico

Veamos un ejemplo sencillo de un decorador que imprime un mensaje antes y después de la ejecución de una función.

def mi_decorador(func):
    def envoltura():
        print("Antes de ejecutar la función")
        func()
        print("Después de ejecutar la función")
    return envoltura

@mi_decorador
def say_hello():
    print("¡Hola, mundo!")

# Llamada a la función decorada
say_hello()

Salida:

Antes de ejecutar la función
¡Hola, mundo!
Después de ejecutar la función

Decoradores con Argumentos

Los decoradores también pueden aceptar argumentos, lo que les permite ser más flexibles. Aquí hay un ejemplo de un decorador que recibe un argumento para personalizar los mensajes.

def decorador_con_argumento(mensaje):
    def envoltura(func):
        def funcion_decorada(*args, **kwargs):
            print(mensaje)
            return func(*args, **kwargs)
        return funcion_decorada
    return envoltura

@decorador_con_argumento("Ejecutando la función...")
def mi_funcion():
    print("¡Función ejecutada!")

mi_funcion()

Salida:

Ejecutando la función...
¡Función ejecutada!

Usos Comunes de los Decoradores

  1. Medición del tiempo de ejecución: Puedes crear un decorador que mida cuánto tiempo tarda en ejecutarse una función.
import time

def tiempo_de_ejecucion(func):
    def envoltura(*args, **kwargs):
        inicio = time.time()
        resultado = func(*args, **kwargs)
        fin = time.time()
        print(f"La función {func.__name__} tardó {fin - inicio:.4f} segundos en ejecutarse.")
        return resultado
    return envoltura
  1. Autenticación de usuarios: En aplicaciones web, los decoradores pueden controlar el acceso a ciertas funciones según el estado de autenticación del usuario.

  2. Registro de actividad: Implementar un decorador que registre la actividad, como qué funciones se están llamando y cuándo.

Conclusión

Los decoradores en Python son una herramienta poderosa y fácil de usar que permite modificar el comportamiento de las funciones de manera limpia y sencilla. Con la comprensión de cómo funcionan y cómo crearlos, puedes aprovechar esta funcionalidad para escribir código más legible y mantener la lógica de negocio separada.

Recuerda siempre considerar el uso de decoradores en tu código para mejorar la organización y facilitar su mantenimiento en el futuro. ¡Experimenta y descubre todas las posibilidades que los decoradores pueden ofrecer en tu programación diaria!

Si te ha gustado este artículo, ¡no dudes en compartirlo y dejar tus comentarios!