Introducción a functools.wraps
Desliza para mostrar el menú
Al escribir tus propios decoradores, a menudo se pierde información importante sobre la función original, como su nombre, docstring y módulo. Esto ocurre porque el decorador reemplaza la función original con una nueva función envolvente. Para solucionar esto, utiliza el decorador functools.wraps de la biblioteca estándar de Python.
Al aplicar functools.wraps a tu función envolvente, se conserva la metadata de la función original. Esto significa:
- El atributo
__name__de la función permanece igual que el original; - La cadena
__doc__de la función se mantiene intacta; - El atributo
__module__y otros metadatos se preservan.
Conservar la metadata es importante para la depuración, la generación de documentación y las herramientas que dependen de la introspección de funciones. Sin functools.wraps, los rastreos de pila y las utilidades de ayuda pueden mostrar información confusa o incorrecta, lo que dificulta el mantenimiento y la depuración del código.
1234567891011121314151617181920212223from functools import wraps # Define a decorator that will wrap another function def my_decorator(func): # Use @wraps to preserve metadata from the original function @wraps(func) def wrapper(*args, **kwargs): # This code runs before the original function print("Running the decorated function...") return func(*args, **kwargs) # Call the original function return wrapper # Return the wrapper as the new decorated function # Apply the decorator to a function def say_hello(): """Prints a hello message.""" print("Hello!") say_hello = my_decorator(say_hello) say_hello() # Print out the preserved metadata print(f"Function name: {say_hello.__name__}") # Name is preserved print(f"Docstring: {say_hello.__doc__}") # Docstring is preserved
Puedes ver cómo usar functools.wraps para preservar la metadata de la función original al crear un decorador. Al aplicar functools.wraps a tu función envolvente, aseguras que atributos como el nombre y el docstring de la función no se pierdan después de la decoración.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla