Python: Dekoratoren
Kurz: Ein Dekorator ist eine Funktion, die eine andere Funktion nimmt und eine erweiterte Version zurückgibt. Mit @name über der Funktion wendet man ihn an.
Genauer: Er verpackt (umhüllt) die ursprüngliche Funktion, um davor oder danach etwas zu tun: Zeit messen, Zugriff prüfen, Ergebnisse zwischenspeichern, Aufrufe protokollieren.
Im Detail
import functools, time
def zeitmessung(f):
@functools.wraps(f)
def huelle(*args, **kwargs):
start = time.perf_counter()
ergebnis = f(*args, **kwargs)
print(f.__name__, time.perf_counter() - start)
return ergebnis
return huelle
@zeitmessung
def rechne(n): ...- Gleichbedeutend:
@zeitmessungüberrechneist dasselbe wierechne = zeitmessung(rechne). functools.wraps: Bewahrt Name und Dokumentation der Originalfunktion. Ohne sie wirkt die Funktion wiehuelle.- Mit Parametern: Ein Dekorator mit Argumenten (
@wiederhole(3)) ist eine Funktion, die einen Dekorator zurückgibt (eine Schachtelung mehr). - Eingebaut und bekannt:
@staticmethod,@property,@functools.lru_cache, Routen in Flask (@app.route),@pytest.fixture. - Klassen: Dekoratoren können auch Klassen erweitern (
@dataclass). - Hinweis: Nicht mit dem Entwurfsmuster verwechseln, siehe Decorator-Muster.
Siehe auch: Dataclasses, Lambda