# 《流畅的Python》第二版只新增四章，恰是 FDE 最需要的

> 数据类、类型提示和并发正是进驻客户第一周最需要快速读懂的代码，但这本书不适合 Python 新手。

原文: https://fdetimes.net/zh/books-courses/fluent-python-second-edition-for-fdes/

在《流畅的 Python》第二版的目录中，只有四章带有 🆕 标记：数据类构建器（第 5 章）、函数中的类型提示（第 8 章）、类型提示进阶（第 15 章）和 Python 并发模型（第 19 章）。作者 Luciano Ramalho（O'Reilly，2022）还大幅重写了并发相关章节。

这些改动与前线部署工程师（FDE）的工作高度吻合。设想你到客户那里的第一周：很可能大部分时间都在读别人写的代码，而这些代码多半带有类型提示、用工具生成的数据类，以及并行调用 API 的数据管道。

果真如此，这四个新章节很可能正好对应你最需要快速读懂的几类代码。下文用类型提示和并发两个例子说明原因，并给出阅读顺序和每部分的用法。

## 谁该读这本书，什么时候读？

这不是入门书：ACCU 的书评人和 hamatti.org 博客都指出，它面向已有 Python 编写经验的人。

如果你刚起步，先写几个月真实代码再读。如果你写了几年 Python，却仍习惯从 Java 或 C# “翻译”过来，不必从头读到尾，按本文开头图示的顺序读即可。

## 第一个思路：对象的行为取决于特殊方法

全书从 Python 数据模型讲起，接着是列表、字典和集合。这是读懂地道 Python 的基础：`__len__`、`__getitem__` 这类双下划线方法，决定了对象传给 `len()` 等内置函数时的行为。

举个假设的例子：客户代码中有一行 `len(batch)`，其中 `batch` 是某个自定义类的实例。搜索名为 `len` 的方法，什么也找不到；答案在 `__len__` 里。养成这个习惯后，读陌生的类时，你会先列出它的特殊方法，再看其余部分。

第 5 章是全新内容。建议读完数据模型就接着读，因为你遇到的许多数据类很可能是用类构建工具生成的，而不是逐行手写的。

## 第二个思路：类型提示是地图，不是保险

第二版用第 8、15 两个新章节讲类型提示。对 FDE 来说，它的价值在于不运行系统也能先理解系统。

设想客户 SDK 中有一个函数，签名是 `def fetch(ids: list[str]) -> dict[str, Order] | None`。仅这一行就告诉你输入是什么、输出是什么，以及必须处理 `None` 的情况。没有类型提示，你只能打断点、靠猜。

不过，Ramalho 在 Thoughtworks 技术播客中强调过一点：注解在运行时不起作用，是 mypy 这类工具利用它们在源代码中找出错误。只有经常有人检查，这张地图才可信。

**要点:** 按代码作者的思维方式去理解这门语言，才能最快读懂客户代码。

## 第三个思路：动手前先选定并发模型

讲并发模型的第 19 章是新章节，位于全书改写最多的部分。它值得细读，因为它给你一套词汇，让你在动代码之前就能分清线程、进程和 async。

设想一个集成任务要调用客户的 200 个端点，每次调用约 0.5 秒，几乎全在等网络。顺序执行需要 200 × 0.5 = 100 秒，而 CPU 几乎闲着。这是 I/O 密集型任务，把等待并行化才是正确思路。

如果客户 SDK 是同步库，用 20 个工作线程的线程池改动最少：200 次调用分成 10 轮，总耗时降到约 5 秒左右。如果整条链路已有异步客户端，用 asyncio 并把并发请求数限制为 20，效果相近。而如果慢在 CPU 密集的数据解析，这两种方法都救不了你。

## 把书中内容用到实际项目的三个陷阱

第一个陷阱，是把书中的 asyncio 模式原样搬进客户代码。ACCU 书评人认为异步编程章节已经过时，因此要吸取第 19 章的思路，具体 API 在使用前对照当前的 Python 文档核实。

第二个陷阱，是在从未运行过 mypy 的仓库里轻信类型提示。注解在运行时不起作用，类型提示可能早已与实际脱节，却无人察觉。

第一天就问客户团队：CI 是否运行类型检查器？如果没有，就在本地运行 mypy，把错误数量当作这张地图可信程度的衡量指标。

第三个陷阱，是没测量就并行化。写下第一行并发代码之前，先测出单次调用的耗时，并设定请求数上限，以免你的任务压垮客户自己的 API。

## 把阅读变成简历上的证据

官方示例代码在 GitHub 上的 `fluentpython/example-code-2e` 仓库中，fluentpython.com 是第二版的配套网站，extra 栏目里还有补充文章。

最有效的读法是边读边重构。挑一个自己的旧 Python 项目，把手写的数据类改为 dataclass，加上类型提示，并让 mypy 在 CI 中运行。在简历上写一行说明你做了什么，附上 commit 链接，远比“精通 Python”几个字更有说服力。

目标不是背语法，而是打开陌生的仓库后，能快速读懂，让客户团队信任你。上面这些章节，正是练这项能力的捷径。

**本周动手试试:**

- 克隆 fluentpython/example-code-2e 仓库，运行第 1 章和第 5 章的示例，再自己写一个带 __len__ 和 __getitem__ 的类。
- 找一个自己写的、没有类型提示的旧 Python 模块，按第 8 章加上类型提示，再用 mypy 检查。
- 读一篇 fluentpython.com/extra 上的文章，记下一个你此前对 Python 理解有误的地方。

## 信源

- [GitHub - fluentpython/example-code-2e](https://github.com/fluentpython/example-code-2e)

- [example-code-2e/README.md at master · fluentpython/example-code-2e](https://github.com/fluentpython/example-code-2e/blob/master/README.md)

- [Fluent Python, Second Edition – Extras](https://www.fluentpython.com/extra/)

- [fluent python 2nd edition – Thoughtworks](https://www.thoughtworks.com/insights/books/fluent-python-2nd-edition)

- [Thoughtworks Technology Podcast – The future of Python (Luciano Ramalho)](https://www.thoughtworks.com/insights/podcasts/technology-podcasts/future-python)

- [REVIEW - Fluent Python (2e)](https://accu.org/bookreviews/2023/wiesenhuetter_2005/)

- [Book recommendation: Fluent Python (2nd Edition)](https://hamatti.org/posts/book-recommendation-fluent-python/)
