
編譯成 C
|
179
CPython 模組
最後,我們總是能夠直接進入 CPython API 的層級,並且撰寫 CPython 模組,這要求我
們以 CPython 被開發的相同方式撰寫程式碼,並且處理在我們的程式碼與 CPython 實作
之間的所有互動。
好處是這具有驚人的可移植性(取決於 Python 版本)。我們不需要任何外部模組或程式
庫,只需要 C 編譯器和 Python!然而,這不必然能夠順利擴展到新版 Python,例如,
讓針對 Python 2.7 撰寫的 CPython 模組順利運作在 Python 3。
然而,可移植性的代價不斐—你必須負責處理在你的 Python 程式碼與模組之間的介面
的每個面向,這會讓最簡單的任務都得耗費幾十行程式碼才能夠完成。例如,要跟範
例 7-20 的擴散程式庫互動,僅為了讀取函式引數並且剖析它們,就必須撰寫 28 行程
式碼(範例 7-25)。當然,這意味著,你能夠細微地控制究竟要發生什麼事,你甚至可
以手動地為 Python 的垃圾收集改變參考計數(這可能是在建立 CPython 模組處理原生
Python 型別時的諸多痛苦的根源。因為如此,產生的程式碼傾向於比其他介面方法更快
一點。
總括來說,這個方法應該被當作最後的手段。雖然撰寫 CPython 模組相
當具有教育性,但生成的程式碼並不像其他方法那樣可重利用或者好維
護。為模組做細微的改變往往需要完全重寫它。事實上,我們將模組程式
碼與編譯它所需的
setup.py
(範例 7-26)當作是一件值得警惕的事情。 ...