python——with语句和contextlib模块
with语句
创建上下文管理实际就是创建一个类,添加enter和exit方法。下面我们来实现open的上下文管理功能:
1 | class OpenContext(object): |
contextlib模块
上面我们自定义上下文管理器确实很方便,但是Python标准库还提供了更加易用的上下文管理器工具模块contextlib,它是通过生成器实现的,我们不需要再创建类以及enter和exit这两个特俗的方法:
1 | from contextlib import contextmanager |
在上文中,yield关键词把上下文分割成两部分:yield之前就是init中的代码块;yield之后其实就是exit中的代码块,yield生成的值会绑定到with语句as子句中的变量,例如在上面的例子中,yield生成的值是文件句柄对象fp,在下面的with语句中,会将fp和file_obj绑定到一起,也就是说file_obj此时就是一个文件句柄对象,那么它就可以操作文件了,因此就可以调用file_obj.write(“hello 666”),另外要注意的是如果yield没有生成值,那么在with语句中就不需要写as子句了
案例
1 | # _*_ coding:utf-8 _*_ |
这样在打印书名时,通过上下文管理器,会自动加上书名号