笔记-python的with用法

一、With语句是什么?

在编程中,有些任务需要在执行前进行设置,并在完成后进行清理。针对这种情况,Python的with语句提供了一种非常方便的处理方式。一个典型的例子是文件处理:需要打开一个文件句柄,从中读取数据,然后关闭文件句柄。

如果不使用with语句,代码可能如下:

file = open("/tmp/foo.txt")
data = file.read()
file.close()

这里存在两个问题:

  1. 可能会忘记关闭文件句柄;
  2. 如果读取数据时发生异常,没有进行处理。

处理异常的改进版本如下:

try:f = open('xxx')
except:print 'fail to open'exit(-1)
try:do something
except:do something
finally:f.close()

尽管这段代码运行良好,但过于冗长。

此时,with语句就显示出其优势。除了语法更优雅外,with还能很好地处理上下文环境产生的异常。

使用with的代码示例:

with open("/tmp/foo.txt") as file:data = file.read()

二、With如何工作?

紧跟with后面的表达式被求值后,返回的对象的__enter__()方法会被调用,此方法的返回值将被赋给as后的变量。当with后的代码块执行完毕后,将调用之前返回对象的__exit__()方法。

下面的例子具体说明了with是如何工作的:

class Sample:def __enter__(self):print("In __enter__()")return "Foo"def __exit__(self, type, value, trace):print("In __exit__()")def get_sample():return Sample()with get_sample() as sample:print("sample:", sample)

输出结果为:

In __enter__()
sample: Foo
In __exit__()

如你所见:1. __enter__()方法被执行;2. __enter__()方法返回的值——在这个例子中是“Foo”,被赋值给变量’sample’;3. 执行代码块,打印变量’sample’的值为“Foo”;4. __exit__()方法被调用。
with的强大之处在于它能处理异常。可能你已经注意到Sample类的__exit__方法有三个参数val, type和trace。这些参数在异常处理中非常有用。我们来修改一下代码,看看它是如何工作的。

class Sample:def __enter__(self):return selfdef __exit__(self, type, value, traceback):print("type:", type)print("value:", value)print("trace:", traceback)def do_something(self):bar = 1/0  # Intentional error for demonstrationreturn bar + 10with Sample() as sample:sample.do_something()

这个例子中,with后面的get_sample()变成了Sample()。这没有关系,只要紧跟with后面的语句所返回的对象有__enter__()__exit__()方法即可。在此例中,Sample()的__enter__()方法返回新创建的Sample对象,并赋给变量sample。

执行上述代码后:

type: <type 'exceptions.ZeroDivisionError'>
value: integer division or modulo by zero
trace: ... (traceback details omitted for brevity)

实际上,当with后的代码块抛出任何异常时,__exit__()方法都会被执行。正如例子所示,异常抛出时,与之关联的类型、值和堆栈跟踪传给__exit__()方法,因此抛出的ZeroDivisionError异常被打印出来。开发库时,清理资源、关闭文件等操作都可以放在__exit__()方法中。

此外,__exit__()除了用于清理工作外,还可用于监控和处理异常。注意其后面的几个参数。要跳过一个异常,只需让该函数返回True即可。

下面的样例代码跳过了所有的TypeError,而让其他异常正常抛出。

def __exit__(self, type, value, traceback):return isinstance(value, TypeError)

总之,with-as表达式极大地简化了每次编写finally的工作,这对保持代码的优雅性非常有帮助。
如果有多个项,我们可以这样写:

with open("x.txt") as f1, open('xxx.txt') as f2:do something with f1, f2

因此,Python的with语句提供了一个有效的机制,使代码更简洁,同时在产生异常时,清理工作变得更简单。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/33092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LDR6500U,让设备爱上“被骗”的充电速度!

在数字设备日新月异的今天&#xff0c;兼容性和充电效率已成为用户关注的核心焦点。尤其是随着电子设备市场的全球化发展&#xff0c;标准化的需求日益凸显。近期&#xff0c;欧洲联盟&#xff08;简称“欧盟”&#xff09;就电子设备充电接口问题做出了重要决策&#xff0c;要…

