Introducing functool.wraps
Glissez pour afficher le menu
Lorsque vous écrivez vos propres décorateurs, vous perdez souvent des informations importantes sur la fonction d'origine, telles que son nom, sa docstring et son module. Cela se produit parce que le décorateur remplace la fonction d'origine par une nouvelle fonction d'enrobage. Pour résoudre ce problème, utilisez le décorateur functools.wraps de la bibliothèque standard de Python.
En appliquant functools.wraps à votre fonction d'enrobage, vous conservez les métadonnées de la fonction d'origine. Cela signifie :
- L'attribut
__name__de la fonction reste identique à celui de la fonction d'origine ; - La chaîne
__doc__de la fonction est conservée ; - L'attribut
__module__et d'autres métadonnées sont préservés.
La préservation des métadonnées est importante pour le débogage, la génération de documentation et les outils qui reposent sur l'introspection des fonctions. Sans functools.wraps, les traces de pile et les utilitaires d'aide peuvent afficher des informations confuses ou incorrectes, rendant votre code plus difficile à maintenir et à déboguer.
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
Vous pouvez voir comment utiliser functools.wraps pour préserver les métadonnées de la fonction d'origine lors de la création d'un décorateur. En appliquant functools.wraps à votre enrobage, vous vous assurez que des attributs comme le nom et la docstring de la fonction ne sont pas perdus après la décoration.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion