位置: 编程技术 - 正文

Python 中的with关键字使用详解(python3 with语句)

编辑:rootadmin

推荐整理分享Python 中的with关键字使用详解(python3 with语句),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:python里的with语句,python中的with函数,python中with的用法简单来说,python中with的用法简单来说,python3 with语句,python中with的用法简单来说,python里的with语句,python的with关键字,内容如对您有帮助,希望把文章链接给更多的朋友!

在 Python 2.5 中, with 关键字被加入。它将常用的 try ... except ... finally ... 模式很方便的被复用。看一个最经典的例子:

在这段代码中,无论 with 中的代码块在执行的过程中发生任何情况,文件最终都会被关闭。如果代码块在执行的过程中发生了一个异常,那么在这个异常被抛出前,程序会先将被打开的文件关闭。

再看另外一个例子。

在发起一个数据库事务请求的时候,经常会用类似这样的代码:

如果将发起事务请求的操作变成可以支持 with 关键字的,那么用像这样的代码就可以了:

下面,详细的说明一下 with 的执行过程,并用两种常用的方式实现上面的代码。

with 的一般执行过程

一段基本的 with 表达式,其结构是这样的:

其中: EXPR 可以是任意表达式; as VAR 是可选的。其一般的执行过程是这样的:

计算 EXPR ,并获取一个上下文管理器。 上下文管理器的 __exit()__ 方法被保存起来用于之后的调用。 调用上下文管理器的 __enter()__ 方法。 如果 with 表达式包含 as VAR ,那么 EXPR 的返回值被赋值给 VAR 。 执行 BLOCK 中的表达式。 调用上下文管理器的 __exit()__ 方法。如果 BLOCK 的执行过程中发生了一个异常导致程序退出,那么异常的 type 、 value 和 traceback (即 sys.exc_info()的返回值 )将作为参数传递给 __exit()__ 方法。否则,将传递三个 None 。

将这个过程用代码表示,是这样的:

这个过程有几个细节:

如果上下文管理器中没有 __enter()__ 或者 __exit()__ 中的任意一个方法,那么解释器会抛出一个 AttributeError 。在 BLOCK 中发生异常后,如果 __exit()__ 方法返回一个可被看成是 True 的值,那么这个异常就不会被抛出,后面的代码会继续执行。

接下来,用两种方法来实现上面来实现上面的过程的吧。

Python 中的with关键字使用详解(python3 with语句)

实现上下文管理器类

第一种方法是实现一个类,其含有一个实例属性 db 和上下文管理器所需要的方法 __enter()__ 和 __exit()__ 。

了解 with 的执行过程后,这个实现方式是很容易理解的。下面介绍的实现方式,其原理理解起来要复杂很多。

使用生成器装饰器

在Python的标准库中,有一个装饰器可以通过生成器获取上下文管理器。使用生成器装饰器的实现过程如下:

第一眼上看去,这种实现方式更为简单,但是其机制更为复杂。看一下其执行过程吧:

Python解释器识别到 yield 关键字后, def 会创建一个生成器函数替代常规的函数(在类定义之外我喜欢用函数代替方法)。 装饰器 contextmanager 被调用并返回一个帮助方法,这个帮助函数在被调用后会生成一个 GeneratorContextManager 实例。最终 with 表达式中的 EXPR 调用的是由 contentmanager 装饰器返回的帮助函数。 with 表达式调用 transaction(db) ,实际上是调用帮助函数。帮助函数调用生成器函数,生成器函数创建一个生成器。 帮助函数将这个生成器传递给 GeneratorContextManager ,并创建一个 GeneratorContextManager 的实例对象作为上下文管理器。 with 表达式调用实例对象的上下文管理器的 __enter()__ 方法。 __enter()__ 方法中会调用这个生成器的 next() 方法。这时候,生成器方法会执行到 yield db 处停止,并将 db 作为 next() 的返回值。如果有 as VAR ,那么它将会被赋值给 VAR 。 with 中的 BLOCK 被执行。 BLOCK 执行结束后,调用上下文管理器的 __exit()__ 方法。 __exit()__ 方法会再次调用生成器的 next() 方法。如果发生 StopIteration 异常,则 pass 。 如果没有发生异常生成器方法将会执行 db.commit() ,否则会执行 db.rollback() 。

再次看看上述过程的代码大致实现:

总结

Python的 with 表达式包含了很多Python特性。花点时间吃透 with 是一件非常值得的事情。

一些其他的例子

锁机制

