EMZETT.
Login

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 über rechne ist dasselbe wie rechne = zeitmessung(rechne).
  • functools.wraps: Bewahrt Name und Dokumentation der Originalfunktion. Ohne sie wirkt die Funktion wie huelle.
  • 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