python中的with上下文管理器
with 语句
with 语句是 Pyhton 提供的一种简化语法,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源。
在没有学习with的句法之前,通常我们都是使用try…finally语句,即使是在出现错误的情况下 也能运行某些清理代码。而今天学习的with语句就是对这些代码功能的一些简单封装。
with语句通常会使用在如下的几个环境之中:
- 打开关闭一个文件
- 释放一个锁
- 创建一个临时的代码补丁
- 在特殊环境下运行受保护的代码
那么,接下来我们就举打开关闭文件的例子说明:
我们先使用file()方法,看看两者之间有什么不同?
hosts=open('/etc/hosts')
try:for line in hosts:if line.startswith('#'): #startswith以‘#’结尾continueprint(line.strip())
finally:hosts.close()
上面的代码,我们是要打开位于/etc目录的hosts文件,使用file()方法之后,又手动调用close()关闭文件。
那么,使用with语句之后,我们可以重写为:
with open ('/etc/hosts') as hosts:for line in hosts:if line.startswith('#'): #startswith以‘#’结尾continueprint(line.strip())
with的执行过程:
在执行 with 语句时,首先执行 with 后面的 open 代码
执行完代码后,会将代码的结果通过 as 保存到 hosts 中
然后在下面实现真正要执行的操作
在操作后面,并不需要写文件的关闭操作,文件会在使用完后自动关闭
上下文管理器
任何实现了 _enter_(self) 和 _exit_(self,exc_type,exc_value,traceback) 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。显然,文件(file)对象也实现了上下文管理器协议。
从底层原理的角度来说,with语句的执行过程如下:
- 调用__enter__方法,任何返回值都会绑定到指定的as字句
- 执行内部代码块 调用__exit__方法
- 执行内部代码块 调用__exit__方法执行内部代码块 调用__exit__方法
我们可以模拟实现一个自己的文件类,让该类实现 _enter_() 和 _exit_() 方法。
class File():def __init__(self, filename, mode):self.filename = filenameself.mode = modedef __enter__(self):print("entering")self.f = open(self.filename, self.mode)return self.fdef __exit__(self, *args):print("will exit")self.f.close()
注:当我们打开文件时,就会自动调用_enter_,最终会返回该资源对象。当退出文件时,会自动调用__exit_方法,把文件关闭,做一些清理工作。
因为 File 类实现了上下文管理器,现在就可以使用 with 语句了。
with File('out.txt', 'w') as f:print("writing")f.write('哈哈哈,你好啊!')
contextlib模块
contextlib模块是实现上下文管理的另外一种方式,这个模块提供了与上下文管理器一起使用的辅助函数。它使用的是 contextmanager 装饰器,通过 yield 将函数分割成两部分,yield 之前的语句在\ enter 方法中执行,yield 之后的语句在 _exit_ 方法中执行。紧跟在 yield 后面的值是函数的返回值。
from contextlib import contextmanager@contextmanager
def my_open(path, mode):f = open(path, mode)yield ff.close()
使用:
with my_open('out.txt', 'w') as f:f.write("hello , the simplest context manager")
参考文献:
【Python】with及上下文管理器的原理和应用
Pythong高级编程(第二版)
python中的with上下文管理器相关推荐
- Python基础教程:上下文管理器 context manager(with...as...)
一.概念 上下文管理器:就是实现了上下文管理协议的对象.主要用于保存和恢复各种全局状态,关闭文件等.上下文管理器本身是一种装饰器. 上下文允许可以自动的开始和结束一些和事情.例如当利用with-as打 ...
- Python: try finally 与 上下文管理器简介
2019独角兽企业重金招聘Python工程师标准>>> 用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能 ...
- python with关键字_完全理解Python关键字with与上下文管理器
如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 "with" 关键字的语句,它通常用在什么场景呢?今天就来说说 with 和 上下文管理器. 对于系统资源如文件.数据 ...
- python 多态 锁_python 上下文管理器,多态,数据锁定与自省,
python 上下文管理器,多态,数据锁定与自省, 前文课题 通过装饰器来实现单例模式 通过类实现一个通用装饰器,皆可以装饰函数也可装饰类,即可有参也可无参 描述 new str repr call ...
- python上下文是什么_(1条消息)python使用@contextmanager来定义上下文管理器(一篇文章,彻底明白!码文并茂,简单明了)...
什么是上下文管理器? 上下文管理器是在Python2.5之后加入的功能,可以在方便的需要的时候比较精确地分配和释放资源, with便是上下文管理器的最广泛的应用 with open("tes ...
- python使用@contextmanager来定义上下文管理器(一篇文章,彻底明白!码文并茂,简单明了)和 yield 和 __enter__ 和 __exit__
什么是上下文管理器? 上下文管理器是在Python2.5之后加入的功能,可以在方便的需要的时候比较精确地分配和释放资源, with便是上下文管理器的最广泛的应用 with open("tes ...
- python语言使用什么语句实现上下文管理协议_Python 上下文管理器
上下文管理器 在使用Python编程中,可以会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后,需要继续执行一些收尾动作. 例如:当需要操作文件或数 ...
- python 什么是上下文管理器(ContextManager)?
上下文是 context 直译的叫法,在程序中用来表示代码执行过程中所处的前后环境.上下文管理器中有 enter 和 exit 两个方法,以with为例子,enter 方法会在执行 with 后面的语 ...
- Python中必须知道的知识点:上下文管理器
在Python中让自己创建的函数.类.对象支持with语句,就实现了上线文管理协议.我们经常使用with open(file, "a+") as f:这样的语句,无需手动调用f.c ...
最新文章
- 高校青椒为避免相亲重复,给没谈成的124个姑娘每人建了个文件夹...
- 辞职读博:研究AI设计怪物,从《游戏王》卡牌开始
- 【搜索专题】BFS中的多源BFS-双端队列BFS
- R语言|又来一个气泡图
- 如何避免操作系统中多线程资源竞争的互斥与同步?
- vue中使用MD5加密
- metasploit 快速入门(三) 服务端漏洞利用
- 四种Sandcastle方法生成c#.net帮助类帮助文档
- elasticsearch常见错误解决办法
- Zookeeper的前世今生
- [redis] 分布式 Redis 的 CRUD 实现
- mysql如何创建用户代码_MySQL创建用户与受权方法_mysql
- 《元宇宙的未来猜想和投资机遇分析 》
- 扇贝有道180911每日一句
- 无耗传输线 matlab,基于Matlab模块化的微波工程Smith圆图辅助教学方法
- 【django】短信验证码接口设计、互亿无线短信平台、后端逻辑、前端逻辑【16】
- Win10上注册OCX文件
- 台式计算机装机,DIY台式电脑装机教程之新手装机图解!手把手教你组装电脑
- 【正点原子FPGA连载】 第二十三章 EEPROM读写测试实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
- 前端开发 基础知识 dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算