Introduksjon til functool.wraps
Sveip for å vise menyen
Når du skriver egne dekoratører, mister du ofte viktig informasjon om den opprinnelige funksjonen, som navn, docstring og modul. Dette skjer fordi dekoratøren erstatter den opprinnelige funksjonen med en ny wrapper-funksjon. For å løse dette, bruk dekoratøren functools.wraps fra Pythons standardbibliotek.
Ved å bruke functools.wraps på wrapper-funksjonen din, bevarer du metadataene til den opprinnelige funksjonen. Dette betyr:
- Funksjonens
__name__-attributt forblir det samme som originalen; - Funksjonens
__doc__-streng beholdes uendret; __module__-attributtet og annen metadata bevares.
Å bevare metadata er viktig for feilsøking, dokumentasjonsgenerering og verktøy som er avhengige av funksjonsintrospeksjon. Uten functools.wraps kan stack traces og hjelpeverktøy vise forvirrende eller feil informasjon, noe som gjør koden vanskeligere å vedlikeholde og feilsøke.
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 hvordan du bruker functools.wraps for å bevare metadataene til den opprinnelige funksjonen når du lager en dekoratør. Ved å bruke functools.wraps på wrapperen sikrer du at attributter som funksjonens navn og docstring ikke går tapt etter dekorering.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår