Python中的上下文管理器(contextlib模块)

mac2022-06-30  105

上下文管理器的任务是:代码块执行前准备,代码块执行后收拾

1 如何使用上下文管理器:

打开一个文件,并写入"hello world"

filename="my.txt" mode="w" f=open(filename,mode) f.write("hello world") f.close()

当发生异常时(如磁盘写满),就没有机会执行第5行。当然,我们可以采用try-finally语句块进行包装:

writer=open(filename,mode) try: writer.write("hello world") finally: writer.close()

当我们进行复杂的操作时,try-finally语句就会导致代码不易读,采用with语句重写:

with open(filename,mode) as writer: writer.write("hello world")
2 自定义上下文管理器

with语句的作用类似于try-finally,提供一种上下文机制。要应用with语句的类,其内部必须提供两个内置函数__enter__和__exit__。前者在主体代码执行前执行,后者在主体代码执行后执行。as后面的变量,是在__enter__函数中返回的。

class echo(): def output(self): print "hello world" def __enter__(self): print "enter" return self #可以返回任何希望返回的东西 def __exit__(self,exception_type,value,trackback): print "exit" if exception_type==ValueError: return True else: return Flase >>>with echo as e: e.output() 输出: enter hello world exit
3 contextlib模块 

contextlib模块的作用是提供更易用的上下文管理器,它是通过Generator实现的。contextlib中的contextmanager作为装饰器来提供一种针对函数级别的上下文管理机制,常用框架如下:

from contextlib import contextmanager @contextmanager def make_context(): print 'enter' try: yield "ok" except RuntimeError,err: print 'error',err finally: print 'exit' >>>with make_context() as value: print value 输出为: enter ok exit

其中,yield写入try-finally中是为了保证异常安全(能处理异常)as后的变量的值是由yield返回。yield前面的语句可看作代码块执行前操作,yield之后的操作可以看作在__exit__函数中的操作。

file类直接支持上下文管理器API,但有些表示打开句柄的对象并不支持,如urllib.urlopen()返回的对象。还有些遗留类,使用close()方法而不支持上下文管理器API。为了确保关闭句柄,需要使用closing()为它创建一个上下文管理器(调用类的close方法)。

转载于:https://www.cnblogs.com/bind/p/11512547.html

相关资源:详解Python中contextlib上下文管理模块的用法
最新回复(0)