Python 上下文管理器的 3 个有趣用法

Python 上下文管理器的 3 个有趣用法

💡 原文英文,约1200词,阅读约需5分钟。
📝

内容提要

本文介绍了使用上下文管理器高效处理资源的方法,包括数据库连接和子进程管理。上下文管理器提供了简洁的语法来设置和释放资源,减少资源泄漏的可能性。文章给出了具体示例,包括处理数据库连接、管理子进程和高精度浮点数运算。

🔎

延伸解读

嵌套 with 语句确保数据库资源彻底释放

文章示例中,数据库连接和游标分别用 with 语句管理,形成嵌套结构。内层 with 退出时游标自动关闭,外层 with 退出时连接自动关闭。这种写法将资源释放与代码块绑定,即使查询过程中出现异常,也能保证两者被正确清理,从而降低资源泄漏风险。

subprocess.Popen 作为上下文管理器自动清理子进程

使用 with 语句包裹 subprocess.Popen 创建的子进程,在代码块执行完毕后会自动释放子进程相关资源。示例中通过 communicate() 获取命令输出,退出 with 块后资源即被清理。这避免了手动调用 terminate 或 wait 的繁琐,但需注意上下文管理器不会自动终止仍在运行的子进程,仅确保资源释放。

localcontext() 临时调整精度,退出后恢复默认

decimal 模块的 localcontext() 返回上下文管理器,可在 with 块内修改当前线程的精度设置。示例将精度设为 40 位进行高精度除法,退出块后精度自动恢复为默认的 28 位。这种局部修改不影响其他代码,适合财务、传感器读数等需要临时高精度的场景。

❓

Q&A

Python 上下文管理器除了文件处理还能用在哪些地方?

上下文管理器还可用于管理数据库连接、子进程以及高精度浮点数运算。

如何用 with 语句管理数据库连接和游标?

使用 with 语句创建连接上下文,并在内部嵌套 with 语句创建游标上下文,这样连接和游标在退出上下文时会自动关闭,减少资源泄漏。

用 with 管理子进程有什么好处?

使用 with 语句管理 subprocess.Popen 创建的子进程,可以确保子进程相关的资源在退出上下文时被释放。

decimal 模块的 localcontext() 如何设置高精度?

localcontext() 返回一个上下文管理器,在 with 块内可以通过 cur_context.prec 设置精度,例如设为 40 位,退出后精度恢复默认的 28 位。

上下文管理器的基本结构是什么?

上下文管理器包含进入逻辑(在进入上下文时调用)和退出逻辑(在退出上下文时调用),用于资源的设置和释放。

使用上下文管理器管理数据库连接需要哪些步骤?

需要安装数据库连接器(如 psycopg2),解析配置文件获取连接参数,然后使用 with 语句管理连接和游标。

🏷️

标签

➡️

继续阅读