千家信息网

Python with和上下文管理工具怎么用

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,这篇文章主要介绍了Python with和上下文管理工具怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python with和上下文管理工具怎么用文章都会有所收获,
千家信息网最后更新 2026年11月03日Python with和上下文管理工具怎么用

这篇文章主要介绍了Python with和上下文管理工具怎么用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python with和上下文管理工具怎么用文章都会有所收获,下面我们一起来看看吧。

前言

如果你有阅读源码的习惯,可能会看到一些优秀的代码经常出现带有 "with" 关键字的语句,它通常用在什么场景呢?今天就来说说 with 和 上下文管理器。

对于系统资源如文件、数据库连接、socket 而言,应用程序打开这些资源并执行完业务逻辑之后,必须做的一件事就是要关闭(断开)该资源。

比如 Python 程序打开一个文件,往文件中写内容,写完之后,就要关闭该文件,否则会出现什么情况呢?极端情况下会出现 "Too many open files" 的错误,因为系统允许你打开的最大文件数量是有限的。

同样,对于数据库,如果连接数过多而没有及时关闭的话,就可能会出现 "Can not connect to MySQL server Too many connections",因为数据库连接是一种非常昂贵的资源,不可能无限制的被创建。

来看看如何正确关闭一个文件。

普通版

def test1():

f = open("output.txt", "w")

f.write("python之禅")

f.close()

这样写有一个潜在的问题,如果在调用 write 的过程中,出现了异常进而导致后续代码无法继续执行,close 方法无法被正常调用,因此资源就会一直被该程序占用而无法被释放。那么该如何改进代码呢?

进阶版

def test2():

f = open("output.txt", "w")

try:

f.write("python之禅")

except IOError:

print("oops error")

finally:

f.close()

改良版本的程序是对可能发生异常的代码处进行 try 捕获,使用 try/finally 语句,该语句表示如果在 try 代码块中程序出现了异常,后续代码就不再执行,而直接跳转到 except 代码块。而无论如何,finally 块的代码最终都会被执行。因此,只要把 close 放在 finally 代码中,文件就一定会关闭。

高级版

def test3():

with open("output.txt", "w") as f:

f.write("Python之禅")

一种更加简洁、优雅的方式就是用 with 关键字。open 方法的返回值赋值给变量 f,当离开 with 代码块的时候,系统会自动调用 f.close() 方法, with 的作用和使用 try/finally 语句是一样的。那么它的实现原理是什么?在讲 with 的原理前要涉及到另外一个概念,就是上下文管理器(Context Manager)。

上下文管理器

任何实现了 __enter__() 和 __exit__() 方法的对象都可称之为上下文管理器,上下文管理器对象可以使用 with 关键字。显然,文件(file)对象也实现了上下文管理器。

那么文件对象是如何实现这两个方法的呢?我们可以模拟实现一个自己的文件类,让该类实现 __enter__() 和 __exit__() 方法。

class File():

def __init__(self, filename, mode):

self.filename = filename

self.mode = mode

def __enter__(self):

print("entering")

self.f = open(self.filename, self.mode)

return self.f

def __exit__(self, *args):

print("will exit")

self.f.close()

__enter__() 方法返回资源对象,这里就是你将要打开的那个文件对象,__exit__() 方法处理一些清除工作。

因为 File 类实现了上下文管理器,现在就可以使用 with 语句了。

with File('out.txt', 'w') as f:

print("writing")

f.write('hello, python')

这样,你就无需显式地调用 close 方法了,由系统自动去调用,哪怕中间遇到异常,close 方法也会被调用。

contextlib

Python 还提供了一个 contextmanager 的装饰器,更进一步简化了上下文管理器的实现方式。通过 yield 将函数分割成两部分,yield 之前的语句在 __enter__ 方法中执行,yield 之后的语句在 __exit__ 方法中执行。紧跟在 yield 后面的值是函数的返回值。

from contextlib import contextmanager

@contextmanager

def my_open(path, mode):

f = open(path, mode)

yield f

f.close()

调用:

with my_open('out.txt', 'w') as f:

f.write("hello , the simplest context manager")

关于"Python with和上下文管理工具怎么用"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"Python with和上下文管理工具怎么用"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。

上下 上下文 管理 方法 文件 代码 语句 对象 资源 程序 工具 管理工具 就是 系统 关键 关键字 内容 数据 数据库 知识 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网黑科技 互联网巨头反垄断金融科技 重庆互联网络科技 互联网 卓越科技 深圳天众互联网科技公司 镁科技互联网资讯平台 哈尔滨秒房互联网科技有限公司 重庆威客帮互联网科技 受益于互联网科技的高速发展 宝灵互联网科技有限公司 互联网科技革命什么开始 迪庆互联网科技招生 互联网科技和法律行业 中天科技中国工业互联网 江苏互联网智能科技软件 互联网科技包装股 广东鹅鹅鹅互联网科技有限公司 互联网科技职业技能培训学校 平安好医生打造互联网科技医疗 互联网 科技节活动 微视频大赛 互联网科技活动banner 互联网科技有限公司经营范围 科技互联网公司装修 易通互联网络科技有限公司 上海电发互联网科技有限公司 千方科技属于互联网企业吗 互联网相关科技技术 互联网金融运营模式中的金融科技 银川新华互联网科技学校是国营吗 互联网科技职业技能培训学校
0