高校新生如何选择最优手机流量卡?

一年一度的高考已经结束了&#xff0c;愿广大学子金榜题名&#xff0c;家长们都给孩子准备好了手机&#xff0c;那么手机流量卡应该如何选择呢&#xff1f; 高校新生在选择手机流量卡时&#xff0c;需要综合考量流量套餐、费用、网络覆盖、售后服务等多方面因素&#xff0c;以下…

办理河南建筑工程乙级设计资质的流程与要点

办理河南建筑工程乙级设计资质的流程与要点 办理河南建筑工程乙级设计资质的流程与要点主要包括以下几个方面&#xff1a; 流程&#xff1a; 工商注册与资质规划&#xff1a;确保企业具有独立法人资格&#xff0c;完成工商注册&#xff0c;并明确乙级设计资质的具体要求&…

Java开发-实际工作经验和技巧-0001-PostgreSQL数据库存储磁盘满了重启以及应急措施

Java开发-实际工作经验和技巧-0001-PostgreSQL数据库存储磁盘满了重启以及应急措施 更多内容欢迎关注我&#xff08;持续更新中&#xff0c;欢迎Star✨&#xff09; Github&#xff1a;CodeZeng1998/Java-Developer-Work-Note 技术公众号&#xff1a;CodeZeng1998&#xff0…

【Unity Shader】片段着色器(Fragment Shader)的概念及其使用方法

在Unity和图形编程中&#xff0c;片段着色器&#xff08;Fragment Shader&#xff09;是渲染管线中的一个阶段&#xff0c;负责计算屏幕上每个像素&#xff08;片段&#xff09;的颜色和特性。片段着色器通常在顶点着色器和任何几何处理之后运行&#xff0c;是决定最终像素颜色…

用于射频功率应用的氮化铝电阻元件

EAK推出了新的厚膜氮化铝 &#xff08;AlN&#xff09; 电阻器和端接系列&#xff0c;以补充公司现有的产品。传统上&#xff0c;射频功率电阻元件采用氧化铍&#xff08;BeO&#xff09;陶瓷材料作为陶瓷基板;然而&#xff0c;由于国际上要求从产品中去除BeO的压力&#xff0c…

[HBM] HBM 国产进程, 国产HBM首次研发成功 (202406)

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解DDR》 AI 的火热浪潮带火了高带宽内存的需求&#xff0c;HBM已是存储市场耀眼的明星。目前市场上还没有国产HBM, 什么时候可以看到国产希望呢&#xff1f; 或许现在可以看到曙光了。 1. 设计端 1…

免费内网穿透工具 ,快解析内网穿透解决方案

在IPv4公网IP严重不足的环境下&#xff0c;内网穿透技术越来越多的被人们所使用&#xff0c;使用内网穿透技术的好处有很多。 1&#xff1a;无需公网ip 物以稀为贵&#xff0c;由于可用的公网IP地址越来越少&#xff0c;价格也是水涨船高&#xff0c;一个固定公网IP一年的成本…

全面讲解数字化采购:整体技术架构与最佳实践

在全球化和数字化浪潮的推动下&#xff0c;企业的采购流程正经历深刻变革。数字化采购通过引入先进的信息技术&#xff0c;优化供应链管理&#xff0c;提高采购效率&#xff0c;降低成本。本文将详细介绍数字化采购的整体技术架构&#xff0c;并分享最佳实践经验&#xff0c;帮…

Java中的大数据处理与分析架构

Java中的大数据处理与分析架构 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来讨论Java中的大数据处理与分析架构。随着大数据时代的到来&#xff0c…

JupyterLab使用指南(十): JupyterLab安全性与配置教程

