wordpress

Decorators with Parameters in Python: A Guide to Customizable Settings

Python es un lenguaje de programación versátil y poderoso que ofrece muchas características avanzadas para facilitar el desarrollo de software. Una de estas características son los decoradores, que permiten modificar o extender el comportamiento de una función o clase sin modificar su implementación original. En este artículo, nos centraremos en los decoradores con parámetros, que nos permiten personalizar aún más el comportamiento de los decoradores.

¿Qué son los decoradores en Python?

Antes de profundizar en los decoradores con parámetros, es importante comprender qué son los decoradores en Python. En términos simples, un decorador es una función que toma otra función como argumento y devuelve una nueva función. Esta nueva función puede agregar funcionalidad adicional a la función original sin modificar su código fuente.

En Python, los decoradores se implementan utilizando la sintaxis de «@» seguida del nombre del decorador encima de la función que se desea decorar. Esto hace que el código sea más legible y fácil de entender.

Por ejemplo, considera la siguiente función:

«`python
def decorador(funcion):
def wrapper():
print(«Antes de llamar a la función»)
funcion()
print(«Después de llamar a la función»)
return wrapper

@decorador
def funcion_decorada():
print(«¡Hola, mundo!»)

funcion_decorada()
«`

En este ejemplo, la función `decorador` es el decorador que toma la función `funcion` como argumento y devuelve una nueva función llamada `wrapper`. La función `wrapper` agrega funcionalidad adicional a la función original `funcion` imprimiendo un mensaje antes y después de llamar a la función.

Recomendado:  Convert Column Type to Datetime Format in Pandas DataFrame: Easy Steps

Al utilizar el decorador `@decorador` encima de la función `funcion_decorada`, estamos aplicando el decorador a esa función. Cuando llamamos a `funcion_decorada()`, en realidad estamos llamando a la función `wrapper` que ha sido devuelta por el decorador.

¿Por qué utilizar decoradores con parámetros?

Los decoradores con parámetros nos permiten personalizar el comportamiento de los decoradores al proporcionar valores específicos como argumentos. Esto es útil cuando queremos que el decorador se comporte de manera diferente en diferentes situaciones.

Por ejemplo, supongamos que tenemos una función que realiza una operación matemática y queremos que el decorador nos permita especificar el número de veces que se debe repetir la operación. En lugar de tener que modificar el código del decorador cada vez que queramos cambiar el número de repeticiones, podemos utilizar un decorador con parámetros para hacerlo de manera más flexible.

Creando un decorador con parámetros

Para crear un decorador con parámetros, necesitamos definir una función que tome los parámetros del decorador y devuelva una función que actúe como el decorador real. Esta función interna será la que tome la función original como argumento y devuelva la nueva función decorada.

Aquí hay un ejemplo de cómo se puede crear un decorador con parámetros:

«`python
def decorador_con_parametros(parametro1, parametro2):
def decorador(funcion):
def wrapper(*args, **kwargs):
print(f»Parámetro 1: {parametro1}»)
print(f»Parámetro 2: {parametro2}»)
funcion(*args, **kwargs)
return wrapper
return decorador
«`

En este ejemplo, la función `decorador_con_parametros` toma los parámetros `parametro1` y `parametro2` y devuelve una función llamada `decorador`. Esta función interna toma la función original como argumento y devuelve la función `wrapper` que agrega funcionalidad adicional a la función original.

Recomendado:  Curve Fit in Python: Las librerías más utilizadas para ajustar curvas

La función `wrapper` utiliza los parámetros `parametro1` y `parametro2` en su implementación y luego llama a la función original con los argumentos `*args` y `**kwargs` para asegurarse de que la función original reciba los mismos argumentos que se le pasaron inicialmente.

Utilizando un decorador con parámetros

Una vez que hemos creado un decorador con parámetros, podemos utilizarlo aplicándolo a una función utilizando la sintaxis de «@».

Aquí hay un ejemplo de cómo se puede utilizar un decorador con parámetros:

«`python
@decorador_con_parametros(«Hola», 5)
def funcion_decorada():
print(«¡Hola, mundo!»)

funcion_decorada()
«`

En este ejemplo, estamos aplicando el decorador `decorador_con_parametros` a la función `funcion_decorada` con los parámetros `»Hola»` y `5`. Cuando llamamos a `funcion_decorada()`, el decorador se ejecuta y la función `wrapper` se llama con los parámetros especificados. La función `wrapper` imprime los valores de los parámetros y luego llama a la función original.

Ejemplos de uso de decoradores con parámetros

Los decoradores con parámetros son extremadamente útiles en situaciones donde queremos personalizar el comportamiento de un decorador en diferentes escenarios. Aquí hay algunos ejemplos de cómo se pueden utilizar los decoradores con parámetros:

1. Decorador de registro de tiempo: Podemos crear un decorador con parámetros que nos permita especificar si queremos registrar el tiempo de ejecución de una función o no. Por ejemplo:

«`python
import time

def tiempo(registrar):
def decorador(funcion):
def wrapper(*args, **kwargs):
if registrar:
inicio = time.time()
resultado = funcion(*args, **kwargs)
fin = time.time()
print(f»Tiempo de ejecución: {fin – inicio} segundos»)
return resultado
else:
return funcion(*args, **kwargs)
return wrapper
return decorador

@tiempo(registrar=True)
def funcion_lenta():
time.sleep(2)
print(«¡Función lenta!»)

@tiempo(registrar=False)
def funcion_rapida():
print(«¡Función rápida!»)

funcion_lenta()
funcion_rapida()
«`

En este ejemplo, el decorador `tiempo` toma un parámetro `registrar` que nos permite especificar si queremos registrar el tiempo de ejecución de la función o no. Dependiendo del valor de `registrar`, el decorador agrega o no la funcionalidad de registro de tiempo a la función.

Recomendado:  Shallow Copy and Deep Copy in Python: Understanding the Difference

2. Decorador de autenticación: Podemos crear un decorador con parámetros que nos permita especificar si queremos requerir autenticación para acceder a una función o no. Por ejemplo:

«`python
def autenticacion(requerir_autenticacion):
def decorador(funcion):
def wrapper(*args, **kwargs):
if requerir_autenticacion:
# Lógica de autenticación aquí
if autenticado:
return funcion(*args, **kwargs)
else:
print(«No estás autenticado»)
else:
return funcion(*args, **kwargs)
return wrapper
return decorador

@autenticacion(requerir_autenticacion=True)
def funcion_privada():
print(«¡Función privada!»)

@autenticacion(requerir_autenticacion=False)
def funcion_publica():
print(«¡Función pública!»)

funcion_privada()
funcion_publica()
«`

En este ejemplo, el decorador `autenticacion` toma un parámetro `requerir_autenticacion` que nos permite especificar si queremos requerir autenticación para acceder a la función o no. Dependiendo del valor de `requerir_autenticacion`, el decorador agrega o no la funcionalidad de autenticación a la función.

Conclusión

Los decoradores con parámetros son una poderosa herramienta en Python que nos permiten personalizar el comportamiento de los decoradores al proporcionar valores específicos como argumentos. Esto nos permite hacer que nuestros decoradores sean más flexibles y adaptables a diferentes situaciones. Al utilizar decoradores con parámetros, podemos agregar funcionalidad adicional a nuestras funciones y clases de una manera elegante y reutilizable.

Author

osceda@hotmail.com

Leave a comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *