返回介绍

15.6 延伸阅读

发布于 2024-02-05 21:59:47 字数 2753 浏览 0 评论 0 收藏 0

Python 语言参考手册中的“8. Compound statements”一章全面说明了 if、for、while 和 try 语句的 else 子句。关于 try/except 语句(有 else 子句,或者没有)是否符合 Python 风格,Raymond Hettinger 在 Stack Overflow 中对“Is it a good practice to use try-except-else in Python?”这一问题做了精彩的回答。在 Alex Martelli 写的《Python 技术手册(第 2 版)》一书中,有一章是关于异常的,那一章极好地讨论了 EAFP 风格。Alex 认为“取得原谅比获得许可容易”是由计算领域的先驱 Grace Hopper 首先提出的。

在 Python 标准库文档中,“4. Built-in Types”一章中有一节专门说明了上下文管理器的类型。Python 语言参考手册中还有 __enter__/__exit__ 两个特殊方法的文档,在“3.3.8. With Statement Context Managers”一节中。上下文管理器在“PEP 343—The‘with’Statement”中引入。这份 PEP 不易读懂,因为大量篇幅都在讲极端情况,以及反对其他提案。这就是 PEP 的特点。

在 PyCon US 2013 的主题演讲中,Raymond Hettinger 强调,with 语句是“这门语言的一项迷人特性”。在这次大会上的“Transforming Code into Beautiful, Idiomatic Python”演讲中,他还展示了上下文管理器的几个有趣应用。

Jeff Preshing 写的一篇博客文章很有趣,题为“The Python with Statement by Example”,他举例说明了 pycairo 图形库中的上下文管理器。

Beazley 与 Jones 在他们的《Python Cookbook(第 3 版)中文版》一书中,发明了上下文管理器的独特用途。“8.3 让对象支持上下文管理协议”一节实现了一个 LazyConnection 类,它的实例是上下文管理器,在 with 块中能自动打开和关闭网络连接。“9.22 以简单的方式定义上下文管理器”一节编写了一个用于统计代码运行时间的上下文管理器,还编写了一个使用事务修改 list 对象的上下文管理器:在 with 块中创建 list 实例的副本,所有改动都针对那个副本;仅当 with 块没有抛出异常,正常执行完毕之后,才用副本替代原来的列表。这样做简单又巧妙。

杂谈

取出面包

在 PyCon US 2013 的主题演讲“What Makes Python Awesome”中,Raymond Hettinger 说他第一次看到 with 语句的提案时,觉得“有点晦涩难懂”。这和我一开始的反应类似。PEP 通常难以阅读,PEP 343 尤其如此。

然后,Hettinger 告诉我们,他认识到在计算机语言的发展历程中,子程序是最重要的发明。如果有一系列操作,如 A-B-C 和 P-B-Q,那么可以把 B 拿出来,变成子程序。这就好比把三明治的馅儿取出来,这样我们就能使用金枪鱼搭配不同的面包。可是,如果我们想把面包取出来,使用小麦面包夹不同的馅儿呢?这就是 with 语句实现的功能。with 语句是子程序的补充。Hettinger 接着说道:

with 语句是非常了不起的特性。我建议你在实践中深挖这个特性的用途。使用 with 语句或许能做意义深远的事情。with 语句最好的用法还未被发掘出来。我预料,如果有好的用法,其他语言以及未来的语言会借鉴这个特性。或许,你正在参与的事情几乎与子程序的发明一样意义深远。

Hettinger 承认,他夸大了 with 语句的作用。尽管如此,with 语句仍是一个十分有用的特性。他用三明治类比,道出 with 语句是子程序的补充;那一刻,我的脑海中浮现了许多可能性。

如果你想让任何人信服 Python 是出色的语言,一定要观看 Hettinger 的主题演讲。关于上下文管理器的部分从 23:00 开始,到 26:15 结束。不过,整个主题演讲都很精彩。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文