Introduzione a functools.wraps
Scorri per mostrare il menu
Quando si scrivono decoratori personalizzati, spesso si perde informazione importante sulla funzione originale, come il suo nome, la docstring e il modulo. Questo accade perché il decoratore sostituisce la funzione originale con una nuova funzione wrapper. Per risolvere questo problema, utilizzare il decoratore functools.wraps della libreria standard di Python.
Applicando functools.wraps alla funzione wrapper, si preservano i metadati della funzione originale. Questo significa:
- L'attributo
__name__della funzione rimane uguale a quello originale; - La stringa
__doc__della funzione viene mantenuta intatta; - L'attributo
__module__e altri metadati vengono preservati.
La conservazione dei metadati è importante per il debug, la generazione della documentazione e per gli strumenti che si basano sull'introspezione delle funzioni. Senza functools.wraps, i traceback e le utility di help potrebbero mostrare informazioni confuse o errate, rendendo il codice più difficile da mantenere e correggere.
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
È possibile vedere come utilizzare functools.wraps per preservare i metadati della funzione originale durante la creazione di un decoratore. Applicando functools.wraps al wrapper, si garantisce che attributi come il nome e la docstring della funzione non vengano persi dopo la decorazione.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione