Search code examples
pythonwith-statement

Are multiple `with` statements on one line equivalent to nested `with` statements, in python?


Are these two statements equivalent?

with A() as a, B() as b:
  # do something

with A() as a:
  with B() as b:
    # do something

I ask because both a and b alter global variables (tensorflow here) and b depends on changes made by a. So I know the 2nd form is safe to use, but is it equivalent to shorten it to the 1st form?


Solution

  • Yes, listing multiple with statements on one line is exactly the same as nesting them, according to the Python 2.7 language reference:

    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
    

    Similar language appears in the Python 3 language reference.

    Update for 3.10+

    Changed in version 3.10: Support for using grouping parentheses to break the statement in multiple lines.

    with (
       A() as a,
       B() as b,
    ):
       SUITE