Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Introduzione a functools.wraps | Padronanza Degli Iteratori e Dei Decorator in Python
Concetti di Programmazione Funzionale in Python

bookIntroduzione 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.

1234567891011121314151617181920212223
from 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
copy

È 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.

question mark

Perché è importante utilizzare functools.wraps quando si scrivono decorator in Python?

Seleziona la risposta corretta

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 7

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Sezione 4. Capitolo 7
some-alt