标准输出重定向

参考资料

The Python “with” Statement by Example

PEP

Python优化技巧之利用ctypes提高执行速度 首先给大家分享一个个人在使用python的ctypes调用c库的时候遇到的一个小坑这次出问题的地方是一个C函数,返回值是malloc生成的字符串地址。平常使用也

Python 如何访问外围作用域中的变量 在表达式中引用变量时,Python会按照如下的顺序遍历各个作用域,寻找该变量:当前函数作用域任何外围作用域(比如包含当前函数的其他函数)global

Python中使用asyncio 封装文件读写 前言和网络IO一样,文件读写同样是一个费事的操作。默认情况下,Python使用的是系统的阻塞读写。这意味着在asyncio中如果调用了f=file('xx')f.read()会阻塞

标签: python3 with语句

本文链接地址:https://www.jiuchutong.com/biancheng/385410.html 转载请保留说明!

上一篇:Python冒泡排序注意要点实例详解(python3 冒泡排序)

下一篇:Python优化技巧之利用ctypes提高执行速度(python最优化)

  • 个体户转到个人要多少税
  • 房地产开发企业资质等级有几个
  • 分公司亏损总公司可以弥补吗
  • 车辆使用费属于什么税收分类
  • 纯外贸出口企业出售固定
  • 公司刚成立没有收入但是有支出怎么记账
  • 装修行业专票的税率是多少
  • 销货退回的税务处理
  • 营改增后纳税人可以使用的发票种类有
  • 清算期间作为纳税年度
  • 小企业会计准则和一般企业会计准则的区别
  • 补缴所得税的账务处理
  • 应交税费明细分类账
  • 出口无法收汇怎么办
  • 小企业周转材料报废残值回收应计入管理费用
  • 每天现金日记账登记完以后应怎么对账
  • 跨期租金收入税怎么算
  • 收到红字发票会计处理
  • 企业未实际列支教育经费要纳税调整吗?
  • 消费税组成计税价格成本利润率
  • 出现一窗式比对失败,该纳税人没有防伪税控比对信息!
  • 客运服务是指
  • 期末未缴税额是负数用于抵扣如何填报
  • 最新定额是哪年
  • 资产负债表损益表现金流量表
  • 公司法人变更账务需要重新建立吗
  • 金融企业贷款利息收入确认
  • 企业的固定资产可以按照其价值和使用情况
  • 已认证的发票在哪里查
  • 发票打偏了是否罚款
  • 移动纸质发票
  • 网银企业证书年费入哪个科目
  • 广告费和业务宣传费
  • 银承到期后
  • win10远程连接win7密码正确,无法登陆
  • linux服务器常用命令
  • 辅导期一般纳税人可以抵扣进项吗
  • incognito.exe
  • 无偿赠送是否需要交个人所得税分哪些情况
  • vue app打包
  • 暂无支付能力的原因
  • 红字发票冲减的是当月收入吗
  • 让税务局代开的发票直接交纳的税金怎么做会计分录?
  • 自动驾驶的时候可以睡觉吗
  • php动态变量
  • 股东分红税率是20%还是25%
  • opencv拼接图片
  • 为什么要结转成本?
  • 土地增值税预缴计税依据
  • 小规模纳税人季度不超30万免增值税
  • 承兑汇票上能手写名字吗
  • 企业所得税计提的准备金可以扣除吗
  • 建筑劳务公司是什么性质
  • 应付职工薪酬的账务处理
  • 减免所得税额怎么做分录
  • 项目提前竣工借款合法吗
  • 库存商品什么时候确认收入
  • 支付资金占用费的承诺函怎么写
  • 增值税申报开具其他发票包含哪些
  • 为什么生产经营许可证要第三方代办
  • 什么是成品油发票
  • 公司支付给实习生的报酬如何税前扣除?
  • 股权转让 会计
  • Navicat for MySQL(mysql图形化管理工具)是什么?
  • innodb 结构
  • win7开机启动
  • windows2003文件服务器
  • 服务器centos版本选择
  • centos安装常用命令
  • centos 安装
  • win8.1的ie浏览器
  • [视频大小超过限制,无法查看]怎么打开
  • opengl mfc
  • android快捷键设置
  • Android alertDialog 动态添加edittext无法弹出键盘解决方案
  • 国税局调地方
  • 工会经费计税依据工资总额包括什么
  • 代扣代缴企业所得税会计分录
  • 公交爱心卡需要每年审吗
  • 在税务局代开增值税票如何入账?
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设