Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python多行with语句_Python_Python 3.x_Multiline_With Statement - Fatal编程技术网

Python多行with语句

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

用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 (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