news 2026/2/8 9:05:58

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/2/6 19:00:35

InVivoMAb Anti-Mouse CD4:与同类型产品相比,成本效益显著

在现代生命科学研究中,抗体药物已成为探索免疫机制、开发新药和治疗疾病的重要工具。其中,InVivoMAb anti-mouse CD4 作为一款高纯度、高活性的单克隆抗体,广泛应用于小鼠模型中的免疫细胞功能研究,是众多科研人员不可或缺的实验工…

作者头像 李华
网站建设 2026/2/8 7:25:28

导师推荐9个降AIGC网站,千笔AI助你轻松降AI率

AI降重工具:让论文更自然,让学术更真实 随着人工智能技术的不断发展,越来越多的本科生在撰写论文时开始依赖AI写作工具。然而,这些工具生成的内容往往带有明显的AI痕迹,导致AIGC率偏高,影响论文的原创性和通…

作者头像 李华
网站建设 2026/2/7 14:02:39

7000长文:一文读懂Agent,大模型的下一站

什么是Agent?为什么是Agent? 大模型除了Chat外还能做什么用? 当我们将大型模型视为“核心调度器“时,它就变成了我们的Agent。借助任务规划、记忆及外部工具等能力,大型模型能够识别出应该执行的任务以及执行方式&am…

作者头像 李华
网站建设 2026/2/7 13:03:57

清华柔性存内计算芯片登Nature!智能柔性电子将低成本进入生活

生活中,我们口袋里的手机、手腕上的手表、甚至汽车里的导航仪,它们功能强大,形态却始终受制于坚硬的硅基芯片。如果想要让电子设备像创可贴一样贴在手背监测心率,或者像保鲜膜一样附着在机器人的关节上,就需要打破这种…

作者头像 李华