PEP 408 – 標準函式庫 __preview__ 套件
- 作者:
- Alyssa Coghlan <ncoghlan at gmail.com>, Eli Bendersky <eliben at gmail.com>
- 狀態:
- 已否決 (Rejected)
- 類型:
- 標準軌跡 (Standards Track)
- 建立日期:
- 2012年1月7日
- Python 版本:
- 3.3
- 公告歷史:
- 2012年1月27日
- 決議:
- Python-Dev 訊息
摘要
將新模組納入 Python 標準函式庫的過程,常因 API 的鎖定與一旦成為 Python 正式成員後必須承諾的向後相容性而受阻。本 PEP 建議為模組提供一種過渡狀態:在正式進入標準函式庫前的次要版本週期(約 18 個月)內,將模組包含在一個特殊的 __preview__ 套件中。一方面,此狀態賦予該模組成為 Python 發行版正式成員的好處;另一方面,核心開發團隊明確宣告,不對該模組是否最終能完全納入標準函式庫,或其 API 的穩定性做出任何承諾,API 可能在下一個版本中發生變動。
PEP 已拒絕
根據他在 Google App Engine 中使用類似「labs」命名空間的經驗,Guido 已拒絕此 PEP [3],轉而採用更簡單的替代方案,即在臨時模組的說明文件中明確標記其為臨時性質。
若某個模組被認為適合作為標準函式庫的一部分,但在可維護性或特定 API 細節上仍有疑慮,該模組可以臨時性(provisional)身分被接受。雖然這被認為是不太可能發生的情況,但如果這些疑慮最終被證實,此類模組可能會從標準函式庫中移除,且無需經過棄用期。
在同一份公告中,Guido 明確接受了 Matthew Barnett 的「regex」模組 [4] 作為 Python 3.3 標準函式庫的臨時新增項目(使用「regex」名稱,而非作為現有「re」模組的直接替換)。
提案 - __preview__ 套件
每當 Python 核心開發團隊決定將新模組納入標準函式庫,但對該模組的 API 是否為最佳設計不完全確定時,該模組即可被放置在一個名為 __preview__ 的特殊套件中,為期一個次要版本週期。
在下一個次要版本中,該模組可以選擇「畢業」進入標準函式庫(佔據其命名空間中的應有位置,並脫離 __preview__ 套件),或者被拒絕並完全從 Python 原始碼樹中移除。如果模組在經過一個次要版本在 __preview__ 的過渡後畢業進入標準函式庫,其 API 可能會根據累積的回饋進行修改。核心開發團隊明確表示,對 __preview__ 中的模組不保證 API 的穩定性與向後相容性。
進入 __preview__ 套件標誌著該模組轉入標準函式庫過程的開始。這意味著核心開發團隊將承擔該模組的維護責任,與標準函式庫中任何其他模組無異。
哪些模組應該透過 __preview__ 進入
我們預期大多數建議加入 Python 標準函式庫的模組都應經過在 __preview__ 中的一個次要版本週期。不過,可能會有例外,例如使用預定義 API 的模組(例如 lzma,它通常遵循現有 bz2 模組的 API),或是其 API 在 Python 開發社群中已獲得廣泛認可的模組。
無論如何,建議加入標準函式庫的模組,無論是透過 __preview__ 還是直接加入,都必須滿足 PEP 2 所設定的接受條件。
必須強調的是,本提案的目的並非讓將新模組加入標準函式庫的過程變得更加困難。相反地,它試圖提供一種能加入更多實用函式庫的方法。顯然適合作為進入候選的模組可以照舊加入。而那些因 API 不確定性可能被擱置很長時間的模組,現在有了一種途徑,透過在 __preview__ 套件中的孵化期,仍能隨 Python 一起發布。
「畢業」標準
原則上,__preview__ 套件中的大多數模組最終都應畢業進入穩定的標準函式庫。不畢業的一些原因包括:
- 模組可能被證明是不穩定或脆弱的,且沒有足夠的開發者支援來維護它。
- 在預覽發布期間,可能會發現更好的替代模組。
本質上,決定將由核心開發者視個別情況做出。這裡要強調的重點是,模組在某個版本中出現在 __preview__ 套件中,並不保證它會在下一個版本中繼續成為 Python 的一部分。
範例
假設 example 模組是標準函式庫的候選者,但一些 Python 開發者並不確信它為其要解決的問題提供了最佳 API。那麼該模組可以在 3.X 版本中加入 __preview__ 套件,並可透過以下方式匯入:
from __preview__ import example
假設該模組隨後在 3.X+1 版本中升級至標準函式庫,它將被移至函式庫中的永久位置:
import example
屆時將無法再從 __preview__ 匯入它。
原理
對核心開發團隊的益處
目前,核心開發者對於向標準函式庫新增介面非常謹慎。這是因為一旦介面在某個版本中發布,由於向後相容性的考量,API 設計錯誤將會被鎖定。
透過某種預覽機制對所有重大 API 新增項目進行一個完整發布週期的門控,我們可以在鎖定這些 API 並提供標準的向後相容性保證之前,獲得一個完整的社群回饋週期。
我們也可以提早開始將預覽模組與標準函式庫的其餘部分進行整合,只要我們向套件維護者明確說明不應將預覽模組視為可選項目即可。預覽 API 與標準函式庫其餘部分的唯一區別在於,預覽 API 明確豁免於通常的向後相容性保證。
本質上,__preview__ 套件旨在降低長期鎖定輕微 API 設計錯誤的風險。目前,這種考量即使在核心開發團隊原則上同意某項新增內容是一個好點子時,也可能阻止該新增項目。
對終端使用者的益處
對於未來的終端使用者而言,最廣泛的益處在於更好的「開箱即用」體驗 —— 與其被告知「喔,X 任務的標準函式庫工具很糟糕,請改下載這個第三方函式庫」,這些更優質的工具更有可能只需透過匯入即可使用。
對於那些要求開發者對上游依賴進行盡職調查的環境(這嚴重損害了 PyPI 上許多資料的成本效益,甚至完全排除在外),關鍵益處在於確保 __preview__ 套件中的任何內容,至少從以下觀點來看,明確處於 python-dev 的保護之下:
- 授權:由 PSF 根據貢獻者授權協議(Contributor Licensing Agreement)重新分發。
- 說明文件:模組的說明文件是透過標準 Python 說明文件工具發布與組織的(即 ReST 原始碼,輸出由 Sphinx 生成並發布於 https://docs.python.club.tw)。
- 測試:模組測試套件在 python.org 的 buildbot 叢集上執行,結果透過 https://python.club.tw/dev/buildbot 發布。
- 問題管理:錯誤報告與功能請求在 http://bugs.python.org 上處理。
- 原始碼控制:該軟體的主儲存庫發布於 http://hg.python.org。
列入 __preview__ 的候選項目
對於 Python 3.3,目前有幾個明確的候選項目:
regex(http://pypi.python.org/pypi/regex)daemon(PEP 3143)ipaddr(PEP 3144)
其他可能的未來使用案例包括:
與 PEP 407 的關係
PEP 407 提議變更 Python 核心發布週期,允許每 6 個月進行一次中期發布(可能僅限於標準函式庫更新)。若發布週期進行此類變更,建議針對 __preview__ 命名空間採取以下政策:
- 對於長期支援(LTS)版本,
__preview__命名空間應始終為空。 - 新模組僅能在緊接在長期支援版本之後的中期發布中被接受進入
__preview__命名空間。 - 所有新增的模組在下一個長期支援版本之前,要麼遷移到標準函式庫中的最終位置,要麼被完全捨棄。
已拒絕的替代方案與變體
使用 __future__
Python 已經有一個以 __future__ 模組形式存在的「前瞻性」命名空間,因此詢問為何不能將其重新用於此新目的,是合理的。
有兩個理由說明這樣做是不恰當的:
1. __future__ 模組實際上與獨立的編譯器指令功能連結,該功能確實會改變 Python 直譯器編譯模組的方式。我們不希望預覽套件出現這種情況 —— 我們只是想要一個普通的 Python 套件。
2. __future__ 模組帶有一個明確的承諾,即名稱將永遠維護,遠在相關功能成為編譯器的預設行為之後也是如此。同樣地,這與預覽套件的初衷恰恰相反 —— 幾乎可以肯定的是,所有加入到預覽套件中的名稱最終都會在某個時候被刪除,這很可能是因為它們被移到了標準函式庫中的永久位置,但也可能是因為它們被還原為第三方套件狀態(如果社群回饋顯示擬議的新增內容已無可救藥)。
套件版本化
一個建議的替代方案 [1] 是為 __preview__ 套件增加明確的版本編號,即 __preview34__。我們認為,簡單地定義模組在 Python 3.X 的 __preview__ 中,要麼在 Python 3.X+1 中畢業到正常的標準函式庫命名空間,要麼從 Python 原始碼樹中完全消失,會更好。對 __preview__ 套件進行版本編號會使過程複雜化,且與本提案的主要意圖不太一致。
使用不含前後底線的套件名稱
有人提議 [1] 使用如 preview 或 exp 之類的套件名稱,而非 __preview__。此議案在討論中被拒絕,因為「雙底線」套件名稱(即名稱前後帶有雙底線)在 Python 中具有特殊含義。此外,非雙底線名稱會暗示正常的標準函式庫 API 穩定性保證,這並非 __preview__ 套件的意圖。
維護 Pickle 相容性
基於 3.X 版本中 __preview__ 內模組的已封裝(pickled)類別實例,將無法在 3.X+1 版本中解封裝,因為該模組屆時將不在 __preview__ 中。可以添加特殊程式碼來實現這一點,但這違背了本提案的初衷,因為這意味著向後相容性。因此,本 PEP 不建議維護 Pickle 相容性。
致謝
Dj Gilcrease 最初提議在 Python 中設置一個 __preview__ 套件 [2]。儘管他最初的提案使用的是名稱 __experimental__,但我們認為 __preview__ 能更好地傳達此套件的含義。
參考文獻
版權
此文件已歸入公有領域 (public domain)。
來源:https://github.com/python/peps/blob/main/peps/pep-0408.rst
最後修改時間:2025-02-01 08:59:27 GMT