赞
踩
从python2.6开始,with就成为默认关键字了。With是一个控制流语句,跟if for while try之类的是一类,with可以用来简化try-finally代码,看起来比try finally更清晰,所以说with用很优雅的方式处理上下文环境产生的异常。with关键字的用法如下:
1 2 |
|
该代码块的执行过程是:
1.先执行expression,然后执行该表达式返回的对象实例的__enter__函数,然后将该函数的返回值赋给as后面的变量。(注意,是将__enter__函数的返回值赋给变量)
2.然后执行with block代码块,不论成功,错误,异常,在with block执行结束后,会执行第一步中的实例的__exit__函数。
with 语句仅能工作于支持上下文管理协议(context management protocol)的对象。也就是说只有内建了”上下文管理”的对象才能和 with 一起工作。如果对象没有
__enter__、__exit__
属性,使用with语句就会报错AttributeError: __enter__。Python内置了一些支持该协议的对象,如下所列是一个简短列表:
file
decimal.Context
thread.LockType
threading.Lock
threading.RLock
threading.Condition
threading.Semaphore
threading.BoundedSemaphore
with connect
1.打开文件的例子
with-as语句最常见的一个用法是打开文件的操作,如下:
1 2 |
|
file对象支持支持上下文管理协议,并且可以推测出:
__exit__
属性中,一定回去执行file.close()
2.自定义
with语句后面的对象必须要有__enter__和__exit__方法,如下是一个自定义的例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
上述代码运行的结果如下:
**********
This is enter function
<type 'instance'>
Now, I am playing
coolboy
Now, you are exit
**********
分析以上代码: 一二行,执行open函数,该函数返回一个文件对象的实例,然后执行了该实例的__enter__函数,该函数返回此实例本身,最后赋值给file变量。从456句可以印证。
参考文章(侵权删)
Python with语句常见错误AttributeError: __enter___coco_1998_2的博客-CSDN博客
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。