So verwenden Sie Kontextmanager in Python (mit Anweisung)

Erfahren Sie, wie Kontextmanager in Python funktionieren. Beherrschen Sie die with-Anweisung, verwalten Sie Systemressourcen und schreiben Sie benutzerdefinierte Kontextmanager.

Probieren Sie diese Lösung im Editor aus

Übersicht

Die ordnungsgemäße Verwaltung externer Ressourcen – wie das Schließen von Dateihandles, das Trennen von Datenbankverbindungen und das Aufheben von Thread-Sperren – ist für die Entwicklung zuverlässiger, produktionsbereiter Software von entscheidender Bedeutung. Wenn Ressourcen nicht freigegeben werden, kann dies zu Speicherverlusten, Dateisperrfehlern und Anwendungsabstürzen führen.

Die „with“-Anweisung von Python vereinfacht die Ressourcenbereinigung durch die Erstellung eines Kontextmanagers. Ein Kontextmanager garantiert, dass Bereinigungsaktionen automatisch ausgeführt werden, wenn die Kontrolle den Block verlässt, selbst wenn der Code eine Ausnahme auslöst oder vorzeitig beendet wird. Dadurch entfällt die Notwendigkeit ausführlicher, sich wiederholender „try-finally“-Blöcke.

Während Kontextmanager am häufigsten mit integrierten Vorgängen wie „open()“ verknüpft werden, können Sie ganz einfach Ihre eigenen benutzerdefinierten Kontextmanager entwerfen. Sie können sie erstellen, indem Sie eine Klasse erstellen, die die magischen Methoden „__enter__“ und „__exit__“ implementiert, oder indem Sie eine Generatorfunktion schreiben, die mit dem Dekorator „contextlib.contextmanager“ dekoriert ist.

Code- und Ausführungsausgabe

Dieses Skript demonstriert das Schreiben benutzerdefinierter Kontextmanager in Python mithilfe von Klassenimplementierungen und Kontextlib-Dekoratoren.

context_managers.py
Versuchen Sie es im Editor
from contextlib import contextmanager

# Method 1: Class-based context manager
class CustomResource:
    def __enter__(self):
        print("[Resource] Opening connection...")
        return self

    def do_work(self):
        print("[Resource] Performing action...")

    def __exit__(self, exc_type, exc_val, exc_tb):
        print("[Resource] Closing connection safely.")
        return False

print("--- Class Context Manager ---")
with CustomResource() as resource:
    resource.do_work()

# Method 2: Generator-based context manager (contextlib)
@contextmanager
def simple_timer():
    print("\n[Timer] Started...")
    try:
        yield
    finally:
        print("[Timer] Finished!")

print("\n--- Decorator Context Manager ---")
with simple_timer():
    print("Performing tasks inside context...")
Terminal-Ausgabe
--- Class Context Manager ---
[Resource] Opening connection...
[Resource] Performing action...
[Resource] Closing connection safely.

--- Decorator Context Manager ---

[Timer] Started...
Performing tasks inside context...
[Timer] Finished!

Schrittweise Umsetzung

  • Verwenden Sie die with-Anweisung beim Öffnen von Dateien, Datenbanken oder Sperren, um die Ressourcensicherheit zu gewährleisten.
  • Definieren Sie benutzerdefinierte Kontextmanager mithilfe von Klassen mit den magischen Methoden __enter__ und __exit__.
  • Verwenden Sie den @contextlib.contextmanager-Dekorator für eine Generatorfunktion als einfachere, funktionsbasierte Alternative.
  • Platzieren Sie Aktionen zum Schließen von Ressourcen innerhalb des Bereinigungsblocks, um sicherzustellen, dass sie auch dann ausgeführt werden, wenn Fehler auftreten.

Häufig gestellte Fragen

Welche Parameter erhält die Methode __exit__?

Die __exit__-Methode empfängt drei Argumente, die die Ausnahmedetails darstellen, wenn eine ausgelöst wurde: exc_type (Typ der Ausnahme), exc_val (Ausnahmewert) und exc_tb (Traceback). Wenn kein Fehler aufgetreten ist, werden alle drei als „Keine“ übergeben.

Kann ein Kontextmanager Ausnahmen unterdrücken?

Ja. Wenn die Methode __exit__ einen wahrheitsgetreuen Wert (wie True) zurückgibt, unterdrückt Python die Ausnahme und die Ausführung wird nach dem with-Block fortgesetzt. Wenn False zurückgegeben wird, wird die Ausnahme normal ausgelöst.

Verwandte Themen

Empfohlene Python-Ressourcen

Erweitern Sie Ihr Wissen mit zugehörigen interaktiven Tutorials, Spickzetteln und Codevergleichen.