Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Introduktion til functools.wraps | Mestring af Python-Iteratorer og Dekoratører
Funktionelle Programmeringskoncepter i Python

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

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

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.

question mark

Hvorfor er det vigtigt at bruge functools.wraps, når man skriver dekoratorer i Python?

Vælg det korrekte svar

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 7

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 4. Kapitel 7
some-alt