Comprensión de los Decoradores Básicos
En este paso, introduciremos el concepto de decoradores y su uso básico. Un decorador es una función que toma otra función como argumento, le añade alguna funcionalidad y devuelve otra función, todo ello sin alterar el código fuente de la función original.
Primero, localice el archivo decorator_basics.py en el explorador de archivos del lado izquierdo del WebIDE. Haga doble clic para abrirlo. Escribiremos nuestro primer decorador en este archivo.
Copie y pegue el siguiente código en decorator_basics.py:
import datetime
def log_activity(func):
"""A simple decorator to log function calls."""
def wrapper(*args, **kwargs):
print(f"Calling function '{func.__name__}' at {datetime.datetime.now()}")
result = func(*args, **kwargs)
print(f"Function '{func.__name__}' finished.")
return result
return wrapper
@log_activity
def greet(name):
"""A simple function to greet someone."""
print(f"Hello, {name}!")
## Call the decorated function
greet("Alice")
## Let's inspect the function's metadata
print(f"\nFunction name: {greet.__name__}")
print(f"Function docstring: {greet.__doc__}")
Analicemos este código:
- Definimos una función decoradora
log_activity que acepta una función func como su argumento.
- Dentro de
log_activity, definimos una función anidada wrapper. Esta función contendrá el nuevo comportamiento. Imprime un mensaje de registro (log), llama a la función original func e imprime otro mensaje de registro.
- La función
log_activity devuelve la función wrapper.
- La sintaxis
@log_activity encima de la función greet es un atajo para greet = log_activity(greet). Aplica nuestro decorador a la función greet.
Ahora, guarde el archivo (puede usar Ctrl+S o Cmd+S). Para ejecutar el script, abra la terminal integrada en la parte inferior del WebIDE y ejecute el siguiente comando:
python ~/project/decorator_basics.py
Verá la siguiente salida. Tenga en cuenta que la fecha y hora variarán.
Calling function 'greet' at 2023-10-27 10:30:00.123456
Hello, Alice!
Function 'greet' finished.
Function name: wrapper
Function docstring: None
Observe dos cosas en la salida. Primero, nuestra función greet ahora está envuelta con los mensajes de registro. Segundo, el nombre y la cadena de documentación (docstring) de la función han sido reemplazados por los de la función wrapper. Esto puede ser problemático para la depuración (debugging) y la introspección. En el siguiente paso, aprenderemos a solucionar esto.