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.
Tig*_*kT3 13
这对我来说似乎最整洁:
with open('firstfile', 'r') as (f1 # first
), open('secondfile', 'r') as (f2 # second
):
pass
Run Code Online (Sandbox Code Playgroud)
仅限 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)
不幸的是,这种语法无法进行注释。
| 归档时间: |
|
| 查看次数: |
10797 次 |
| 最近记录: |