with:是用来启动对象的上下文管理器的,在调用with方法时,系统自动执行下文管理协议,自动调用__enter__和__exit__方法
上下文管理器协议:
__enter__:进入上下文管理器执行的方法
__exit__: 退出上下文管理器执行的方法
代码执行顺序:
在34行调用上下文管理协议时候,首先执行__enter__方法里面的代码,并将返回结果赋值给f,f就是执行__enter__方法返回的值,with中的代码执行完毕之后
最后执行退出方法__exit__方法
手动实现上下文管理器
输出:
exc_type的值: <class 'NameError'>
exc_val的值: name 'name' is not defined
exc_tb的值: <traceback object at 0x0000021822BA1BC8>