- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
上下文管理器.pdf
上下⽂管理器
在 《⽂件(1)》中提到,如果要打开⽂件,⼀种⽐较好的⽅法使使⽤with语句,因为
这种⽅法,不仅 构简单,更重要的是不⽤再单独去判断某种异常情况,也不⽤专门
去执⾏⽂件关闭的指令了。
本节对这个有点神奇的with进⾏深⼊剖析。
概念
跟with相关的有⼀些概念,需要必须澄清。
上下⽂管理
如果把它作为⼀个概念来阐述,似乎有点多余,因为从字⾯上也可以有⼀丝的体会,
但是,我要说的是,那点直觉的体会不⼀定等于理性的严格定义,特别是周遭事物越
来越复杂的时候。
“上下⽂”的英⽂是context ,在⽹上检索了⼀下关于“上下⽂”的说法,发现没有什么严
格的定义,另外,不同的语⾔环境,对“上下⽂管理”有不同的说法。根据我个⼈的经
验和能看到的某些资料,我以为可以把“上下⽂”理解为某⼀些语句构成的⼀个环境
(也可以说使代码块),所谓“管理”就是要在这个环境中做⼀些事情,做什么事情
呢?就Python⽽⾔,是要将前⾯某个语句 (“上⽂” )⼲的事情独⽴成为对象,然后在
后⾯ (“下⽂” )中使⽤这个对象来做事情。
上下⽂管理协议
英⽂是Context Management Protocol ,既然使协议,就应该是包含某些⽅法的东西,⼤
家都按照这个去做 (协商好了的东西)。Python 中的上下⽂管理协议中必须包
含__enter__()和__exit__()两个⽅法。
看这个两个⽅法的名字,估计读者也能领悟⼀⼆了 (名字不是随便取的,这个某个岛
国取名字的⽅法不同,当然,现在⼈家也不是随便取了)。
上下⽂管理器
⽹上能够找到的最通常的说法是:上下⽂管理器使⽀持上下⽂管理协议的对象,这种
对象实现了__enter__()和__exit__()⽅法。
这个简洁⽽准确的定义,⼀般情况下⼀些⾼⼿使理解了。如果读者有疑惑,就说
明...,我还是要把⼀个⾼雅的定义通俗化更好⼀些。
在Python 中,下⾯的语句,也存在上下⽂,但它们使⼀⽓呵成执⾏的。
name = laoqi
if name == laoqi:
... print name
...
laoqi
if name == laoqi:
... for i in name:
... print i,
...
l a o q i
以上两个例⼦中,“上⽂”进⾏了判断,然后“下⽂”执⾏,从上⽽下,已经很通畅了。
还有不那么通畅的,就是下⾯的情况。
f = open(a.txt, w)
f.write(hello)
f.write(python)
f.close()
在这个⽰例中,当f = open(a.txt, w)之后,其实这句话并没有如同前⾯的
⽰例中那样被“遗忘” ,它是让计算机运⾏到⼀种状态——⽂件始终处于打开状态——
然后在这种状态中进⾏后⾯的操作,直到f.close()为⽌,这种状态才 束。
在这种情况下,我们就可以使⽤“上下⽂管理器” (英⽂:Context Manager ),⽤它来
获得“上⽂”状态对象,然后在“下⽂”使⽤它,并在整个过程执⾏完毕来收场。
更Python⼀点的说法,可以说是在某任务执⾏之初,上下⽂管理器做好执⾏准备,当
任务 (代码块)执⾏完毕或者中间出现了异常,上下⽂管理器负责 束⼯作。
这么好的⼀个东西,是Python2.5 以后才进来的。
必要性
刚才那个向⽂件中写⼊hello和python两个单词的⽰例,如果你觉得在⼯程中也可以这
样做,就⼤错特错了。因为它存在隐含的问题,⽐如在写⼊了hello之后,不知道什么
原因,后⾯的python不能写⼊了,最能说服你的是恰好遇到了“磁盘已满” ——虽然这
种情况的概率可能⽐抓奖券还还⼩,但作为严禁的程序员,使必须要考虑的,这也是
程序复杂之原因,这时候后⾯的操作就出现了异常,⽆法执⾏,⽂件也不能close 。解
决这个问题的⽅法使⽤try ... finally ...语句,读者⼀定能写出来。
不错,的确解决了。
问题继续,如果要从⼀个⽂件读内容,写⼊到另外⼀个⽂件中,下⾯的样⼦你觉得如
何?
⾸先建⽴⼀个⽂件,名称为2350 1.txt ,⾥⾯的内容如下:
$ cat 23 01.txt
hello laoqi
www .
然后写出下⾯的代码,实现上述⽬的:
# !/usr/bin/env python
# coding=utf-8
read_file = open(23 01.txt)
writ
您可能关注的文档
最近下载
- 因私出国(境)证件管理台账.docx VIP
- ISO 9001(DIS)-2026《质量管理体系要求》中英文标准对照版(雷泽佳编制-2025年9月).pdf VIP
- SMETA禁止骚扰暴力对待和虐待管理控制程序.pdf
- 碳减排管理概论课件 第五章 碳减排技术.pdf
- 市政道路排水工程施工组织设计.docx VIP
- 通过ISO 9001(DIS)-2026与ISO9001-2015英文标准比对研究变化(变化文本标识及变化内容说明-雷泽佳编辑-2025年9月).pdf VIP
- ISO 9001(DIS)-2026与ISO 9001-2015《质量管理体系要求》主要变化对比说明(雷泽佳编制-2025年9月).pdf VIP
- 生成式人工智能应用发展报告(2025).docx VIP
- ISO 9001.2-2025(CD2)《质量管理体系 要求》主要变化解读、分析和组织应对措施提示(雷泽佳编制-2025年3月).pdf VIP
- 蛋蛋白搅打过程中的四个阶段食品加工技术88课件.pptx VIP
原创力文档


文档评论(0)