Kontextmanagement mit with

Eine rationellere Art, das Muster try-except-finally zu kapseln, ist die Verwendung des Schlüsselworts with und eines Kontextmanagers. Python definiert Kontextmanager für Dinge wie den Zugriff auf Dateien und eigene Kontextmanager. Ein Vorteil von Kontextmanagern ist, dass sie Bereinigungsaktionen definieren können, die immer ausgeführt werden, unabhängig davon, ob eine Ausnahme auftritt oder nicht.

Öffnen und Schließen von Dateien

Die folgende Auflistung zeigt das Öffnen und Lesen einer Datei unter Verwendung von with und einem Kontextmanager.

1filename = "myFile1.py"
2with open(filename, "r") as f:
3    for line in f:
4        print(line)

Hier wird ein Kontextmanager eingerichtet, der die Funktion open und den darauf folgenden Block umschließt. Die vordefinierte Aufräumaktion des Kontextmanagers schließt die Datei, auch wenn eine Ausnahme auftritt. Solange der Ausdruck in der ersten Zeile ausgeführt wird, ohne eine Ausnahme auszulösen, wird die Datei immer geschlossen. Dieser Code ist äquivalent zu diesem Code:

1filename = "myFile1.py"
2try:
3    f = open(filename, "r")
4    for line in f:
5        print(line)
6except Exception as e:
7    raise e
8finally:
9    f.close()

Siehe auch

Locking

threading.Lock kann mit try-finally verwendet werden:

lock = threading.Lock()

try:
    print("a Job")
    print("another Job")
finally:
    lock.release()

Eleganter ist jedoch die Verwendung mit dem Kontextmanager:

with lock:
   print("a Job")
   print("another Job")

Exceptions unterdrücken

Kontextmanager können auch verwendet werden um die Ausgabe von Exceptions zu unterdrücken und die Ausführung fortzusetzen.

try:
    os.remove("somefile.tmp")
except FileNotFoundError:
    pass

Dies kann eleganter geschrieben werden mit:

from contextlib import suppress

with suppress(FileNotFoundError):
    os.remove("somefile.tmp")