Python多行with语句
用python中的创建多行Python多行with语句,python,python-3.x,multiline,with-statement,Python,Python 3.x,Multiline,With Statement,用python中的创建多行的干净方法是什么?我想用在一个中打开几个文件,但它足够右边,我想在多行中打开它。像这样: class Dummy: def __enter__(self): pass def __exit__(self, type, value, traceback): pass with Dummy() as a, Dummy() as b, Dummy() as c: pass 不幸的是,这是一个语法错误。所以我试了一下: with (Dumm
的干净方法是什么?我想用
在一个中打开几个文件,但它足够右边,我想在多行中打开它。像这样:
class Dummy:
def __enter__(self): pass
def __exit__(self, type, value, traceback): pass
with Dummy() as a, Dummy() as b,
Dummy() as c:
pass
不幸的是,这是一个语法错误。所以我试了一下:
with (Dummy() as a, Dummy() as b,
Dummy() as c):
pass
还有一个语法错误。然而,这是有效的:
with Dummy() as a, Dummy() as b,\
Dummy() as c:
pass
但是如果我想发表评论呢?这不起作用:
with Dummy() as a, Dummy() as b,\
# my comment explaining why I wanted Dummy() as c\
Dummy() as c:
pass
\
s的位置也没有明显变化
是否有一种干净的方法来创建一个多行,其中包含允许在其中添加注释的语句?这并不完全干净,但您可以这样做:
with Dummy() as a, Dummy() as b, (
#my comment
Dummy()) as c:
pass
没有语法错误,但它不是最干净的。您也可以这样做:
with Dummy() as a, Dummy() as b, Dummy(
#my comment
) as c:
pass
考虑不使用“<代码>中的注释> < /COD> < < /P> > P>这样做,这对我来说似乎是最微不足道的:
with open('firstfile', 'r') as (f1 # first
), open('secondfile', 'r') as (f2 # second
):
pass
鉴于您已经标记了Python 3,如果您需要在上下文管理器中散布注释,我将使用:
这相当于
with Dummy() as a, Dummy() as b, Dummy() as c:
这样做的好处是,您可以在循环中生成上下文管理器,而无需单独列出每个上下文管理器。文档给出了一个例子,如果您想打开一堆文件,并且文件名在列表中,您可以这样做
with ExitStack() as stack:
files = [stack.enter_context(open(fname)) for fname in filenames]
如果您的上下文管理器占用了太多的屏幕空间,您希望在它们之间放置注释,那么您可能有足够的空间来使用某种循环
正如不死先生在评论中提到的,PyPI上有一个名为contextlib2
。如果您使用的是Python2,那么可以使用ExitStack
的后端口实现
顺便说一句,你不能做这样事情的原因
with (
ThingA() as a,
ThingB() as b):
...
是因为(
也可以是上下文管理器表达式的第一个标记,而CPython的当前解析器在看到第一个时无法判断应该解析什么规则(
。这是的一个激励性示例,它引入了一个功能更强大的新解析器,因此您想要的语法可能很快就会存在。类似,但缩进不会触发:
在我看来,这仍然很难看,但至少它已经过关了。我会通过在with
语句之前或在行本身添加注释来保持简单易读:
#我的评论解释了为什么我想要Dummy()作为c
使用Dummy()作为a,Dummy()作为b\
Dummy()为c:#或在此处添加注释
通过
这在Python 3.9中是固定的
使用(Dummy()作为,
Dummy()作为b,
#我的评论解释了为什么我想要Dummy()作为c
Dummy()作为c):
通过
以下是它有效的证据:
Python 3.9.0a6 (default, Jun 20 2020, 14:52:53)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.15.0 -- An enhanced Interactive Python. Type '?' for help.
In [3]: with (open('x')
...: as f):
...: pass
...:
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-3-47d5a51db08b> in <module>
----> 1 with (open('x')
2 as f):
3 pass
4
FileNotFoundError: [Errno 2] No such file or directory: 'x'
In [4]:
Do you really want to exit ([y]/n)? y
wPython 3.8.2 (default, May 8 2020, 20:08:31)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.15.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: with (open('x')
...: as f):
...: pass
File "<ipython-input-1-e538abd13934>", line 2
as f):
^
SyntaxError: invalid syntax
Python 3.9.0a6(默认值,2020年6月20日,14:52:53)
有关详细信息,请键入“版权”、“信用”或“许可证”
IPython 7.15.0--增强的交互式Python。键入“?”以获取帮助。
[3]中:带(开('x'))
…:如图所示:
…:通过
...:
---------------------------------------------------------------------------
FileNotFoundError回溯(最近一次调用上次)
在里面
---->1带(打开('x'))
2(f):
三通
4.
FileNotFoundError:[Errno 2]没有这样的文件或目录:“x”
在[4]中:
是否确实要退出([y]/n)?y
wPython 3.8.2(默认,2020年5月8日,20:08:31)
有关详细信息,请键入“版权”、“信用”或“许可证”
IPython 7.15.0--增强的交互式Python。键入“?”以获取帮助。
[1]中:带(开('x'))
…:如图所示:
…:通过
文件“”,第2行
(f):
^
SyntaxError:无效语法
事实上,最大的问题是PEP-8是怎么说的,因为PEP-8限制行长度为80个字符,这就是为什么这样做的必要性。意见时间:PEP-8很好,但我认为80个字符的限制太低了。这是基于旧的终端限制,而不是人类的可用性。我不提倡使用300多个字符的行,b但是我对120-130左右没有问题。@TigerhawkT3我认为80个字符的限制也很低,但是当我在一个需要同时打开5个文件的项目中工作时,我看到了它的好处。能够看到每个文件要容易得多。我可能会对这个文件破例,尽管.PEP-8在多行中使用了``行延续符用
语句行,因为你不能使用隐式延续。但是,如果你想内联注释,这对你的情况没有什么帮助。有趣的事实:他就是OP。@DevShark这正是我想要的,但有没有一种方法不那么疯狂呢?这是我想知道的问题。有时我希望python能够说,“这一行的末尾有一个运算符,它要求后面有一些内容,所以我最好在下一行检查另一个操作数。“无意冒犯;我的乐趣来自@DevShark缺乏认识。但是,如果你经常只需要多给几分钟时间自己想一想,也许在问问题之前你可以这样做?要更加自信。”@你能解释一下这个答案有什么不好的地方吗?这样我可以改进我以后的答案吗?@Justin如果你经常在最后崩溃并提出一个问题后才发现问题,我可以建议你身边放一只橡皮鸭吗?;-)不管怎样,在网上发布一个问题很少是一件坏事,只要你自己简短地回答就行了
with (
open('firstfile', 'r')) as f1, ( # first
open('secondfile', 'r')) as f2: # second
pass
Python 3.9.0a6 (default, Jun 20 2020, 14:52:53)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.15.0 -- An enhanced Interactive Python. Type '?' for help.
In [3]: with (open('x')
...: as f):
...: pass
...:
---------------------------------------------------------------------------
FileNotFoundError Traceback (most recent call last)
<ipython-input-3-47d5a51db08b> in <module>
----> 1 with (open('x')
2 as f):
3 pass
4
FileNotFoundError: [Errno 2] No such file or directory: 'x'
In [4]:
Do you really want to exit ([y]/n)? y
wPython 3.8.2 (default, May 8 2020, 20:08:31)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.15.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: with (open('x')
...: as f):
...: pass
File "<ipython-input-1-e538abd13934>", line 2
as f):
^
SyntaxError: invalid syntax