# 上下文管理器

Python 的 with (opens new window) 语句支持由上下文管理器 (opens new window)定义的运行时上下文这一概念。

# 特殊方法

此对象的实现使用了一对特殊方法,允许用户自定义类来定义运行时上下文,在语句体被执行前进入该上下文,并在语句执行完毕时退出该上下文。典型用法包括保存和恢复各种全局状态,锁定和解锁资源,关闭打开的文件等等。

  • contextmanager._enter_ (opens new window)()

    进入与此对象相关的运行时上下文。

    with 语句将会绑定这个方法的返回值到 as 子句中指定的目标。

  • contextmanager._exit_ (opens new window)()

    退出关联到此对象的运行时上下文。

# with

with (opens new window) 语句用于包装带有使用上下文管理器 (opens new window)定义的方法的代码块的执行。

执行过程如下:

1、对上下文表达式进行求值来获得上下文管理器。
2、载入上下文管理器的 __enter__() 以便后续使用。
3、载入上下文管理器的 __exit__() 以便后续使用。
4、发起调用上下文管理器的 __enter__() 方法。
5、如果 with 语句中包含一个目标,来自 __enter__() 的返回值将被赋值给它。
6、执行语句体。
7、发起调用上下文管理器的 __exit__() 方法。
with EXPRESSION as TARGET:
    SUITE

如果有多个项目,则会视作存在多个 with (opens new window) 语句嵌套来处理多个上下文管理器。

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

# 在语义上等价于
with A() as a:
    with B() as b:
        SUITE

# 可以用圆括号包围的多行形式的多项目上下文管理器
with (
    A() as a,
    B() as b,
):
    SUITE