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的执行过程:

  1. 在执行 with 语句时,首先执行 with 后面的 open 代码

  2. 执行完代码后,会将代码的结果通过 as 保存到 hosts 中

  3. 然后在下面实现真正要执行的操作

  4. 在操作后面,并不需要写文件的关闭操作,文件会在使用完后自动关闭

上下文管理器

任何实现了 _enter_(self) 和 _exit_(self,exc_type,exc_value,traceback) 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。显然,文件(file)对象也实现了上下文管理器协议。

从底层原理的角度来说,with语句的执行过程如下:

  1. 调用__enter__方法,任何返回值都会绑定到指定的as字句
  2. 执行内部代码块 调用__exit__方法
  3. 执行内部代码块 调用__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上下文管理器相关推荐

  1. Python基础教程:上下文管理器 context manager(with...as...)

    一.概念 上下文管理器:就是实现了上下文管理协议的对象.主要用于保存和恢复各种全局状态,关闭文件等.上下文管理器本身是一种装饰器. 上下文允许可以自动的开始和结束一些和事情.例如当利用with-as打 ...

  2. Python: try finally 与 上下文管理器简介

    2019独角兽企业重金招聘Python工程师标准>>> 用 Python 做一件很平常的事情: 打开文件, 逐行读入, 最后关掉文件; 进一步的需求是, 这也许是程序中一个可选的功能 ...

  3. python with关键字_完全理解Python关键字with与上下文管理器

    如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 "with" 关键字的语句,它通常用在什么场景呢?今天就来说说 with 和 上下文管理器. 对于系统资源如文件.数据 ...

  4. python 多态 锁_python 上下文管理器,多态,数据锁定与自省,

    python 上下文管理器,多态,数据锁定与自省, 前文课题 通过装饰器来实现单例模式 通过类实现一个通用装饰器,皆可以装饰函数也可装饰类,即可有参也可无参 描述 new str repr call ...

  5. python上下文是什么_(1条消息)python使用@contextmanager来定义上下文管理器(一篇文章,彻底明白!码文并茂,简单明了)...

    什么是上下文管理器? 上下文管理器是在Python2.5之后加入的功能,可以在方便的需要的时候比较精确地分配和释放资源, with便是上下文管理器的最广泛的应用 with open("tes ...

  6. python使用@contextmanager来定义上下文管理器(一篇文章,彻底明白!码文并茂,简单明了)和 yield 和 __enter__ 和 __exit__

    什么是上下文管理器? 上下文管理器是在Python2.5之后加入的功能,可以在方便的需要的时候比较精确地分配和释放资源, with便是上下文管理器的最广泛的应用 with open("tes ...

  7. python语言使用什么语句实现上下文管理协议_Python 上下文管理器

    上下文管理器 在使用Python编程中,可以会经常碰到这种情况:有一个特殊的语句块,在执行这个语句块之前需要先执行一些准备动作:当语句块执行完成后,需要继续执行一些收尾动作. 例如:当需要操作文件或数 ...

  8. python 什么是上下文管理器(ContextManager)?

    上下文是 context 直译的叫法,在程序中用来表示代码执行过程中所处的前后环境.上下文管理器中有 enter 和 exit 两个方法,以with为例子,enter 方法会在执行 with 后面的语 ...

  9. Python中必须知道的知识点:上下文管理器

    在Python中让自己创建的函数.类.对象支持with语句,就实现了上线文管理协议.我们经常使用with open(file, "a+") as f:这样的语句,无需手动调用f.c ...

最新文章

  1. 高校青椒为避免相亲重复,给没谈成的124个姑娘每人建了个文件夹...
  2. 辞职读博:研究AI设计怪物,从《游戏王》卡牌开始
  3. 【搜索专题】BFS中的多源BFS-双端队列BFS
  4. R语言|又来一个气泡图
  5. 如何避免操作系统中多线程资源竞争的互斥与同步?
  6. vue中使用MD5加密
  7. metasploit 快速入门(三) 服务端漏洞利用
  8. 四种Sandcastle方法生成c#.net帮助类帮助文档
  9. elasticsearch常见错误解决办法
  10. Zookeeper的前世今生
  11. [redis] 分布式 Redis 的 CRUD 实现
  12. mysql如何创建用户代码_MySQL创建用户与受权方法_mysql
  13. 《元宇宙的未来猜想和投资机遇分析 》
  14. 扇贝有道180911每日一句
  15. 无耗传输线 matlab,基于Matlab模块化的微波工程Smith圆图辅助教学方法
  16. 【django】短信验证码接口设计、互亿无线短信平台、后端逻辑、前端逻辑【16】
  17. Win10上注册OCX文件
  18. 台式计算机装机,DIY台式电脑装机教程之新手装机图解!手把手教你组装电脑
  19. 【正点原子FPGA连载】 第二十三章 EEPROM读写测试实验-摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
  20. 前端开发 基础知识 dpi 、 dip 、分辨率、屏幕尺寸、px、density 关系以及换算

热门文章

  1. webfunny前端监控
  2. Spring Cloud Gateway介绍(一)
  3. 自动超频_AMD自动超频工具问世:让ZEN2处理器性能上涨、功耗下降
  4. 合并多个word的代码_快速合并多个word文档内容,别再复制粘贴了!
  5. zsh配置其显示当前文件路径
  6. Spring 概念及特点 Spring下载地址 控制反转IoC实现原理
  7. 高效的 JavaScript
  8. C++ Tricks
  9. day1---python的基础特性
  10. 实现ISA Server 2006物理机到VMware ESX 4虚拟机的迁移