关于python的with语句使用.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
关于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)

xxj1658888 + 关注
实名认证
文档贡献者

教师资格证持证人

该用户很懒,什么也没介绍

领域认证 该用户于2024年04月12日上传了教师资格证

1亿VIP精品文档

相关文档