- 前言
- 目标读者
- 非目标读者
- 本书的结构
- 以实践为基础
- 硬件
- 杂谈:个人的一点看法
- Python 术语表
- Python 版本表
- 排版约定
- 使用代码示例
- 第一部分 序幕
- 第 1 章 Python 数据模型
- 第二部分 数据结构
- 第 2 章 序列构成的数组
- 第 3 章 字典和集合
- 第 4 章 文本和字节序列
- 第三部分 把函数视作对象
- 第 5 章 一等函数
- 第 6 章 使用一等函数实现设计模式
- 第 7 章 函数装饰器和闭包
- 第四部分 面向对象惯用法
- 第 8 章 对象引用、可变性和垃圾回收
- 第 9 章 符合 Python 风格的对象
- 第 10 章 序列的修改、散列和切片
- 第 11 章 接口:从协议到抽象基类
- 第 12 章 继承的优缺点
- 第 13 章 正确重载运算符
- 第五部分 控制流程
- 第 14 章 可迭代的对象、迭代器和生成器
- 14.1 Sentence 类第1版:单词序列
- 14.2 可迭代的对象与迭代器的对比
- 14.3 Sentence 类第2版:典型的迭代器
- 14.4 Sentence 类第3版:生成器函数
- 14.5 Sentence 类第4版:惰性实现
- 14.6 Sentence 类第5版:生成器表达式
- 14.7 何时使用生成器表达式
- 14.8 另一个示例:等差数列生成器
- 14.9 标准库中的生成器函数
- 14.10 Python 3.3 中新出现的句法:yield from
- 14.11 可迭代的归约函数
- 14.12 深入分析 iter 函数
- 14.13 案例分析:在数据库转换工具中使用生成器
- 14.14 把生成器当成协程
- 14.15 本章小结
- 14.16 延伸阅读
- 第 15 章 上下文管理器和 else 块
- 第 16 章 协程
- 第 17 章 使用期物处理并发
- 第 18 章 使用 asyncio 包处理并发
- 第六部分 元编程
- 第 19 章 动态属性和特性
- 第 20 章 属性描述符
- 第 21 章 类元编程
- 结语
- 延伸阅读
- 附录 A 辅助脚本
- Python 术语表
- 作者简介
- 关于封面
15.6 延伸阅读
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论