news 2026/5/4 15:16:21

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/27 15:29:21

【保姆级教程】Python手搓“贾维斯”:一行代码打通GPT-5.2/Sora 2/Veo 3,拒绝API焦虑,这波赢麻了

摘要: 本文将带你从零开始 利用Python构建一个企业级的多模态AI中台 深度解析如何绕过复杂的网络环境和风控限制 通过向量引擎实现对GPT-5.2、Sora 2、Veo 3等顶级模型的统一调度 内含完整代码实现、架构分析及避坑指南 建议收藏后阅读 一、 程序员的至暗时刻与黎…

作者头像 李华
网站建设 2026/5/1 20:53:04

当所有流量都“上锁”:TLS/SSL解密为何是安全团队的“必备钥匙”?

为了防止敏感信息在传输过程中遭受恶意攻击者的窃取或修改,目前大部分的网络流量都是加密的。然而很多网络安全设备无法解密HTTPS流量或者需要占用大量计算资源,造成性能下降,这给恶意行为者提供了一席藏身之处以发起网络攻击。 TLS/SSL解密…

作者头像 李华
网站建设 2026/4/26 23:12:22

LangChain 从入门到实战 -六大组件之Agent_langchain agent_langchain的agent,零基础入门到精通,收藏这篇就够了

一、代理原理 代理的核心思想是使用语言模型来选择一系列操作。在链中,一系列操作是硬编码的。在代理中,语言模型被用作推理引擎来确定要采取哪些操作以及按什么顺序。 需要了解的重要概念: 需要了解的重要概念: AgentAction:表示代理应采取的操作。它有一个 tool 属性(要调…

作者头像 李华