Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Introduktion til functool.wraps | Mastering Python Decorators
Funktionelle Programmeringskoncepter i Python

Introduktion til functool.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 uændret;
  • __module__-attributten og andre metadata bevares.

Bevarelse af metadata er vigtigt for fejlfinding, dokumentationsgenerering og værktøjer, der benytter funktionens introspektion. 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

Du kan se, hvordan functools.wraps bruges til at bevare metadata fra den oprindelige funktion, 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 dekorering.

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