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 Verzeichnisse 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")