首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Python的with 语句

With语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后关闭,线程中锁的获取和释放等。

术语

介绍一组与上下文管理器和with语句有关的概念。

上下文管理协议(Context Management Protocol):包含方法和,支持该协议的对象要实现这两个方法。

上下文管理器(Context Manager):支持上下文管理协议的对象,定义执行with语句时要建立的运行时上下文,负责执行with语句块上下文中的进入与退出操作。

运行时上下文(Runtime Context):由上下文管理器创建,通过上下文管理器的和方法实现。方法在语句体执行之前进入运行时上下文;在语句体执行完后从运行时上下文退出。

上下文表达式(Context Expression):with语句中关键字with的表达式,返回一个上下文管理器对象

语句体(With-Body):with语句下的代码块,在执行语句体之前会调用上下文管理器的方法,执行完语句体之后会执行方法。

基本语法

with语句的语法格式如下:

假设对一个文件进行操作,使用with语句,代码如下:

不管在处理文件过程中是否发生异常,都能保证with语句执行完之后关闭文件句柄。如果使用传统的try/finally范式,则代码如下:

相比较下,采用with语句可减少代码量。

工作原理

PEP 0343 对 with 语句的实现进行了描述。with 语句的执行过程类似如下代码块:

执行,生成上下文管理器

调用上下文管理器的方法;若使用了子句,则将方法的返回值赋值给子句中的。是单个变量,或者是元组(必须加“()”)

执行语句体

不管执行过程中是否发生异常,都会执行上下文管理器的方法。方法负责执行“清理”工作,如释放资源等。若执行过程中没有出现异常,或者语句体中执行语句 ,则以 作为参数调用 ;若执行过程中出现异常,则使用 得到的异常信息为参数调用

执行语句体出现异常,若返回,则重新抛出异常,,则忽略此异常,不再对异常进行处理。

自定义上下文管理器

开发人员可以自定义支持上下文管理协议的类,实现上下文管理协议所需的两个方法:和。

注意上下文管理器必须同时提供 和 方法的定义,缺少任何一个都会导致; 语句先检查是否定义了 方法,然后检查是否定义了方法。

下面通过一个简单的示例来演示如何构建自定义的上下文管理器。

使用自定义的支持语句的对象

运行结果如下;

正常执行时会先执行,再执行完语句体 ,最后执行 方法释放资源。

运行结果如下:

执行语句发生异常,语句体未执行完毕,但资源释放了,并抛出异常由之外代码逻辑来捕获处理。

可以自定义上下文管理器来对软件系统中的资源进行管理,比如数据库连接、共享资源的访问控制等。Python 在线文档 Writing Context Managers 提供了一个针对数据库连接进行管理的上下文管理器的简单范例。

其他

特别感谢这篇文章浅谈 Python 的 with 语句,让我基本了解了语句的用法。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180202G1E08H00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券