Grundlagen von Decorators verstehen
In diesem Schritt führen wir das Konzept der Decorators ein und zeigen deren grundlegende Verwendung. Ein Decorator ist eine Funktion, die eine andere Funktion als Argument entgegennimmt, zusätzliche Funktionalität hinzufügt und eine weitere Funktion zurückgibt, alles ohne den Quellcode der ursprünglichen Funktion zu verändern.
Suchen Sie zunächst im Dateiexplorer auf der linken Seite des WebIDE nach der Datei decorator_basics.py. Doppelklicken Sie darauf, um sie zu öffnen. Wir werden unseren ersten Decorator in dieser Datei schreiben.
Kopieren Sie den folgenden Code und fügen Sie ihn in decorator_basics.py ein:
import datetime
def log_activity(func):
"""A simple decorator to log function calls."""
def wrapper(*args, **kwargs):
print(f"Calling function '{func.__name__}' at {datetime.datetime.now()}")
result = func(*args, **kwargs)
print(f"Function '{func.__name__}' finished.")
return result
return wrapper
@log_activity
def greet(name):
"""A simple function to greet someone."""
print(f"Hello, {name}!")
## Call the decorated function
greet("Alice")
## Let's inspect the function's metadata
print(f"\nFunction name: {greet.__name__}")
print(f"Function docstring: {greet.__doc__}")
Lassen Sie uns diesen Code analysieren:
- Wir definieren eine Decorator-Funktion
log_activity, die eine Funktion func als Argument akzeptiert.
- Innerhalb von
log_activity definieren wir eine verschachtelte Funktion wrapper. Diese Funktion enthält das neue Verhalten. Sie gibt eine Log-Nachricht aus, ruft die ursprüngliche Funktion func auf und gibt dann eine weitere Log-Nachricht aus.
- Die Funktion
log_activity gibt die wrapper-Funktion zurück.
- Die Syntax
@log_activity über der Funktion greet ist eine Abkürzung für greet = log_activity(greet). Sie wendet unseren Decorator auf die Funktion greet an.
Speichern Sie nun die Datei (Sie können Strg+S oder Cmd+S verwenden). Um das Skript auszuführen, öffnen Sie das integrierte Terminal am unteren Rand des WebIDE und führen Sie den folgenden Befehl aus:
python ~/project/decorator_basics.py
Sie werden die folgende Ausgabe sehen. Beachten Sie, dass das Datum und die Uhrzeit variieren werden.
Calling function 'greet' at 2023-10-27 10:30:00.123456
Hello, Alice!
Function 'greet' finished.
Function name: wrapper
Function docstring: None
Beachten Sie zwei Dinge in der Ausgabe. Erstens wird unsere Funktion greet nun mit den Protokollierungsnachrichten umhüllt. Zweitens wurden der Name und das Docstring der Funktion durch die der wrapper-Funktion ersetzt. Dies kann für das Debugging und die Introspektion problematisch sein. Im nächsten Schritt lernen wir, wie man dies behebt.