Python多行语句

Jus*_*tin 40 python multiline with-statement python-3.x

with在python中创建多行的简洁方法是什么?我想在一个单独的文件中打开几个文件with,但它足够远,我想要它在多行上.像这样:

class Dummy:
    def __enter__(self): pass
    def __exit__(self, type, value, traceback): pass

with Dummy() as a, Dummy() as b,
     Dummy() as c:
    pass
Run Code Online (Sandbox Code Playgroud)

不幸的是,那是一个SyntaxError.所以我尝试了这个:

with (Dummy() as a, Dummy() as b,
      Dummy() as c):
    pass
Run Code Online (Sandbox Code Playgroud)

还有一个语法错误.但是,这有效:

with Dummy() as a, Dummy() as b,\
     Dummy() as c:
    pass
Run Code Online (Sandbox Code Playgroud)

但是,如果我想发表评论怎么办?这不起作用:

with Dummy() as a, Dummy() as b,\
     # my comment explaining why I wanted Dummy() as c\
     Dummy() as c:
    pass
Run Code Online (Sandbox Code Playgroud)

\s 的位置也没有任何明显的变化.

是否有一种干净的方法来创建with允许在其中发表评论的多行语句?

use*_*ica 45

鉴于您已经标记了这个Python 3,如果您需要在上下文管理器中散布注释,我会使用contextlib.ExitStack:

with ExitStack() as stack:
    a = stack.enter_context(Dummy()) # Relevant comment
    b = stack.enter_context(Dummy()) # Comment about b
    c = stack.enter_context(Dummy()) # Further information
Run Code Online (Sandbox Code Playgroud)

这相当于

with Dummy() as a, Dummy() as b, Dummy() as c:
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,您可以在循环中生成上下文管理器,而不需要单独列出每个上下文管理器.文档给出了一个示例,如果要打开一堆文件,并且列表中有文件名,则可以执行此操作

with ExitStack() as stack:
    files = [stack.enter_context(open(fname)) for fname in filenames]
Run Code Online (Sandbox Code Playgroud)

如果你的上下文管理器占用了你想在它们之间添加注释的屏幕空间,那么你可能有足够的想要使用某种循环.


正如Deathless先生在评论中提到的那样,在名称上有一个关于PyPI 的contextlib backportcontextlib2.如果您使用的是Python 2,则可以使用backport的实现ExitStack.

  • 在[pypi](https://pypi.python.org/pypi/contextlib2/)上有一个对Python 2的contextlib改进的后退.它提供了`ExitStack()`等等. (3认同)
  • 这是一个很好的解决方案。 (2认同)

Tig*_*kT3 13

这对我来说似乎最整洁:

with open('firstfile', 'r') as (f1 # first
  ), open('secondfile', 'r') as (f2 # second
  ):
    pass
Run Code Online (Sandbox Code Playgroud)


Nei*_*l G 9

仅限 Python 3.9+:

with (
    Dummy() as a,
    Dummy() as b,
    # my comment explaining why I wanted Dummy() as c
    Dummy() as c,
):
    pass
Run Code Online (Sandbox Code Playgroud)

Python ?3.8:

with \
    Dummy() as a, \
    Dummy() as b, \
    Dummy() as c:
    pass
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种语法无法进行注释。