tensorflow 学习过程中,经常用到with,值得一说。
With
要搭配上下文管理器(Context Manager)对象使用。
所谓的上下文管理器对象,就是实现了上下文管理器协议(Context Manager Protocol)的对象。协议要求对象定义中必须实现__enter__()
和__exit__()
方法。
当看到下面语句时:
With Context Manager Object [as target]:
Body
它有4个意思:
- With块会在
Body
开始前自动调用Context Manager Object的__enter__()
方法; - With块会在
Body
结束前自动调用Context Manager Object的__exit__()
方法,即使Body
还未执行完时发生了异常,__exit__()
也总会被调用; Body
中出现异常时,Context Manager Object的__exit__()
执行如果返回False
,异常继续向上层抛出,如果返回True
则该异常被忽略;- 可选的
as target
并非是Context Manager Object本身,而是其调用__enter__()
的返回值;
总的来说,With语句帮助上下文管理器对象实现了两个自动化的操作enter和exit,并充分考虑了异常情况。对于资源类对象(用完需要尽快释放)的使用,比如文件句柄、数据库连接等等,这无疑是一种简洁而完善的代码形式。