Search code examples
pythonwith-statement

Multiple variables in a 'with' statement?


Is it possible to declare more than one variable using a with statement in Python?

Something like:

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)

... or is cleaning up two resources at the same time the problem?


Solution

  • It is possible in Python 3 since v3.1 and Python 2.7. The new with syntax supports multiple context managers:

    with A() as a, B() as b, C() as c:
        doSomething(a,b,c)
    

    Unlike the contextlib.nested, this guarantees that a and b will have their __exit__()'s called even if C() or it's __enter__() method raises an exception.

    You can also use earlier variables in later definitions (h/t Ahmad below):

    with A() as a, B(a) as b, C(a, b) as c:
        doSomething(a, c)
    

    As of Python 3.10, you can use parentheses:

    with (
        A() as a, 
        B(a) as b, 
        C(a, b) as c,
    ):
        doSomething(a, c)