当前位置: 首页 > 面试题库 >

Python多行with语句

阎裕
2023-03-14
问题内容

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

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

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允许多行注释的多行语句?


问题答案:

这在Python 3.9中已修复!

https://github.com/we-like-parsers/pegen/issues/229

with (Dummy() as a,
        Dummy() as b,
        # my comment explaining why I wanted Dummy() as c
        Dummy() as c):
    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


 类似资料:
  • 问题内容: 我喜欢Python 2.7中多上下文语句的便利性: 但是,我需要保持与2.6的兼容性。 是通过引入到2.5的,但是在文档中找不到关于多上下文版本被反向移植到2.6的任何信息。 有什么我想念的吗? 编辑:我知道可以嵌套语句。我在问是否可以使用多个with语句。 问题答案: 如果没有向后兼容的等效方法,我将使多上下文语句成为一组单上下文嵌套语句来处理。 编辑以解决您的修改: 如果您坚持不嵌

  • 问题内容: 我试图了解这些之间是否存在差异,以及该差异可能是什么。 选项一: 选项二: 我知道,对于选项一,with块之后处于闭合状态。 问题答案: 我不知道为什么没有人提到这一点,因为这是工作方式的基础。与Python中的许多语言功能一样,在后台调用特殊方法,这些方法已经为内置Python对象定义,并且可以由用户定义的类覆盖。在特定情况下(和上下文管理器),方法是和。 请记住,在Python中,

  • 本文向大家介绍Python 的 with 语句详解,包括了Python 的 with 语句详解的使用技巧和注意事项,需要的朋友参考一下 一、简介 with是从Python 2.5 引入的一个新的语法,更准确的说,是一种上下文的管理协议,用于简化try…except…finally的处理流程。with通过__enter__方法初始化,然后在__exit__中做善后以及处理异常。对于一些需要预先设置,

  • 本文向大家介绍理解Python中的With语句,包括了理解Python中的With语句的使用技巧和注意事项,需要的朋友参考一下 With语句是什么? 有一些任务,可能事先需要设置,事后做清理工作。对于这种场景,Python的with语句提供了一种非常方便的处理方式。一个很好的例子是文件处理,你需要获取一个文件句柄,从文件中读取数据,然后关闭文件句柄。 如果不用with语句,代码如下: 这里有两个问

  • 问题内容: 我正在尝试使用原始sqlalchemy查询将值插入Postgres11数据库。通过psql- client运行以下SQL查询时,它可以正常运行: 所有行均正确插入: 但是,如果我在sqlalchemy中创建一个引擎,并使用相同的查询在其上调用execute,它会成功运行,但不会插入任何行: 但是没有插入新行: 通过psql-client运行查询与通过sqlalchemy执行查询有何不同

  • 问题内容: 我今天是第一次遇到Python 语句。我已经使用Python几个月了,甚至不知道它的存在!考虑到它的地位有些晦涩,我认为值得一问: 语句旨在用于什么? 你用它来做什么? 我需要了解任何陷阱,还是与其使用相关的常见反模式?有什么比这更好用的情况吗? 为什么没有更广泛地使用它? 哪些标准库类与之兼容? 问题答案: 我相信这已经在我之前的其他用户那里得到了回答,因此我仅出于完整性的考虑而添加