Ist es möglich, mehr als eine Variable mit a zu deklarieren? with
Anweisung in Python ?
Etwas wie:
from __future__ import with_statement
with open("out.txt","wt"), open("in.txt") as file_out, file_in:
for line in file_in:
file_out.write(line)
... oder ist es das Problem, zwei Ressourcen gleichzeitig zu bereinigen?
python
with-statement
Kugelfisch
quelle
quelle
Antworten:
Es ist in Python 3 seit v3.1 und Python 2.7 möglich . Die neue
with
Syntax unterstützt mehrere Kontextmanager:Im Gegensatz zum
contextlib.nested
garantiert dies, dassa
undb
wird ihre__exit__()
aufgerufen, auch wennC()
oder seine__enter__()
Methode eine Ausnahme auslöst.Sie können auch frühere Variablen in späteren Definitionen verwenden (h / t Ahmad unten):
quelle
with open('./file') as arg.x = file:
?as
ist optional.as
ist erforderlich, wenn Sie das Objekt benötigena
oderb
, aber das Ganzeas a
oderas b
nicht erforderlichcontextlib.nested
unterstützt dies:Update:
Um die Dokumentation zu zitieren, betreffend
contextlib.nested
:Siehe Rafał Dowgird Antwort für weitere Informationen.
quelle
nested
Kontextmanager ein Fehler ist und niemals verwendet werden sollte. Wenn in diesem Beispiel das Öffnen der zweiten Datei eine Ausnahme auslöst, wird die erste Datei überhaupt nicht geschlossen, wodurch der Zweck der Verwendung von Kontextmanagern vollständig zerstört wird.with
. Die Manager werden in der Reihenfolge vor dem Eingeben der mit Blöcken erstellt: m1, m2, m3 = A (), B (), C () Wenn B () oder C () mit Ausnahme fehlschlägt, besteht Ihre einzige Hoffnung darauf, A ( ) ist der Müllsammler.Beachten Sie, dass Sie beim Aufteilen der Variablen in Zeilen Backslashes verwenden müssen, um die Zeilenumbrüche zu umbrechen.
Klammern funktionieren nicht, da Python stattdessen ein Tupel erstellt.
Da Tupeln ein
__enter__
Attribut fehlt , erhalten Sie einen Fehler (nicht beschreibend und identifiziert den Klassentyp nicht):Wenn Sie versuchen,
as
in Klammern zu verwenden, fängt Python den Fehler beim Analysieren ab:https://bugs.python.org/issue12782 scheint mit diesem Problem in Zusammenhang zu stehen.
quelle
Ich denke, Sie möchten dies stattdessen tun:
quelle
Seit Python 3.3 können Sie die Klasse
ExitStack
aus demcontextlib
Modul verwenden.Es kann eine dynamische Anzahl kontextsensitiver Objekte verwalten, was bedeutet, dass es sich als besonders nützlich erweist, wenn Sie nicht wissen, wie viele Dateien Sie verarbeiten werden.
Der in der Dokumentation erwähnte kanonische Anwendungsfall ist die Verwaltung einer dynamischen Anzahl von Dateien.
Hier ist ein allgemeines Beispiel:
Ausgabe:
quelle
In Python 3.1+ können Sie mehrere Kontextausdrücke angeben, die so verarbeitet werden, als wären mehrere
with
Anweisungen verschachtelt:ist äquivalent zu
Dies bedeutet auch, dass Sie den Alias aus dem ersten Ausdruck im zweiten verwenden können (nützlich, wenn Sie mit Datenbankverbindungen / Cursorn arbeiten):
quelle