跳转至

00 · 理解本课程所需的 Python 机制

理解本课程所需的 Python 机制

从运算符分派、装饰器和 dataclass 入手,弄清屏幕上的表达式如何到达库中的方法。

阅读本章前

你已经会读函数、类、条件分支和基本类型标注。

完成本章后,你可以
  • 用自己的话说明“理解本课程所需的 Python 机制”中的数学定义
  • 指出定义在 Python 数据中的表示方式
  • 根据实际实现预测一段小规模执行过程
数学定义

在 Python 中,`a + b` 和 `a == b` 会分别请求对象的 `__add__` 与 `__eq__`。装饰器在定义阶段接收并替换函数对象。

数据表示

冻结的 dataclass 保存不可变的数学值。被 `@log` 包装的方法在内部返回结果和延迟生成的消息,包装器对调用者只暴露结果。

Python 实现

`+` → `__add__`; `==` → `__eq__`; `@log` → `inner`

与本章一起阅读的实现和测试

peano/utils.py · tests/test_utils.py

数学定义

数学定义

在 Python 中,a + b 和 a == b 会分别请求对象的 __add__ 与 __eq__。装饰器在定义阶段接收并替换函数对象。

数据表示

数据表示

冻结的 dataclass 保存不可变的数学值。被 @log 包装的方法在内部返回结果和延迟生成的消息,包装器对调用者只暴露结果。

Python 实现

Python 实现

log 中的 inner 调用原方法,取出 (result, message),按日志设置输出消息,再返回 result;@wraps 保留原函数信息。

本课程使用的精确对应关系:

`+` → `__add__`; `==` → `__eq__`; `@log` → `inner`

执行过程

执行过程

先完成方法本体,包装器才获得消息。因此递归调用的内部结果会先于外层日志出现。

运行前预测

预测 `structural_str()` 与 `+` 分别会调用什么代码,并写下两行打印结果。

实验 · 理解本课程所需的 Python 机制 尚未运行
⌘ / Ctrl + Enter
输出
请先写下预测,再运行。

用测试核对

用测试核对

测试检查返回值、公开签名和延迟消息,防止装饰器改变库的正常接口。

适用范围

适用范围

本章不重讲循环和变量等基础语法,只解释理解本库不可缺少的元编程行为。

关于“理解本课程所需的 Python 机制”的实现,哪一种说法正确?