在Python中,一行中的多个“with”语句等同于嵌套的“with”语句吗?

lf5gs5x2  于 2023-06-28  发布在  Python
关注(0)|答案(4)|浏览(92)

这两种说法是否等价?

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

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

我问这个问题是因为ab都改变了全局变量(这里是tensorflow),而b依赖于a所做的更改。所以我知道第二种形式是安全的,但它相当于缩短到第一种形式吗?

2uluyalo

2uluyalo1#

是的,根据Python 2.7语言参考,在一行中列出多个with语句与嵌套它们完全相同:
对于多个项,上下文管理器的处理方式就像嵌套了多个with语句一样:

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

相当于

with A() as a:
   with B() as b:
       suite

类似的语言出现在Python 3语言参考中。

更新3.10+

在版本3.10中更改:支持使用分组括号将语句分到多行。

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

gfttwv5a2#

正如其他人所说,结果是一样的。下面是一个更详细的示例,说明如何使用此语法:

  • blah.txt*
1
2
3
4
5

我可以以简洁的方式打开一个文件并将其内容写入另一个文件:

with open('blah.txt', 'r') as infile, open('foo.txt', 'w+') as outfile:
    for line in infile:
        outfile.write(str(line))
  • foo.txt * 现在包含:
1
2
3
4
5
nqwrtyyt

nqwrtyyt3#

完全相同。这取决于你的个人偏好。

kqlmhetl

kqlmhetl4#

对于那些使用< python 3.9的用户,您仍然可以使用\将它们拆分为多行,尽管这看起来可能不如使用分组括号。

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

相关问题