Python with 语句浅析

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以及特别标注,本站所有文章均为原创。 ? 如果喜欢可以:点此订阅本站

不曾见谁。则见朵花儿闪下来,好一惊。

Python with 语句浅析

相关文章:

你感兴趣的文章:

标签云: