# 上下文管理器
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