2 usuarios conectados
Funciones. Decoradores en Python
Funciones. Decoradores en Python
Ahora vamos a explorar los decoradores
en Python, una característica poderosa y elegante que te permite modificar o
extender el comportamiento de funciones o métodos de una manera legible y
reutilizable.
¿Qué son los Decoradores?
En esencia, un decorador es una función que toma
otra función como argumento, la envuelve con alguna funcionalidad adicional y
devuelve la función envuelta. Los decoradores se aplican a las funciones
utilizando la sintaxis @nombre_del_decorador
justo antes de la
definición de la función que se va a decorar.
Sintaxis Básica:
Salida:
Desglosando el Ejemplo:
mi_decorador(func)
:
Esta es la función decoradora. Toma una función (func
) como
argumento.
funcion_envolvente(*args, **kwargs)
:
Dentro del decorador, se define una función interna (funcion_envolvente
).
Esta función envolvente es la que realmente se ejecutará cuando llamemos a
la función decorada. Utiliza *args
y **kwargs
para
poder aceptar cualquier número y tipo de argumentos que la función original
pueda tener.
print("Antes de llamar a la
función.")
: Aquí se puede agregar código que se ejecute
antes de que se llame a la función original.
resultado = func(*args, **kwargs)
:
Se llama a la función original (func
) pasando los argumentos
que recibió la función envolvente.
print("Después de llamar a la
función.")
: Aquí se puede agregar código que se ejecute
después de que la función original haya terminado.
return resultado
:
La función envolvente devuelve el resultado de la función original.
return funcion_envolvente
:
El decorador devuelve la función envolvente.
@mi_decorador
:
Esta sintaxis "decora" la función mi_funcion
. Es equivalente a
hacer: mi_funcion = mi_decorador(mi_funcion)
. Cuando llamas a
mi_funcion()
, en realidad estás llamando a la
funcion_envolvente
que devuelve mi_decorador
.
Usos Comunes de los Decoradores:
- Logging: Registrar
información sobre la ejecución de las funciones (por ejemplo, cuándo se
llaman, con qué argumentos).
- Control de acceso:
Verificar si un usuario tiene los permisos necesarios para ejecutar una
función.
- Medición del tiempo de ejecución:
Calcular cuánto tiempo tarda en ejecutarse una función.
- Validación de argumentos:
Comprobar si los argumentos pasados a una función cumplen ciertos criterios.
- Manejo de errores:
Capturar excepciones que puedan ocurrir en una función y manejarlas de forma
centralizada.
- Memorización: Almacenar en
caché los resultados de llamadas a funciones costosas con los mismos
argumentos.
Decoradores con Argumentos:
A veces, quieres que tu decorador acepte
argumentos. Para hacer esto, necesitas crear una función que envuelva al
decorador real.
Salida:
Aquí, repetir
es una función que
toma num_veces
como argumento y devuelve el decorador real (decorador_repetir
).
Luego, @repetir(num_veces=3)
llama a repetir
con
3
y el decorador resultante se aplica a saludar
.
Múltiples Decoradores:
Puedes aplicar múltiples decoradores a una misma
función. Se aplicarán de abajo hacia arriba (el decorador más cercano a la
definición de la función se aplica primero).
En este caso, obtener_texto
primero se decora con hacer_cursiva
, y luego el resultado se decora
con hacer_negrita
.
Decoradores para Métodos de Clase:
Los decoradores también se pueden aplicar a
los métodos dentro de las clases. El primer argumento de un método de clase
siempre es self
, y el decorador debe tener en cuenta esto.
Salida:
Los decoradores son una herramienta poderosa
para escribir código más limpio, modular y reutilizable en Python. Permiten
separar la lógica de la funcionalidad principal de una función de la lógica
auxiliar (como logging, seguridad, etc.).