Introduktion til functools.wraps
Stryg for at vise menuen
Når du skriver dine egne dekoratorer, mister du ofte vigtig information om den oprindelige funktion, såsom dens navn, docstring og modul. Dette sker, fordi dekoratoren erstatter den oprindelige funktion med en ny wrapper-funktion. For at løse dette skal du bruge dekoratoren functools.wraps fra Pythons standardbibliotek.
Ved at anvende functools.wraps på din wrapper-funktion bevarer du metadata fra den oprindelige funktion. Det betyder:
- Funktionens
__name__-attribut forbliver den samme som den oprindelige; - Funktionens
__doc__-streng bevares; __module__-attributten og andre metadata bevares.
Bevarelse af metadata er vigtigt for fejlfinding, dokumentationsgenerering og værktøjer, der er afhængige af funktionsinspektion. Uden functools.wraps kan stack traces og hjælpeværktøjer vise forvirrende eller forkerte oplysninger, hvilket gør din kode sværere at vedligeholde og fejlfinde.
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 functools.wraps bruges til at bevare den oprindelige funktions metadata, når du opretter en dekorator. Ved at anvende functools.wraps på din wrapper sikrer du, at attributter som funktionens navn og docstring ikke går tabt efter dekoration.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat