本书讨论的是如何培养一种判断力:选择能够解决问题的最小方案。 你将通过洞见、惯用法和模式来建立这种判断力。 本书也会质疑设计模式。 大多数设计模式的出现,是为了绕过静态、重继承语言的局限, 而在 Python 中,其中许多模式会弱化,甚至消失。 如果某个惯用法或模式依然有用,它就会被保留下来。

每种语言都有值得学习的习惯,也有应该丢掉的习惯。 从 C++ 或 Java 转向 Python 的程序员,会带着那些语言所迫使他们形成的模式、 仪式化写法以及防御性结构而来。 Python 对这些东西的需求要少得多。 Python 不需要一个只为了容纳单个方法而存在的类,因为 Python 有函数。 一个24 · 单例(Singleton)就是一个模块。 一个33 · 访问者(Visitor)就是一个根据类型进行分派的函数。 在使用某种惯用法或模式之前, 本书会先问:这门语言本身是否已经解决了这个问题? 只有答案是否定的,才增加相应的复杂度。

本书面向谁

我写这本书,是面向已经会编程的程序员, 无论你熟悉的是另一门语言还是 Python。 目标是让你从“写出能工作的 Python”,进一步走向“写出清晰、 符合 Python 惯用风格并且维护起来令人愉快的 Python”。

这是一本中级到高级的书, 因此不受入门书籍通常必须遵守的两个约束:

  1. 入门书必须按严格顺序解释所有内容, 在正式介绍一个概念之前绝不能先使用它。 本书不会这样做。
  2. 入门书会按照某个主题在初学者学习路径中的位置来选择内容。 本书则根据主题是否有趣、是否有用来选择内容。

你应该已经熟悉:

如果遇到你没见过的语言特性,一边读一边查即可。

你不需要预先了解设计模式、元类或类型检查。 本书会介绍这些内容。 本书讨论的是语言本身,而不是围绕语言的工具链。

本书如何组织

你可以从头到尾顺序阅读,也可以直接跳到感兴趣的章节, 因为大多数章节都是相对独立的。 全书分为五个部分。

第一部分 Foundations(基础),快速浏览 Python 语言:语法、容器、 控制流、函数、模块、类、静态类型、类属性以及对象清理。 这一部分面向从其他语言转向 Python 的程序员。 如果你已经熟悉 Python,可以只浏览自己不熟悉的主题, 或者完全跳过这一部分。 但如果你跳过第一部分,请回来阅读08 · 静态类型: 从它之后的每一章开始,示例都会使用类型注解, 而且它是第一部分中唯一一章被后续全书默认读者已经掌握的内容。

第二部分 Techniques(技巧), 介绍赋予 Python 独特风格的惯用法和工具:测试、 把数据类作为类型、模式匹配、装饰器、上下文管理器、 推导式以及元编程。 这一部分以性能与并发收尾, 此时问题会从“代码表达了什么”转变为“代码运行得有多快”。 这些章节中有不少来自我做过的演讲,大多数是在 PyCon 上。

第三部分 Patterns(模式)首先后退一步,对面向对象本身提出质疑, 因为后面介绍的若干模式,本来就是为了解决对象所制造出来的问题而存在的。 接下来有一个短章介绍设计模式运动本身, 以及本部分其余章节不断追问的那个问题。 之后,本部分会依次讨论经典设计模式, 针对 Python 重新理解每一种模式,并把它放到这门语言本身的能力面前衡量。 我会问:你究竟在解决什么问题?这门语言是否已经完成了这个模式所做的工作? 学会提出这些问题,是本书能够带给你的最有价值的能力之一。 这一部分最后会通过多种设计重构同一个问题, 再利用这些组成部分构建一个模拟程序, 并把经典模式以及后来文献中补充的模式汇总成目录。

第四部分 Functional(函数式),介绍纯函数、 functools 和 itertools 工具集、 把错误作为值返回而不是抛出异常, 以及一条从局部推理一直延伸到机器验证证明的“可信度光谱”。