Python:contextlib模块——上下文管理器工具
2016-09-07 21:55
513 查看
上篇博文简单的讲了下with语句的用法以及上下文管理器对象的概念,想必对上下文管理器对象有一定的了解。一个对象如果实现了上下文管理协议,也就是在类中定义了__enter__()和__exit__()方法两个方法的对象,都可以称为上下文管理器对象。
但是,Python中有个contextlib模块,是个比with优美的东西,提供上下文机制的,它是通过Generator装饰器实现的,不再是采用__enter__和__exit__。
contextlib模块对外有三个接口,分别是contextlib.contextmanager,contextlib.nested,
contextlib.closing。
(1)contextlib.contextmanager
contextmanager装饰器,装饰的函数必须是一个生成器。然后返回一个函数,在函数调用的时候返回一个上下文管理器,是一种针对函数级别的上下文管理机制。常用方式如下:
enter
{}
exit
目前也没找到好的使用例子,以后有的话,会再贴上。
(2)contextlib.nested
nested为了一次调用多个上下文管理器的时候用,将所有上下文管理器里的__enter__放到vars里,一次yield返回,然后unpack。就产生多个对象了。__exit__都放到exits列表里,在finally里统一调用,这些__exit__在调用上下文管理器产生异常时,如何处理。如果返回false,将会把异常继续抛出,返回true则不会抛出异常。但是nested已经过时了,因为with已经可以通过多个上下文的直接嵌套了。用法如下例:
enter A
enter B
A
B
exit B
exit A
enter A
enter B
A
B
exit B
exit A
(3)contextlib.closing
文件类支持上下文管理器, 但是有一些对象不支持。还有一些类使用close()方法但是不支持上下文管理器,使用closing()来为他创建一个上下文管理器。就是把有close方法却没有__exit__方法的对象变成一个上下文管理器。
看下面代码:
但是,Python中有个contextlib模块,是个比with优美的东西,提供上下文机制的,它是通过Generator装饰器实现的,不再是采用__enter__和__exit__。
contextlib模块对外有三个接口,分别是contextlib.contextmanager,contextlib.nested,
contextlib.closing。
(1)contextlib.contextmanager
contextmanager装饰器,装饰的函数必须是一个生成器。然后返回一个函数,在函数调用的时候返回一个上下文管理器,是一种针对函数级别的上下文管理机制。常用方式如下:
#coding=utf-8 from contextlib import contextmanager @contextmanager def make_context() : print 'enter' try : yield {} except RuntimeError, err : print 'error' , err finally : print 'exit' with make_context() as value : print value输出结果:
enter
{}
exit
目前也没找到好的使用例子,以后有的话,会再贴上。
(2)contextlib.nested
nested为了一次调用多个上下文管理器的时候用,将所有上下文管理器里的__enter__放到vars里,一次yield返回,然后unpack。就产生多个对象了。__exit__都放到exits列表里,在finally里统一调用,这些__exit__在调用上下文管理器产生异常时,如何处理。如果返回false,将会把异常继续抛出,返回true则不会抛出异常。但是nested已经过时了,因为with已经可以通过多个上下文的直接嵌套了。用法如下例:
#coding=utf-8 from contextlib import contextmanager,nested @contextmanager def make_context(name) : print 'enter', name yield name print 'exit', name with nested(make_context('A'), make_context('B')) as (a, b) : print a print b with make_context('A') as a, make_context('B') as b : print a print b输出结果:
enter A
enter B
A
B
exit B
exit A
enter A
enter B
A
B
exit B
exit A
(3)contextlib.closing
文件类支持上下文管理器, 但是有一些对象不支持。还有一些类使用close()方法但是不支持上下文管理器,使用closing()来为他创建一个上下文管理器。就是把有close方法却没有__exit__方法的对象变成一个上下文管理器。
看下面代码:
from contextlib import closing class Door(object) : def open(self) : print 'Door is opened' def close(self) : print 'Door is closed' with closing(Door()) as door : door.open()
相关文章推荐
- Python contextlib模块使用示例
- 【编程语言】Python 使用包管理工具pip安装模块numpy、scipy、matplotlib以及scikit-learn CentOS 7
- Python contextlib模块使用示例
- 详解Python中contextlib上下文管理模块的用法
- python contextlib 上下文管理器
- Python学习笔记(三十八)— 内置模块(7)contextlib
- 安装完mysql-python后import加载模块 ImportError: libmysqlclient_r.so.16
- Python模块学习 ---- httplib HTTP协议客户端实现
- Python模块学习 ---- httplib HTTP协议客户端实现
- 转:python模块学习 ---- smtplib 邮件发送
- python 中的matplotlib.pylot 模块中的plot 用法
- python--httplib模块使用
- Python hashlib模块 (主要记录md5加密)
- 基于 Python Matplotlib 模块的高质量图形输出
- Python模块学习 ---- httplib HTTP协议客户端实现
- python的htmllib模块,
- c++开发python扩展模块:cannot open file ‘python25_d.lib’解决办法
- python模块之smtplib: 用python发送SSL/TLS安全邮件
- python模块之smtplib: 用python发送SSL/TLS安全邮件
- 安装完mysql-python后import加载模块 ImportError: libmysqlclient_r.so.16