没有合适的资源?快使用搜索试试~ 我知道了~
关于python的with语句使用with-as语句也有的人称为context manager
0 下载量 154 浏览量
2024-01-07
15:33:56
上传
评论
收藏 418KB DOC 举报
温馨提示
试读
22页
关于python的with语句使用,学习Python有一段时间了,最近做一个项目会涉及到文件的读取和关闭。比如:我想把一些对象序列化到文件里面,然后当我再次使用的时候,在从文件 里面读取反序列化成对象。像这种操作一般都是用try…except…finally。但是经过自己对Python的研究发现会有更出色的方法,比如:with-as语句也有的人称为context manager。
资源推荐
资源详情
资源评论
巧用 with 语句让 python 程序更优秀
概述
学习 Python 有一段时间了,最近做一个项目会涉及到文件的读取和关闭。
比如:我想把一些对象序列化到文件里面,然后当我再次使用的时候,在从文件
里面读取反序列化成对象。像这种操作一般都是用 try…except…finally。但是
经过自己对 Python 的研究发现会有更出色的方法,比如:with-as 语句也有
的人称为 context manager。
With-As
我们先看一下例子,当我们需要打开一个文件的时,比如: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、文件流、数据流等资源进行访问的场合,确保不管使用过程中是否发生
异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程
中锁的自动获取和释放等等。
with 语句的用法
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
with open('/etc/passwd', 'r') as f:
for line in f:
3
4
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 语句,请继续往下看。
Python 术语
Context Management Protocol(上下文管理协议):包含方法 __enter__() 和
__exit__(),支持该协议的对象要实现这两个方法。
上下文管理器(Context Manager):支持上下文管理协议的对象,这种对象
实现了__enter__() 和 __exit__() 方法。上下文管理器定义执行 with 语句时要
建立的运行时上下文,负责执行 with 语句块上下文中的进入与退出操作。通
常使用 with 语句调用上下文管理器,也可以通过直接调用其方法来使用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
context_manager = context_expression
exit = type(context_manager).__exit__
value = type(context_manager).__enter__(context_manager)
exc = True # True
表示正常执行,即便有异常也忽略;
False
表示重新抛出异常,需要对异常
进行处理
try:
try:
target = value #
如果使用了
as
子句
with-body #
执行
with-body
except:
#
执行过程中有异常发生
exc = False
#
如果
__exit__
返回
True
,则异常被忽略;如果返回
False
,则重新抛出异常
#
由外层代码对异常进行处理
if not exit(context_manager, *sys.exc_info()):
raise
剩余21页未读,继续阅读
资源评论
zz_ll9023
- 粉丝: 1060
- 资源: 5270
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功