上下文管理器对象存在的目的是管理with语句

with 语句的目的是简化 try/finally 模式。这种模式用于保证一段代码运行完毕后执行某项操作,即便那段代码由于异常、return 语句或 sys.exit() 调用而中止,也会执行指定的操作。`finally 子句中的代码通常用于释放重要的资源,或者还原临时变更的状态。

上下文管理器协议包含__enter____exit__两个方法,with语句开始运行时,会在上下文管理器对象上吊用__enter__方法,结束后会调用__exit__方法

最常见的例子是确保关闭文件对象。使用 with 语句关闭文件

1
2
3
with open('a.txt','r') as f:
content = f.read()
print(content)

执行 with 后面的表达式得到的结果是上下文管理器对象,不过,把值绑定到目标变量上(as 子句)是在上下文管理器对象上调用 __enter__ 方法的结果。不管控制流程以哪种方式退出 with 块,都会在上下文管理器对象上调用 exit 方法,而不是在 enter 方法返回的对象上调用。

如果 __exit__ 方法返回True 之外的值,with 块中的任何异常都会向上冒泡。