跳转至

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 機制」的實作,哪一種說法正確?