Wenn Sie die Variablen in Zeilen aufteilen, müssen Sie vor Python 3.10 Backslashes verwenden, um die Zeilenumbrüche zu umschließen.
with A() as a, \
B() as b, \
C() as c:
doSomething(a,b,c)
Klammern funktionieren nicht, da Python stattdessen ein Tupel erzeugt.
with (A(),
B(),
C()):
doSomething(a,b,c)
Da Tupel keine __enter__
erhalten Sie eine Fehlermeldung (undeskriptiv und identifiziert nicht den Klassentyp):
AttributeError: __enter__
Wenn Sie versuchen, die as
innerhalb von Klammern, fängt Python den Fehler beim Parsen ab:
with (A() as a,
B() as b,
C() as c):
doSomething(a,b,c)
SyntaxError: invalid syntax
Wann wird das Problem behoben sein?
Dieses Thema wird verfolgt in https://bugs.python.org/issue12782 .
Python angekündigt in PEP 617 dass sie den ursprünglichen Parser durch einen neuen ersetzen würden. Da der ursprüngliche Parser von Python LL(1) ist, ist er kann nicht unterscheiden zwischen "mehreren Kontextmanagern" with (A(), B()):
und "Tupel von Werten" with (A(), B())[0]:
.
Der neue Parser kann mehrere von Klammern umgebene Kontextmanager korrekt analysieren. Der neue Parser ist in 3.9 aktiviert worden. Es wurde berichtet, dass diese Syntax immer noch zurückgewiesen wird, bis der alte Parser in Python 3.10 entfernt wird, und diese Syntaxänderung wurde in der 3.10 Versionshinweise . Aber in meinen Tests, es funktioniert in trinket.io's Python 3.9.6 als gut.