14 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.).