讲师中心 微信公众号
AI工具推荐 视频效率加速

上下文管理器揭秘:简化 Python 中的资源处理

阿丽酱_2969

阿丽酱_2969

发布时间:2024-11-16 10:00:11

|

423人浏览过

|

来源于dev.to

转载

上下文管理器揭秘:简化 python 中的资源处理

简介...

python 中的上下文管理器是一个强大的工具,可让您以安全有效的方式管理资源的设置和拆卸。它们提供了一种方法来确保资源正确初始化、使用和清理,即使面对异常或意外的控制流也是如此。

使用上下文管理器的主要好处是它们可以帮助您编写更健壮、可维护的 python 代码。通过封装资源管理逻辑,上下文管理器可以更轻松地确保资源得到正确处理,从而降低资源泄漏或状态不一致的风险。

常见用例

上下文管理器的一些常见用例包括:

  • 文件处理(例如,open())
  • 数据库连接
  • 锁定机制
  • 临时目录管理
  • 分析和计时代码执行

with 语句

在 python 中使用上下文管理器的主要方法是使用 with 语句。 with 语句提供了使用上下文管理器的便捷语法,使您可以专注于代码的核心逻辑,而不用担心资源管理。

立即学习“Python免费学习笔记(深入)”;

以下是使用 with 语句打开文件的示例:

with open('data.txt', 'r') as file:
    content = file.read()
    print(content)

当退出 with 块时,无论是正常退出还是由于异常,都会自动调用上下文管理器的 __exit__() 方法,确保文件正确关闭。

实现自定义上下文管理器

要创建自定义上下文管理器,您需要定义一个具有两个特殊方法的类:__enter__() 和 __exit__()。 __enter__() 方法负责设置资源,而 __exit__() 方法负责清理资源。

以下是管理 postgresql 数据库连接的自定义上下文管理器的示例:

import psycopg2

class postgresmanager:
    def __init__(self, host, port, database, user, password):
        self.host = host
        self.port = port
        self.database = database
        self.user = user
        self.password = password
        self.conn = none

    def __enter__(self):
        self.conn = psycopg2.connect(
            host=self.host,
            port=self.port,
            database=self.database,
            user=self.user,
            password=self.password
        )
        return self.conn

    def __exit__(self, exc_type, exc_value, traceback):
        if self.conn:
            if exc_type is none:
                self.conn.commit()
            else:
                self.conn.rollback()
            self.conn.close()
        return false

在这个例子中,__enter__()方法使用提供的连接参数建立到postgresql数据库的连接,__exit__()方法负责提交或回滚事务,具体取决于是否发生异常,然后关闭连接。

__exit__() 方法接收三个参数:exc_type、exc_value 和traceback,它们提供有关 with 块中发生的任何异常的信息。在本例中,如果发生异常,该方法将回滚事务;否则,它会提交事务。

Shadows Python Sensei
Shadows Python Sensei

Python 最佳实践助手——代码规范、设计模式、性能优化、测试与类型注解。适用于编写或审查 Python 代码。

下载

通过使用此自定义上下文管理器,您可以简化数据库交互并确保连接正确关闭,即使面对异常也是如此:

with postgresmanager('localhost', 5432, 'demo_db', 'myuser', 'mypassword') as conn:
    with conn.cursor() as cursor:
        cursor.execute("create table customers (id serial primary key, name text)")
        cursor.execute("insert into customers (name) values (%s)", ('meqdad',))
        # other database operations here...

这种方法通过将数据库连接管理逻辑封装在上下文管理器中,帮助您编写更健壮且可维护的代码。

上下文管理器生成器

除了创建自定义上下文管理器类之外,您还可以使用生成器函数创建上下文管理器。这种方法在某些情况下可以更简洁、更容易阅读。

这是管理锁的上下文管理器生成器的示例:

from contextlib import contextmanager
from threading import Lock

@contextmanager
def lock_manager(lock):
    lock.acquire()
    try:
        yield lock
    finally:
        lock.release()

在此示例中,@contextmanager 装饰器用于定义充当上下文管理器的生成器函数。 yield 语句用于定义控制权转移到 with 块的点,finally 块确保即使发生异常也能释放锁。

标准库中的上下文管理

python 标准库提供了许多内置的上下文管理器,您可以在代码中使用它们。其中包括:

  • open():管理文件的打开和关闭。
  • lock():管理锁的获取和释放。
  • threadpoolexecutor():管理工作线程池的创建和清理。

使用这些内置上下文管理器可以帮助您编写更简洁、更可靠的代码,因为资源管理逻辑已经为您实现。

最佳实践和注意事项

与上下文管理器合作时,需要牢记一些最佳实践和注意事项:

  • 错误处理和清理:确保您的 __exit__() 方法正确处理异常并清理资源,即使面对意外错误也是如此。
  • 嵌套上下文管理器:您可以相互嵌套上下文管理器,这在管理多个资源时非常有用。
  • 性能注意事项:虽然上下文管理器通常很高效,但请注意资源的设置和拆卸所带来的任何开销,尤其是在性能关键的代码中。

最后一句话

上下文管理器是 python 生态系统中的一个强大工具,允许您编写更健壮、可维护的 python 代码。

通过封装资源管理逻辑,上下文管理器帮助您确保资源得到正确处理,降低资源泄漏或状态不一致的风险。

无论您是使用内置上下文管理器还是创建自己的自定义上下文管理器,了解上下文管理器的基础知识都将帮助您编写更清晰、更高效、更可靠的 python 代码。

热门AI工具

更多
超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

3558

2023.08.10

postgresql常用命令
postgresql常用命令

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。本专题为大家提供postgresql相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.10.10

常用的数据库软件
常用的数据库软件

常用的数据库软件有MySQL、Oracle、SQL Server、PostgreSQL、MongoDB、Redis、Cassandra、Hadoop、Spark和Amazon DynamoDB。更多关于数据库软件的内容详情请看本专题下面的文章。php中文网欢迎大家前来学习。

4149

2023.11.02

postgresql常用命令有哪些
postgresql常用命令有哪些

postgresql常用命令psql、createdb、dropdb、createuser、dropuser、l、c、dt、d table_name、du、i file_name、e和q等。更详细的postgresql常用命令,大家可以访问下面的文章。

607

2023.11.16

postgresql常用命令介绍
postgresql常用命令介绍

postgresql常用命令有l、d、d5、di、ds、dv、df、dn、db、dg、dp、c、pset、show search_path、ALTER TABLE、INSERT INTO、UPDATE、DELETE FROM、SELECT等。想了解更多postgresql的相关内容,可以阅读本专题下面的文章。

1356

2023.11.20

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

440

2026.02.12

PostgreSQL 性能优化与查询执行计划实战
PostgreSQL 性能优化与查询执行计划实战

本专题深入解析PostgreSQL性能优化核心,聚焦查询执行计划的实战应用。通过EXPLAIN命令精准定位瓶颈,结合索引策略、SQL改写与参数调优,系统提升查询效率。从执行计划解读到性能调优全流程,助你掌握数据库性能诊断与优化实战能力。

130

2026.05.08

PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践
PostgreSQL 在 Next.js / Go 全栈架构中的工程化实践

本文详解如何利用Next.js(搭配Drizzle ORM)与Go后端构建高性能应用,充分发挥PG在JSONB非结构化存储与pgvector向量检索上的优势。从数据建模到Docker容器化部署,打造支持AI时代的“One Database”工程化解决方案。

881

2026.05.08

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

80

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn