python上下文管理协议,即with的详细使用
一、with obj as f:
#代码块...
二、执行流程:
1.with obj --->触发obj.__enter__(),需要在obj里写__enter__(self),在它里边写返回值,返回给 as f
2.with obj as f 等同于 f = obj.__enter__()
3.执行with代码块里的程序
4.执行正常时,顺序执行obj中的__exit__()方法,exc_type, exc_val, exc_tb的值都是None.
存在异常时,__exit__()方法中
a. return False返回假时,抛出系统异常。
b. return True 返回假时,吞掉系统异常,自己定制异常信息。
三、它的作用:自动清理/释放代码块中程序占用的资源,无须考虑这些问题
class Foo: def __init__(self,aa): self.aa = aa def __enter__(self): print('run enter') return self def __exit__(self, exc_type, exc_val, exc_tb): print('run exit') print(exc_type)#异常类 如:NameError print(exc_val)#异常值 如:name 'myname' is not defined print(exc_tb)#追踪信息 如:Traceback (most recent call last): xxxx return True with Foo(11) as cc: print(cc.aa) print(cc.ff) print('ssss')
常见的异常组成部分
Traceback (most recent call last):(追踪信息开始)
File "D:/workSpace/purePython3/异常.py", line 1, in <module>
myname(追踪信息结束)
NameError(异常类): name 'myname' is not defined(异常值)