Python nested context manager on multiple lines [duplicate]
Backslash characters
Two or more physical lines may be joined into logical lines using backslash characters (
\
)
(citing the Explicit line joining section)
If you want put context managers on different lines, you can make that work by ending lines with backslashes:
with context1 as a,\ context2 as b: pass
contextlib.ExitStack
contextlib.ExitStack
is a
context manager that is designed to make it easy to programmatically combine other context managers and cleanup functions, especially those that are optional or otherwise driven by input data.
It's available in Python 3.3 and newer, and allows to enter a variable number of context managers easily. For just two context managers the usage looks like this:
from contextlib import ExitStackwith ExitStack() as es: a = es.enter_context(context1) b = es.enter_context(context2)
Nesting
It's possible to split a context expression across several nested with
statements:
With more than one item, the context managers are processed as if multiple with statements were nested:
with A() as a, B() as b:
suite is equivalent to
with A() as a: with B() as b: suite
(from The with statement)
There is a way to creatively use the parentheses and avoid the backslash: parenthesize the expression before as
. Not very sightly, though:
with ( open('/etc/passwd')) as foo, ( open('/tmp/bar')) as bar: pass # this parses correctly
It's easy to nest more and more if needed.
with context1 as a, \context2 as b:pass
Like any line-break, backslash provides the solution