文章目录 1. 生成详细的配置2. 安全策略2.1 使用 HTTPS 加密通信2.2 设置访问密码2.3 禁用 root 用户启动3. 修改配置文件4. 将 JupyterLab 作为后台进程运行4.1 使用 `nohup`4.2 使用 `systemd`1. 生成详细的配置 JupyterLab 的配置文件用于管理和定制 JupyterLab 的各种行为…

构建、标记和发布镜像

构建、标记和发布镜像 目录 构建镜像标记镜像发布镜像实践 设置构建镜像推送镜像 在本指南中&#xff0c;您将学习以下内容&#xff1a; 构建镜像&#xff1a;基于Dockerfile构建镜像的过程。标记镜像&#xff1a;为镜像命名的过程&#xff0c;这也决定了镜像的分发位置。发…

【TensorFlow深度学习】探讨未来深度学习与TensorFlow的发展趋势

探讨未来深度学习与TensorFlow的发展趋势 探讨未来深度学习与TensorFlow的发展趋势:塑造智能世界的科技前沿1. 深度学习技术的未来展望1.1 更强的模型可解释性1.2 高效的轻量化模型1.3 强化学习与自监督学习的融合2. TensorFlow的未来发展趋势2.1 更广泛的生态系统整合2.2 量子…

Jenkins nginx自动化构建前端vue项目

在现代的Web开发中&#xff0c;Vue.js已经成为一种非常流行的JavaScript框架。为了更高效地管理和部署Vue.js项目&#xff0c;使用自动化构建工具是至关重要的。Jenkins作为一款强大的持续集成和持续部署&#xff08;CI/CD&#xff09;工具&#xff0c;为我们提供了一种便捷的方…

海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow

一、介绍 海洋生物识别系统。以Python作为主要编程语言&#xff0c;通过TensorFlow搭建ResNet50卷积神经网络算法&#xff0c;通过对22种常见的海洋生物&#xff08;‘蛤蜊’, ‘珊瑚’, ‘螃蟹’, ‘海豚’, ‘鳗鱼’, ‘水母’, ‘龙虾’, ‘海蛞蝓’, ‘章鱼’, ‘水獭’, …

Apple - Media Playback Programming Guide

本文翻译整理自&#xff1a;Media Playback Programming Guide&#xff08;Updated: 2018-01-16 https://developer.apple.com/library/archive/documentation/AudioVideo/Conceptual/MediaPlaybackGuide/Contents/Resources/en.lproj/Introduction/Introduction.html#//apple_…

【office技巧】如何合并pdf并且添加目录页

所用工具&#xff1a;wps&#xff0c;acrobat reader 1.制作目录页 在wps里设置一级标题&#xff0c;二级标题&#xff0c;然后自动生成目录页&#xff0c;保存为pdf。 在acrobat reader里删除除了目录页之外的其他页面。 2.pdf合并 在acrobat reader里合并pdf。 注意有可能…

嵌入式项目开发中的需求开发控制流程

嵌入式项目的需求开发控制流程包括多个步骤&#xff0c;以确保项目能够按时、高质量地交付。以下是一个典型的嵌入式项目需求开发控制流程&#xff1a; 1. 项目启动 项目启动是项目的初始阶段&#xff0c;主要包括以下内容&#xff1a; 项目立项&#xff1a;确认项目的可行性…

边缘计算项目有哪些

边缘计算项目在多个领域得到了广泛的应用&#xff0c;以下是一些典型的边缘计算项目案例&#xff1a; 1. **智能交通系统**&#xff1a;通过在交通信号灯、监控摄像头等设备上部署边缘计算&#xff0c;可以实时分析交通流量&#xff0c;优化交通信号控制&#xff0c;减少拥堵&…

函数在PHP中是如何定义和使用的?

在PHP中&#xff0c;函数的定义和使用是编程中的重要概念。以下是详细的解释&#xff1a; 函数的定义 1&#xff1a;关键字&#xff1a;PHP函数通过使用function关键字来定义。 2&#xff1a;语法结构&#xff1a; function 关键字。函数名称&#xff08;必须是唯一的&…