python上下文管理器_Python:contextlib模块——上下文管理器工具

上篇博文简单的讲了下with语句的用法以及上下文管理器对象的概念,想必对上下文管理器对象有一定的了解。一个对象如果实现了上下文管理协议,也就是在类中定义了__enter__()和__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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值