python with语句_python中的with语句
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语句相关推荐
- python中if else语句_python 中if else 语句的作用及示例代码
引入:if-else的作用,满足一个条件做什么,否则做什么. if-else语句语法结构 if 判断条件: 要执行的代码 else: 要执行的代码 判断条件:一般为关系表达式或bool类型的值 执行过 ...
- python分支语句_Python中的分支语句和循环语句及案例
今天是清明假期的最后一天,依旧学习着 Python,老样子来写一篇博客.本篇博文介绍一下 Python 中的 if 条件语句.while 循环语句.for in 循环语句以及 break 和 cont ...
- python elif格式_python中elif 结构语句怎么判断?
if语句最基本的知识,相信小伙伴们已经学会了.有的小伙伴想挑战更高阶的使用,小编就考考大家,elif是什么呢?知道答案的小伙伴又会使用elif吗?当然,在if的基础上扩展,elif肯定是稍微难一点的. ...
- python中执行sql语句_python中执行sql语句
来源:疯狂的蚂蚁的博客 总结和整理 本文介绍了 Python 操作 MYSQL.执行 SQL 语句.获取结果集.遍历结果集.取得某个字 段.获取表字段名....... (游标 对象)用于执行查询和获取 ...
- python中else和if的结合语句_python中else和if的结合语句_python中的if-else语句和字典...
我刚开始编程.我正在做一个项目,在这个项目中,我计算出一篇文章或一部小说中出现了多少个单词,程序会打印出这个单词,以及它在文章中被重复了多少次.我在程序中使用词典.在 之后,我提示用户插入一个单词,程 ...
- python列表推导式中使用if语句及他们的等价形式
python列表推导式中使用if语句及他们的等价形式 在python的列表推导式中使用if语句有两种形式: # 方式1: 起过滤作用 [expr(x) for x in li if cond(x)] ...
- python的for语句用法_python中list循环语句用法实例
本文实例讲述了python中list循环语句用法.分享给大家供大家参考.具体用法分析如下: Python 的强大特性之一就是其对 list 的解析,它提供一种紧凑的方法,可以通过对 list 中的每个 ...
- elif在python中啥意思_python中elif 结构语句怎么判断?
if语句最基本的知识,相信小伙伴们已经学会了.有的小伙伴想挑战更高阶的使用,小编就考考大家,elif是什么呢?知道答案的小伙伴又会使用elif吗?当然,在if的基础上扩展,elif肯定是稍微难一点的. ...
- python中else什么意思_python中的else语句
python语言和其它语言一样在支持else语句,通常else语句和if语句合用,完成程序的分支选择功能. 例如如下打印学成成绩代码: score = int(input("请输入成绩:&q ...
最新文章
- 【Live555】live555源码详解系列笔记
- Android模拟器入门
- 17.4.28 清北第一天水题
- 河北省高校计算机大赛,河北省教育厅关于举办2016年华北五省(市、自治区)及港澳台大学生计算机应用大赛河北赛区竞赛的通知...
- 如何提取明细表头_如何在实际操作中应用偏移修剪?
- 千博企业网站管理系统源码 支持电脑和手机版
- mysql yum安装和 rpm安装_yum 和 rpm安装mysql彻底删除
- OpenCV精进之路(四):图像处理——图片的缩放和图像金字塔
- (转)韩同利:明年A股会有一个牛市
- 【集群仿真】基于matlab固定翼无人机集群仿真演示平台【含Matlab源码 1497期】
- 一个故意不通过图灵测试的人工智能
- UDP 协议报文格式
- SQL学习笔记——数据更新update语句的使用
- 如何在ASP.NET网络应用实现数据可视化图表
- 洛谷-P1478-陶陶摘苹果(升级版)
- php的登录页面怎么弄,php登录界面_php简单登录页面
- 提取视频中的音频 Python只需要三行代码!
- LINUX命令(1)-创建文件
- 地图导航开启蓝牙后无导航语音
- 【练习七 字符串编程题10. 炸弹】