Reputation: 32081
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
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
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
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