python语法之with语句

题记

with 语句用于包装带有使用上下文管理器,定义的方法的代码块的执行。 这允许对普通的 try…except…finally 使用模式进行封装以方便地重用。

用法

with_stmt ::=  "with" with_item ("," with_item)* ":" suite
with_item ::=  expression ["as" target]

带有一个“项目”的 with 语句的执行过程如下:

  • 对上下文表达式 (在 with_item 中给出的表达式) 求值以获得一个上下文管理器。
  • 载入上下文管理器的 exit() 以便后续使用。
  • 发起调用上下文管理器的 enter() 方法。
  • 如果 with 语句中包含一个目标,来自 enter() 的返回值将被赋值给它。

注解 with 语句会保证如果 enter() 方法返回时未发生错误,则 exit() 将总是被调用。 因此,如果在对目标列表赋值期间发生错误,则会将其视为在语句体内部发生的错误。 参见下面的第 6 步。

  • 执行语句体。
  • 发起调用上下文管理器的 exit() 方法。 如果语句体的退出是由异常导致的,则其类型、值和回溯信息将被作为参数传递给 exit()。 否则的话,将提供三个 None 参数。

如果语句体的退出是由异常导致的,并且来自 exit() 方法的返回值为假,则该异常会被重新引发。 如果返回值为真,则该异常会被抑制,并会继续执行 with 语句之后的语句。

如果语句体由于异常以外的任何原因退出,则来自 exit() 的返回值会被忽略,并会在该类退出正常的发生位置继续执行。

如果有多个项目,则会视作存在多个 with 语句嵌套来处理多个上下文管理器:

with A() as a, B() as b:
    suite

等价于

with A() as a:
    with B() as b:
        suite

在 3.1 版更改: 支持多个上下文表达式。

with 语句上下文管理器

上下文管理器 是一个对象,它定义了在执行 with 语句时要建立的运行时上下文。 上下文管理器处理进入和退出所需运行时上下文以执行代码块。 通常使用 with 语句(在 with 语句 中描述),但是也可以通过直接调用它们的方法来使用。

上下文管理器的典型用法包括保存和恢复各种全局状态,锁定和解锁资源,关闭打开的文件等等。

要了解上下文管理器的更多信息,请参阅 Context Manager Types

object.__enter__(self)
  进入与此对象相关的运行时上下文。 with 语句将会绑定这个方法的返回值到 as 子句中指定的目标,如果有的话。

object.__exit__(self, exc_type, exc_value, traceback)
  退出关联到此对象的运行时上下文。 各个参数描述了导致上下文退出的异常。 如果上下文是无异常地退出的,三个参数都将为 None。

  如果提供了异常,并且希望方法屏蔽此异常(即避免其被传播),则应当返回真值。 否则的话,异常将在退出此方法时按正常流程处理。

  请注意 __exit__() 方法不应该重新引发被传入的异常,这是调用者的责任。

场景

当处理一个文件对象时, 使用 with 关键字是非常好的方式。在结束后, 它会帮你正确的关闭文件。 而且写起来也比 try - finally 语句块要简短:

>>> with open('/tmp/foo.txt', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

参考文档
Python Software Foundation
Python3 输入和输出

本站所有文章除特殊声明外均为原创,未经允许禁止转载!
换个声音
停止播放