python中的with语句使用于对资源进行访问的场合,保证不管处理过程中是否发生错误或者异常都会执行规定的__exit__(“清理”)操作,释放被访问的资源,比如有文件读写后自动关闭、线程中锁的自动获取和释放等。

与python中with语句有关的概念有:上下文管理协议、上下文管理器、运行时上下文、上下文表达式、处理资源的代码段。

with语句的语法格式如下:

with context_expression [as target(s)]:

with-body

with语句的执行原理:

context_manager=context_expression

exit=type(context_manager).__exit__value=type(context_manager).__enter__(context_manager)

exc=Truetry:try:

targer=value

with-bodyexcept:

exc=Falseif not exit(context_manager, *sys.exc_info()):raise

finally:ifexc:

exit(context_manager,None,None,None)

从with的执行原理中可以看出,context_expression返回的对象中必须具有__exit__和__enter__两个方法,而且先检查__exit__方法在检查__enter__方法。无论在执行with-body中的函数体的过程中是否会发生异常,都会执行__exit__函数,如果没有异常,退出函数的中参数都为None;如果发生异常,则使用sys.exc_info()返回的异常信息为参数退出,并且当__exit__方法返回True时,忽略异常,当__exit__方法返回False时,抛出异常,此时,__exit__函数中就不需要再抛出异常,只需要将__exit__函数的返回值设为False就可以了。

例子:

自定义支持上下文管理协议的类:

不抛出异常的函数体:

抛出异常的函数体:

python提供了contextlib模块,省去了写__enter__和__exit__重复工作了。contextlib模块提供了3个对象:contextmanager装饰器、上下文管理器closing和nested函数。

装饰器contextmanager用来对生成器函数进行装饰,生成器函数被装饰以后,返回的是一个上下文管理器。

yield语句之前的代码在__enter__函数中执行,yield语句之后的代码在__exit__函数中执行。

closing上下文管理器包装起来的对象必须提供close()方法。

closing的执行原理如下:

classclosing(object):def __init__(self,thing):

self.thing=thingdef __enter__(self):returnself.thingdef __exit__(self, *exc_info):

self.thing.close()

因此,closing上下文管理器包装的对象必须提供close()函数。

nested函数可以将多个上下文管理器组织在一起,避免使用嵌套的with语句。

with nested(A(),B(),C()) as (X,Y,Z):

with-body

类似于:

with A() as X:

with B() as Y:

with C() as Z:

with-body

python with语句_python中的with语句相关推荐

  1. python中if else语句_python 中if else 语句的作用及示例代码

    引入:if-else的作用,满足一个条件做什么,否则做什么. if-else语句语法结构 if 判断条件: 要执行的代码 else: 要执行的代码 判断条件:一般为关系表达式或bool类型的值 执行过 ...

  2. python分支语句_Python中的分支语句和循环语句及案例

    今天是清明假期的最后一天,依旧学习着 Python,老样子来写一篇博客.本篇博文介绍一下 Python 中的 if 条件语句.while 循环语句.for in 循环语句以及 break 和 cont ...

  3. python elif格式_python中elif 结构语句怎么判断?

    if语句最基本的知识,相信小伙伴们已经学会了.有的小伙伴想挑战更高阶的使用,小编就考考大家,elif是什么呢?知道答案的小伙伴又会使用elif吗?当然,在if的基础上扩展,elif肯定是稍微难一点的. ...

  4. python中执行sql语句_python中执行sql语句

    来源:疯狂的蚂蚁的博客 总结和整理 本文介绍了 Python 操作 MYSQL.执行 SQL 语句.获取结果集.遍历结果集.取得某个字 段.获取表字段名....... (游标 对象)用于执行查询和获取 ...

  5. python中else和if的结合语句_python中else和if的结合语句_python中的if-else语句和字典...

    我刚开始编程.我正在做一个项目,在这个项目中,我计算出一篇文章或一部小说中出现了多少个单词,程序会打印出这个单词,以及它在文章中被重复了多少次.我在程序中使用词典.在 之后,我提示用户插入一个单词,程 ...

  6. python列表推导式中使用if语句及他们的等价形式

    python列表推导式中使用if语句及他们的等价形式 在python的列表推导式中使用if语句有两种形式: # 方式1: 起过滤作用 [expr(x) for x in li if cond(x)] ...

  7. python的for语句用法_python中list循环语句用法实例

    本文实例讲述了python中list循环语句用法.分享给大家供大家参考.具体用法分析如下: Python 的强大特性之一就是其对 list 的解析,它提供一种紧凑的方法,可以通过对 list 中的每个 ...

  8. elif在python中啥意思_python中elif 结构语句怎么判断?

    if语句最基本的知识,相信小伙伴们已经学会了.有的小伙伴想挑战更高阶的使用,小编就考考大家,elif是什么呢?知道答案的小伙伴又会使用elif吗?当然,在if的基础上扩展,elif肯定是稍微难一点的. ...

  9. python中else什么意思_python中的else语句

    python语言和其它语言一样在支持else语句,通常else语句和if语句合用,完成程序的分支选择功能. 例如如下打印学成成绩代码: score = int(input("请输入成绩:&q ...

最新文章

  1. 【Live555】live555源码详解系列笔记
  2. Android模拟器入门
  3. 17.4.28 清北第一天水题
  4. 河北省高校计算机大赛,河北省教育厅关于举办2016年华北五省(市、自治区)及港澳台大学生计算机应用大赛河北赛区竞赛的通知...
  5. 如何提取明细表头_如何在实际操作中应用偏移修剪?
  6. 千博企业网站管理系统源码 支持电脑和手机版
  7. mysql yum安装和 rpm安装_yum 和 rpm安装mysql彻底删除
  8. OpenCV精进之路(四):图像处理——图片的缩放和图像金字塔
  9. (转)韩同利:明年A股会有一个牛市
  10. 【集群仿真】基于matlab固定翼无人机集群仿真演示平台【含Matlab源码 1497期】
  11. 一个故意不通过图灵测试的人工智能
  12. UDP 协议报文格式
  13. SQL学习笔记——数据更新update语句的使用
  14. 如何在ASP.NET网络应用实现数据可视化图表
  15. 洛谷-P1478-陶陶摘苹果(升级版)
  16. php的登录页面怎么弄,php登录界面_php简单登录页面
  17. 提取视频中的音频 Python只需要三行代码!
  18. LINUX命令(1)-创建文件
  19. 地图导航开启蓝牙后无导航语音
  20. 【练习七 字符串编程题10. 炸弹】

热门文章

  1. VuePress 手摸手教你搭建一个类Vue文档风格的技术文档/博客
  2. 真是一分钱一分货 NVme SSD都有哪些优势?
  3. wsus问题之无法访问 WSUS 控制台
  4. oracle控制文件的损坏或完全丢失的恢复办法
  5. navicat如何导入sql文件
  6. C#学习笔记(六):可空类型、匿名方法和迭代器
  7. IBM存储部分常见配件PN号查询及描述翻译
  8. istio安装命令整理
  9. Scala 函数声明及调用案例详解
  10. linux获取cpu核数(线程数)