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")
Siehe auch
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")