Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Einführung in Functool.Wraps | Mastering Python Iterators and Decorators
Funktionale Programmierkonzepte in Python

bookEinführung in Functool.Wraps

Swipe um das Menü anzuzeigen

Beim Schreiben eigener Dekoratoren gehen häufig wichtige Informationen über die ursprüngliche Funktion verloren, wie zum Beispiel deren Name, Docstring und Modul. Dies geschieht, weil der Dekorator die Originalfunktion durch eine neue Wrapper-Funktion ersetzt. Um dies zu verhindern, sollte der functools.wraps-Dekorator aus der Python-Standardbibliothek verwendet werden.

Durch das Anwenden von functools.wraps auf die Wrapper-Funktion bleibt die Metadaten der Originalfunktion erhalten. Das bedeutet:

  • Das Attribut __name__ der Funktion bleibt wie bei der Originalfunktion erhalten;
  • Der __doc__-String der Funktion bleibt unverändert;
  • Das Attribut __module__ und weitere Metadaten werden bewahrt.

Das Bewahren von Metadaten ist wichtig für das Debugging, die Dokumentationserstellung und Werkzeuge, die auf Funktions-Introspektion angewiesen sind. Ohne functools.wraps können Stacktraces und Hilfsfunktionen verwirrende oder falsche Informationen anzeigen, was die Wartung und Fehlersuche im Code erschwert.

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

Hier ist zu sehen, wie functools.wraps verwendet wird, um die Metadaten der ursprünglichen Funktion beim Erstellen eines Dekorators zu bewahren. Durch das Anwenden von functools.wraps auf den Wrapper wird sichergestellt, dass Attribute wie der Funktionsname und der Docstring nach der Dekoration nicht verloren gehen.

question mark

Warum ist es wichtig, functools.wraps beim Schreiben von Dekoratoren in Python zu verwenden?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 7

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Abschnitt 4. Kapitel 7
some-alt