当前位置:首页>python>使用上下文管理器编写更Python风格的代码

使用上下文管理器编写更Python风格的代码

  • 2026-09-08 10:17:25
使用上下文管理器编写更Python风格的代码
关注+星标,每天学习Python新技能

来源:网络

在 Python 社区中,我们经常谈论编写 Pythonic 代码,这, 但本质上,它是关于编写能够以最佳方式利用 Python 特性和语言结构的 Python 代码, 有时,它用于讨论 PEP 8(即 Python 风格指南),但这是一个相当肤浅的描述。
长期从事 Python 核心开发的 Raymond Hettinger 在 2015 年美国 PyCon 上发表了一场关于 Pythonic 代码的精彩演讲,名为 Beyond PEP 8,强烈建议所有编写 Python 的人观看。
今天的帖子是关于上下文管理器的,它是 Python 语言中的一种结构,它使代码更易于阅读和理解,使其更具 Pythonic 风格.
上下文管理器是一个对象,它定义执行 with 语句时要建立的运行时上下文,上下文管理器负责处理代码块执行所需的运行时上下文的进入和退出。
如果你最近一直在写 Python,那么最有可能遇到它们的情况是在打开文件的上下文中:
withopen('filename.txt', 'r') asdatafile:for line indatafile:    print(line)
没有上下文管理器的情况下,你可以用以下代码实现同样的目标:
datafile = open('filename.txt', 'r')for line in datafile:print(line)datafile.close()
但我认为上下文管理器使阅读和理解更加清晰,而且,由于上下文管理器会在块末尾关闭文件,因此我们不必关心完成后关闭文件的问题。
任何类都可以通过定义两个方法变成上下文管理器:__enter__ 和 __exit__,当上下文管理器进入 with 块时,会运行 __enter__ 方法,而当块完成时,会运行 __exit__ 方法。
在前面提到的 Raymond Hettinger 演讲中,他有一个很好的例子,通过将网络代码初始化和终止包装到上下文管理器中,使代码更具 Python 风格(请注意,这是 Python 2 代码):
from nettools import NetworkElementwith NetworkElement('171.0.2.45') as ne:for route in ne.routing_table:print'%15s -> %s' % (route.name, route.ipaddr)
NetworkElement 定义为(仅显示 __enter__ 和 __exit__ )
classNetworkElement(object)def__enter__(self):returnselfdef__exit__(self, exctype, excinst, exctb):if exctype == NetworkElementError:       logging.exception('No routing table found')self.oldne.cleanup('rollback')else:self.oldne.cleanup('commit')self.oldne.disconnect()
你可以在上下文管理器中执行大量验证、清理、断开连接和错误处理,让上下文管理器的用户专注于他们想要实现的主要逻辑。
上下文管理器的另一个方便的用例是使用 pytest 测试异常:
import pytestdeftest_zero_division():with pytest.raises(ZeroDivisionError):1 / 0
还可以在使用补丁模拟测试时使用上下文管理器:
from unittest.mock import patchwith patch('Class.method', mocked_method):  # 运行测试代码  
原文:https://hamatti.org/posts/write-more-pythonic-code-with-context-managers/
长按或扫描下方二维码,免费获取 Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等

推荐阅读

Python标准库里藏着的7个代码简化利器

为什么 asyncio 要这样设计?一篇文章讲清楚核心原理

3 分钟安装 openclaw | 零门槛到进阶 | 2026 年 3 月最新版

Python标准库里藏着的7个代码简化利器

点击 阅读原文 了解更多

最新文章

随机文章