Python上下文管理器:告别繁琐的资源清理

简介: Python上下文管理器:告别繁琐的资源清理

Python上下文管理器:告别繁琐的资源清理

在Python开发中,我们经常需要处理资源管理——打开文件、连接数据库、获取锁等。传统的方式是使用try-finally块确保资源被正确关闭,但Python提供了一个更优雅的解决方案:上下文管理器。

问题场景

想象一下典型的文件操作:

file = open('data.txt', 'r')
try:
    data = file.read()
finally:
    file.close()

with语句的魔力

使用上下文管理器和with语句,代码变得简洁明了:

with open('data.txt', 'r') as file:
    data = file.read()
# 文件在这里自动关闭

创建自定义上下文管理器

你可以通过类实现自己的上下文管理器:

class DatabaseConnection:
    def __init__(self, connection_string):
        self.conn_string = connection_string

    def __enter__(self):
        self.conn = create_connection(self.conn_string)
        return self.conn

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.conn.close()
        if exc_type:
            print(f"异常发生: {exc_val}")
        return False  # 不抑制异常

# 使用方式
with DatabaseConnection('localhost:5432') as db:
    result = db.query('SELECT * FROM users')

contextlib简化版

对于简单场景,可以使用contextlib模块:

from contextlib import contextmanager

@contextmanager
def timer():
    start = time.time()
    try:
        yield
    finally:
        print(f"耗时: {time.time() - start}秒")

with timer():
    time.sleep(1.5)

上下文管理器不仅使代码更简洁,还确保了资源的正确释放,减少了内存泄漏的风险。掌握这一特性,你的Python代码将更加健壮和专业。

目录
相关文章
|
1月前
|
安全 编译器 API
PHP 8.4 新特性实战:用 `match` 表达式告别繁琐的 `switch`
PHP 8.4 新特性实战:用 `match` 表达式告别繁琐的 `switch`
|
23天前
|
Python
Python装饰器:给你的函数穿上“外套”
Python装饰器:给你的函数穿上“外套”
235 111
|
4天前
|
并行计算 API Python
Python 3.12 隐藏利器:用子解释器实现真正并行
Python 3.12 隐藏利器:用子解释器实现真正并行
172 134
|
4天前
|
BI Python
告别繁琐拼接:用Python f-string点亮你的代码
告别繁琐拼接:用Python f-string点亮你的代码
184 139
|
23天前
|
Python 智能硬件
Python装饰器:给你的代码穿上隐形斗篷
Python装饰器:给你的代码穿上隐形斗篷
161 112
|
12天前
|
人工智能 前端开发 API
Google发布50页AI Agent白皮书,老金帮你提炼10个核心要点
老金分享Google最新AI Agent指南:让AI从“动嘴”到“动手”。Agent=大脑(模型)+手(工具)+协调系统,可自主完成任务。通过ReAct模式、多Agent协作与RAG等技术,实现真正自动化。入门推荐LangChain,文末附开源知识库链接。
765 119
|
1月前
|
IDE PHP 开发工具
PHP 8 类型系统:写出更可靠的代码
PHP 8 类型系统:写出更可靠的代码
|
1月前
|
安全 IDE PHP
PHP 8.1 新特性解析:枚举类型的强大之处
PHP 8.1 新特性解析:枚举类型的强大之处
|
1月前
|
Python
Python字符串格式化:用f-strings让代码更优雅
Python字符串格式化:用f-strings让代码更优雅
230 117