David Parks
David Parks

Reputation: 32081

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?

Upvotes: 44

Views: 18406

Answers (3)

BeRT2me
BeRT2me

Reputation: 13242

For those using < python 3.9, you can always still split them between multiple lines with \, though this may not look as good as using grouping parentheses.

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

Upvotes: 0

Kevin
Kevin

Reputation: 30161

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

Upvotes: 58

boot-scootin
boot-scootin

Reputation: 12515

As others have said, it's the same result. Here's a more detailed example of how this syntax might be used:

blah.txt

1
2
3
4
5

I can open one file and write its contents to another file in a succinct manner:

with open('blah.txt', 'r') as infile, open('foo.txt', 'w+') as outfile:
    for line in infile:
        outfile.write(str(line))

foo.txt now contains:

1
2
3
4
5

Upvotes: 8

Related Questions