python的with 语句作为 try/finally 编码范式的一种替代,用于对资源访问进行控制的场合,此文也是今晚看书产生的写博心态,基于一个写文件的小例子来撸一下with语句,能撸多远撸多远
常常我们会这么去写一个文件
try: f = open('ipython.txt','w') f.write("www.ipython.com") f.close()except IOError as err: print "file error:\n" + str(err)finally: if 'f' in locals(): f.close()
实际上with可以看起来优乐美很多
try: with open('ipython.txt','w') as f: f.write("www.ipython.me")except IOError as err: print "file error:\n" + str(err)
要使用 with 语句,首先要明白上下文管理器。有了上下文管理器,with 语句才能工作。
上下文管理协议(Context Management Protocol):包含方法 __enter__() 和 __exit__(),支持该协议的对象要实现这两个方法。
上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__() 和 __exit__() 方法。上下文管理器定义执行 with 语句时要建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。通常使用 with 语句调用上下文管理器,
也可以通过直接调用其方法来使用。
运行时上下文(runtime context):由上下文管理器创建,通过上下文管理器的 __enter__() 和__exit__() 方法实现,__enter__() 方法在语句体执行之前进入运行时上下文,__exit__() 在语句体执行完后从运行时上下文退出。with 语句支持运行时上下文这一概念。
上下文表达式(Context Expression):with 语句中跟在关键字 with 之后的表达式,该表达式要返回一个上下文管理器对象。
语句体(with-body):with 语句包裹起来的代码块,在执行语句体之前会调用上下文管理器的 __enter__() 方法,执行完语句体之后会执行 __exit__() 方法。
with语句的语法格式如下
with context [as var(x)]: with-body###这里 context 要返回一个上下文管理器对象,该对象并不赋值给 as 子句中的 var(x) ,如果指定了 as 子句的话,会将上下文管理器的 __enter__() 方法的返回值赋值给 var(x)。var(x) 可以是单个变量,或者由“()”括起来的元组(不能是仅仅由“,”分隔的变量列表,必须加“()”)。###不使用with的代码可能是这样的var = centext.__enter__()try: do_something(var)finally: context.__exit__()###上下文管理器协议允许将无聊的try...except...finally结构抽象到一个单独的类中,仅仅留下关注的do_something部分。#####try...finally常见的用法是释放资源。各种不同的情况实现相似:在__enter__阶段资源被获得,在__exit__阶段释放,如果抛出异常也被传递。正如文件操作,往往这是对象使用后的自然操作,内置支持使之很方便。###
? 转载保留版权:IT辰逸 ? 《Python with 语句浅析》 ? 本文链接地址:http://www.ipython.me/python/python-with-syntax.html ? 本文版权采取:BY-NC-SA 协议进行授权,转载注明出处。除IT-Tools、News以及特别标注,本站所有文章均为原创。 ? 如果喜欢可以:点此订阅本站
不曾见谁。则见朵花儿闪下来,好一惊。