掌握Python上下文管理器:优雅资源管理的艺术

简介: 掌握Python上下文管理器:优雅资源管理的艺术

掌握Python上下文管理器:优雅资源管理的艺术

在Python编程中,资源管理是一个绕不开的话题——打开的文件要关闭,获取的锁要释放,数据库连接要断开。传统做法是try/finally,但Python的上下文管理器提供了更优雅的方案:with语句。

基础用法:文件操作

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

无需显式调用close(),退出with块后文件自动关闭,即使发生异常也依然安全。这就是上下文管理器的威力。

自定义上下文管理器

两种方式实现:

1. 类方式:实现__enter____exit__方法

class ManagedFile:
    def __init__(self, filename, mode):
        self.filename = filename
        self.mode = mode

    def __enter__(self):
        self.file = open(self.filename, self.mode)
        return self.file

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.file.close()

2. contextlib装饰器:更简洁

from contextlib import contextmanager

@contextmanager
def managed_file(filename, mode):
    f = open(filename, mode)
    try:
        yield f
    finally:
        f.close()

yield前面的代码相当于__enter__,后面的相当于__exit__

实际应用场景

  • 数据库事务:自动回滚或提交
  • 线程锁:with lock: 自动释放
  • 临时环境:修改环境变量后自动恢复
  • 性能计时:统计代码块执行时间

例如,用上下文管理器实现代码计时:

@contextmanager
def timer(name):
    start = time.time()
    yield
    print(f'{name} took {time.time() - start:.2f}s')

总结

上下文管理器让资源管理变得声明式、防错且可复用。当你反复写try/finally时,不妨考虑将它封装成上下文管理器——你的代码会更Pythonic。

(全文498字)

目录
相关文章
|
11小时前
|
存储 Python 容器
简化Python类:使用数据类(dataclasses)
简化Python类:使用数据类(dataclasses)
28 6
|
11小时前
|
Python
Python装饰器:优雅地增强函数功能
Python装饰器:优雅地增强函数功能
34 10
|
11天前
|
NoSQL 大数据 Python
用 Python 处理大数据?两个技巧让你的 Pandas 快 10 倍
用 Python 处理大数据?两个技巧让你的 Pandas 快 10 倍
159 82
|
17小时前
|
人工智能 JavaScript 安全
Openclaw的安装部署及免费API集成教程
OpenClaw 是一款开源 AI 代理框架,支持 Discord 等平台。要求 Node.js ≥22、4GB+ 内存,推荐 macOS/Linux 或 WSL2。提供一键脚本安装、向导式配置(含 Bot 权限、频道 ID、API 接入如 Canopy Wave)、后台服务与 TUI 交互,支持更新、日志与健康检查。(239 字)
100 1
|
15天前
|
机器学习/深度学习 人工智能 编解码
从噪声中创造世界:扩散模型如何成为生成式AI的魔法核心
从噪声中创造世界:扩散模型如何成为生成式AI的魔法核心
|
19天前
|
Go API 数据库
Go并发实战:轻松构建高性能工作池
Go并发实战:轻松构建高性能工作池
142 87
|
19天前
|
安全 Go
Go并发模式:用goroutine和channel实现高效管道
Go并发模式:用goroutine和channel实现高效管道
128 86
|
19天前
|
JSON 运维 Go
为什么Go语言成为开发者新宠?
为什么Go语言成为开发者新宠?
160 63
|
4天前
|
数据采集 数据处理 Python
Python异步编程入门:告别等待,拥抱高效
Python异步编程入门:告别等待,拥抱高效
|
21天前
|
机器学习/深度学习 人工智能 自然语言处理
小巧而强大:轻量级语言模型如何改变游戏规则
小巧而强大:轻量级语言模型如何改变游戏规则
118 40