news 2026/4/16 19:59:08

Python 的 with 语句:把「资源管理」这件事交给语法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 的 with 语句:把「资源管理」这件事交给语法

文章目录

    • 一、with 语句是干什么的?
    • 二、不用 with 会发生什么?
    • 三、传统解法:try / finally
    • 四、with 的本质:语法级 try / finally
    • 五、上下文管理器(Context Manager)
      • 5.1 一个最简单的例子
      • 5.2 `__enter__` 和 `__exit__` 到底干了什么?
    • 六、常见 with 使用场景
      • 6.1 文件操作(最常见)
      • 6.2 锁(多线程)
      • 6.3 数据库连接
      • 6.4 临时修改状态

Python里,你经常会看到这样的代码:
withopen(sql_file,'r',encoding='utf-8')asf:sql_content=f.read()

很多人知道它“更安全”,但并不真正清楚:

  • with到底解决了什么问题?
  • 它和try / finally有什么关系?
  • 自己能不能写一个with

这篇文章一次讲清楚。

一、with 语句是干什么的?

一句话概括:

with用来自动管理资源的“申请与释放

常见资源包括:

  • 文件
  • 网络连接
  • 数据库连接
  • 锁(Lock)
  • 临时状态

核心目标只有一个:
👉不管中间发生什么,最后一定能正确清理

二、不用 with 会发生什么?

以文件操作为例:

f=open("test.txt","r")content=f.read()f.close()

看起来没问题,但一旦中间出错:

f=open("test.txt","r")content=f.read()raiseException("boom")f.close()# 永远执行不到

资源泄漏风险立刻出现。

三、传统解法:try / finally

f=open("test.txt","r")try:content=f.read()finally:f.close()

✅ 安全
❌ 冗长
❌ 容易忘

四、with 的本质:语法级 try / finally

withopen("test.txt","r")asf:content=f.read()

等价于(简化版)👇

f=open("test.txt","r")try:content=f.read()finally:f.close()

👉with 只是把“模板代码”交给了语法

五、上下文管理器(Context Manager)

能被with使用的对象,必须满足一个条件:

实现上下文管理协议

也就是这两个方法:

__enter__()__exit__(exc_type,exc_val,exc_tb)

5.1 一个最简单的例子

classFileManager:def__init__(self,filename):self.filename=filenamedef__enter__(self):self.file=open(self.filename,"r")returnself.filedef__exit__(self,exc_type,exc_val,exc_tb):self.file.close()

使用:

withFileManager("test.txt")asf:print(f.read())

5.2__enter____exit__到底干了什么?

__enter__

  • with代码块开始前执行
  • 返回值绑定给as后的变量
withobj()asx:...# x 就是 obj.__enter__() 的返回值

__exit__

__exit__(exc_type,exc_val,exc_tb)
  • 代码块结束时一定执行
  • 不论是否发生异常
  • 可以选择是否“吞掉异常”
def__exit__(self,exc_type,exc_val,exc_tb):returnTrue# 异常被吞掉

👉 一般不建议吞异常

六、常见 with 使用场景

6.1 文件操作(最常见)

withopen("a.txt")asf:...

6.2 锁(多线程)

fromthreadingimportLock lock=Lock()withlock:...

6.3 数据库连接

withdb.connect()asconn:...

6.4 临时修改状态

withtempfile.TemporaryDirectory()astmp:...

👉点击进入我的网站

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 19:58:23

计算机毕业设计之springboot基于Java的在线考试系统设计与实现

时代在飞速进步,每个行业都在努力发展现在先进技术,通过这些先进的技术来提高自己的水平和优势,在线考试系统当然不能排除在外。在线考试系统是在实际应用和软件工程的开发原理之上,运用java语言,JSP技术以及SpringBoo…

作者头像 李华
网站建设 2026/4/16 12:05:55

蚂蚁开源世界模型LingBot-World:具有分钟级记忆的实时世界模拟器

蚂蚁集团旗下的具身智能公司灵波科技开源了两大重磅模型。 具身智能模型,最强开源机器人大脑!两万小时真机数据开启物理AI缩放定律。 以及强大的世界模型LingBot-World。 LingBot-World将视频生成模型进化成了可交互世界模拟器,让AI学会了理…

作者头像 李华
网站建设 2026/4/16 12:00:25

第二十一届全国大学生智能汽车竞赛天途亚龙智慧救援创意组赛项通知

01 智慧救援竞赛导读一、竞赛导读1.强化空地协同,要求无人机与智能车通过协作共同完成系列任务。2.不限定参赛设备的具体型号,允许参赛队对无人机、智能车、加装模块及部分场地交互机构进行自主设计与改装。3.为引导技术方向、避免“军备竞赛”&#xff…

作者头像 李华
网站建设 2026/4/16 2:57:23

简单理解:为什么有DCDC降压了,还需要LDO?

简单说:DC-DC 负责 “高效降压”,解决 “从高压降到低压的能耗问题”;LDO 负责 “精准稳压滤波”,解决 “DC-DC 输出有纹波、精度不足,满足不了精密芯片供电要求” 的问题。 二者是互补配合的关系,不是替代…

作者头像 李华