Einfü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.
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
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.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen