Introduktion till functool.wraps
Svep för att visa menyn
När du skriver egna dekoratörer förlorar du ofta viktig information om den ursprungliga funktionen, såsom dess namn, docstring och modul. Detta händer eftersom dekoratören ersätter den ursprungliga funktionen med en ny wrapper-funktion. För att åtgärda detta, använd dekoratören functools.wraps från Pythons standardbibliotek.
Genom att använda functools.wraps på din wrapper-funktion bevarar du den ursprungliga funktionens metadata. Detta innebär:
- Funktionens
__name__-attribut förblir detsamma som originalet; - Funktionens
__doc__-sträng bevaras; - Attributet
__module__och annan metadata bevaras.
Att bevara metadata är viktigt för felsökning, dokumentationsgenerering och verktyg som förlitar sig på funktionsinspektion. Utan functools.wraps kan stacktraces och hjälpfunktioner visa förvirrande eller felaktig information, vilket gör din kod svårare att underhålla och felsöka.
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
Du kan se hur du använder functools.wraps för att bevara den ursprungliga funktionens metadata när du skapar en dekoratör. Genom att använda functools.wraps på din wrapper säkerställer du att attribut som funktionens namn och docstring inte går förlorade efter dekoreringen.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal