- 3
- 0
- 约1.27万字
- 约 22页
- 2017-05-27 发布于河南
- 举报
关于python的with语句使用
巧用with语句让python程序更优秀
概述
学习Python有一段时间了,最近做一个项目会涉及到文件的读取和关闭。比如:我想把一些对象序列化到文件里面,然后当我再次使用的时候,在从文件里面读取反序列化成对象。像这种操作一般都是用try…except…finally。但是经过自己对Python的研究发现会有更出色的方法,比如:with-as语句也有的人称为context manager。
我们先看一下例子,当我们需要打开一个文件的时,比如:txt等,一般经常会这么操作:
1
2
3
4
5
6
7 try:
????f = file.open(test.txt,rw)
????To Do
except:
????To Do
finally:
????f.close() 这是错误,因为file.open是否打开文件是不确定,而在出现异常的时候你却关闭了已经打开的文件。文件没有打开怎么能直接关闭呢?你可以按照下面的解决方法来解决上述出现的问题。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 try:
????f = file.open(test.txt,rw)
????To Do
except:
????To Do
????//出现异常直接返回或者退出,这说明file并没有打开。
????return/exit(-1)
?
//已经成功打开file文件,所以你需要在finally中关闭打开的文件。
try:
????To Do
except:
????To Do
finally:
????f.close() 你会发现这么做会非常麻烦,并且try……except…..finally嵌套也比较啰嗦。那有没有好的解决办法能解决上述问题,并且还能减少代码量呢?(类似于C#中的using关键字)答案是肯定的,那就是with…….as语句。With语句适用于对I/O、文件流、数据流等资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取和释放等等。
1
2 with expression [as variable]:
????with-block 表达式被计算(求值)依赖一个支持Context Management Protocol(必须包含:__enter__()和__exit__()的方法) 的对象。因为expression返回一个Context Manager(上下文管理器)对象,如果指定了as variable会将上下文管理器对象__enter__()?方法的返回值赋值给variable;如果没有指定as variable则丢弃?。with -block在执行语句体之前会调用上下文管理器的__enter__()?方法,执行完语句体之后会执行?__exit__()?方法,即使代码出现异常也会运行“清理”代码。
例如如下代码:
1
2
3
4 with open(/etc/passwd, r) as f:
????for line in f:
????????print line
????????... more processing code ... 这个语句执行完成之后,不管在处理文件过程中是否发生异常,都能保证 with 语句执行完毕后已经关闭了打开的文件句柄,确实比try……except……finally好多了。在这个例子中f就是上下文管理器__enter__()的返回值,返回的是当前文件自身的引用。Python内建对象都加入了对上下文管理器的支持,可以用在with语句中。比如:file、 threading、decimal等等,在多线程模块中,lock和条件变量也是支持with语句的。例如:
1
2
3
4 lock = threading.Lock()
with lock:
????# Critical section of code
????... 在代码执行之前lock总是先获得,只要block代码完成lock就会被释放。要想彻底了解Python的With-As语句,请继续往下看。
Context Management Protocol(上下文管理协议):包含方法?__enter__() 和 __exit__(),支持该协议的对象要实现这两个方法。
上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象实现了__enter__() 和 __exit__()?方法。上下文管理器定义执行 with 语句时要建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。通常使用 with 语句调用上下文管理器,也可以通过直接调用其方法来使用。
1
2
3
4
5
6
7
原创力文档

文档评论(0)