NEP 29 — 建議 Python 與 NumPy 版本支援作為社群政策標準#
- 作者:
Thomas A Caswell <tcaswell@gmail.com>, Andreas Mueller, Brian Granger, Madicken Munk, Ralf Gommers, Matt Haberland <mhaberla@calpoly.edu>, Matthias Bussonnier <bussonniermatthias@gmail.com>, Stefan van der Walt <stefanv@berkeley.edu>
- 狀態:
最終
- 類型:
資訊性
- 建立日期:
2019-07-13
- 決議:
https://mail.python.org/pipermail/numpy-discussion/2019-October/080128.html
注意
此 NEP 已被 scientific python 生態系統協調指南 SPEC 0 — 最低支援版本 取代。
摘要#
此 NEP 建議整個 Scientific Python 生態系統的所有專案都採用通用的「基於時間窗口」政策,以支援 Python 和 NumPy 版本。標準化專案支援最低 Python 和 NumPy 版本的建議,將改善下游專案的規劃。
這是一個不尋常的 NEP,因為它提供社群範圍政策的建議,而不是 NumPy 本身的變更。由於 SPEEP (Scientific Python 生態系統強化提案) 沒有通用場所,並且考慮到 NumPy 在生態系統中的核心作用,NEP 提供了一個可見的地方來記錄提議的政策。
此 NEP 由 Matplotlib、scikit-learn、IPython、Jupyter、yt、SciPy、NumPy 和 scikit-image 的維護者提出。
詳細描述#
為了此 NEP 的目的,我們假設語義化版本控制並定義
- 主要版本
變更第一個數字的版本 (例如 X.0.0)
- 次要版本
變更第二個數字的版本 (例如 1.Y.0)
- 修補程式版本
變更第三個數字的版本 (例如 1.1.Z)
當專案發布新的主要或次要版本時,我們建議他們至少支援在預期發布日期前 42 個月內推出和發布的所有 Python 次要版本,最少支援 2 個 Python 次要版本,以及在預期發布日期前 24 個月內發布的所有 NumPy 次要版本,最少支援 3 個 NumPy 次要版本。
考慮以下時間軸
Jan 16 Jan 17 Jan 18 Jan 19 Jan 20
| | | | |
+++++|+++++++++++|+++++++++++|+++++++++++|+++++++++++|++++++++++++
| | | |
py 3.5.0 py 3.6.0 py 3.7.0 py 3.8.0
|-----------------------------------------> Feb19
|-----------------------------------------> Dec19
|-----------------------------------------> Nov20
它顯示了 Python 的 42 個月支援窗口。 2019 年 2 月發布主要或次要版本的專案應支援 Python 3.5 及更新版本,2019 年 12 月發布主要或次要版本的專案應支援 Python 3.6 及更新版本,2020 年 11 月發布主要或次要版本的專案應支援 Python 3.7 及更新版本。
當起草此 NEP 時,Python 發布節奏為 18 個月,因此 42 個月的窗口確保窗口中始終至少有兩個 Python 次要版本。 該窗口比 Python 預期的雙版本間隔延長了 6 個月,以提供彈性來應對其發布時程中的小幅波動/延遲。
Python 發布節奏在 PEP 0602 中增加,現在每 12 個月發布一次,因此在任何時候的支援窗口中都會有 3-4 個 Python 版本。 然而,PEP 0602 並未縮短 Python 的支援窗口(18 個月的定期完整錯誤修復版本和 42 個月的按需原始碼版本)。 因此,我們預期使用者不會更快升級 Python,而我們的 42 個月支援窗口將涵蓋任何給定 Python 版本的上游支援的相同部分。
由於 Python 次要版本支援僅基於歷史發布日期、42 個月的時間窗口以及計畫的專案發布日期,因此可以高度自信地預測專案何時能夠放棄任何給定的 Python 次要版本。 反過來,這可以節省數月不必要的維護負擔。
如果專案在 Python 次要版本退出支援窗口後立即發布,則支援的版本之間將不可避免地存在一些不匹配 — 但這種情況應該只持續到生態系統中的其他專案發布版本為止。
否則,一旦專案進行次要或主要版本發布,就可以保證所有其他專案都會有一個穩定版本,這些專案在原始碼層級支援新版本支援的同一組 Python 版本。
如果出現 Python 4 或 NumPy 2,則必須根據社群和專案的最佳利益來審查此政策。
支援表#
日期 |
Python |
NumPy |
2020 年 1 月 7 日 |
3.6+ |
1.15+ |
2020 年 6 月 23 日 |
3.7+ |
1.15+ |
2020 年 7 月 23 日 |
3.7+ |
1.16+ |
2021 年 1 月 13 日 |
3.7+ |
1.17+ |
2021 年 7 月 26 日 |
3.7+ |
1.18+ |
2021 年 12 月 22 日 |
3.7+ |
1.19+ |
2021 年 12 月 26 日 |
3.8+ |
1.19+ |
2022 年 6 月 21 日 |
3.8+ |
1.20+ |
2023 年 1 月 31 日 |
3.8+ |
1.21+ |
2023 年 4 月 14 日 |
3.9+ |
1.21+ |
2023 年 6 月 23 日 |
3.9+ |
1.22+ |
2024 年 1 月 1 日 |
3.9+ |
1.23+ |
2024 年 4 月 5 日 |
3.10+ |
1.23+ |
2024 年 6 月 22 日 |
3.10+ |
1.24+ |
2024 年 12 月 18 日 |
3.10+ |
1.25+ |
2025 年 4 月 4 日 |
3.11+ |
1.25+ |
2026 年 4 月 24 日 |
3.12+ |
1.25+ |
放棄時程表#
On next release, drop support for Python 3.5 (initially released on Sep 13, 2015)
On Jan 07, 2020 drop support for NumPy 1.14 (initially released on Jan 06, 2018)
On Jun 23, 2020 drop support for Python 3.6 (initially released on Dec 23, 2016)
On Jul 23, 2020 drop support for NumPy 1.15 (initially released on Jul 23, 2018)
On Jan 13, 2021 drop support for NumPy 1.16 (initially released on Jan 13, 2019)
On Jul 26, 2021 drop support for NumPy 1.17 (initially released on Jul 26, 2019)
On Dec 22, 2021 drop support for NumPy 1.18 (initially released on Dec 22, 2019)
On Dec 26, 2021 drop support for Python 3.7 (initially released on Jun 27, 2018)
On Jun 21, 2022 drop support for NumPy 1.19 (initially released on Jun 20, 2020)
On Jan 31, 2023 drop support for NumPy 1.20 (initially released on Jan 31, 2021)
On Apr 14, 2023 drop support for Python 3.8 (initially released on Oct 14, 2019)
On Jun 23, 2023 drop support for NumPy 1.21 (initially released on Jun 22, 2021)
On Jan 01, 2024 drop support for NumPy 1.22 (initially released on Dec 31, 2021)
On Apr 05, 2024 drop support for Python 3.9 (initially released on Oct 05, 2020)
On Jun 22, 2024 drop support for NumPy 1.23 (initially released on Jun 22, 2022)
On Dec 18, 2024 drop support for NumPy 1.24 (initially released on Dec 18, 2022)
On Apr 04, 2025 drop support for Python 3.10 (initially released on Oct 04, 2021)
On Apr 24, 2026 drop support for Python 3.11 (initially released on Oct 24, 2022)
實作#
我們建議所有專案在其開發指南中採用以下語言
此專案支援
專案發布前 42 個月內發布的所有 Python 次要版本,且最少為最新的兩個次要版本。
專案發布前 24 個月內發布的所有
numpy
次要版本,且最少為最新的三個次要版本。在
setup.py
中,python_requires
變數應設定為最低支援的 Python 版本。 所有支援的 Python 次要版本都應在測試矩陣中,並為發布建置二進位人工產物。最低 Python 和 NumPy 版本支援應在每次主要和次要版本發布時向上調整,但絕不在修補程式版本發布時調整。
向後相容性#
無向後相容性問題。
替代方案#
Ad-Hoc 版本支援#
專案可以在每次發布時評估是否提高支援的最低 Python 版本。 作為一個主要的缺點,Ad-hoc 方法讓下游使用者難以預測未來最低版本會是什麼。 由於沒有客觀的閾值來決定何時應放棄最低版本,因此這些版本支援討論很容易演變成 自行車棚效應 和尖酸刻薄。
所有 CPython 支援的版本#
Python 支援的 CPython 版本列在 Python 開發人員指南和 Python PEP 中。 支援這些版本是一種非常明確且保守的方法。 然而,這表示在語言中引入新功能與專案能夠使用它之間存在四年滯後。 此外,對於具有編譯擴展的專案,這需要為每個版本建置許多二進位人工產物。
對於 NumPy 的情況,許多專案都帶有針對在後續 NumPy 版本中修復的錯誤的變通方法。 主動提高 NumPy 的最低版本可讓下游套件攜帶更少的特定版本修補程式。
Linux 發行版上的預設版本#
該政策可能是支援最新 Ubuntu LTS 或 CentOS/RHEL 版本中預設隨附的 Python 版本。 然而,我們仍然必須在社群中標準化要遵循哪個發行版。
透過遵循主要 Linux 發行版支援的版本,我們正在將專案的技術控制權讓給外部組織,這些組織可能具有與我們不同的動機和考量。
N 個 Python 次要版本#
鑑於 Python 目前的發布節奏,提議的時間(42 個月)大致相當於「最近兩個」Python 次要版本。 然而,如果 Python 大幅變更其發布節奏,則任何僅基於次要版本數量的規則可能需要變更以保持合理性。
基於 Python 版本數量的政策,更根本的問題是難以預測何時將放棄對給定 Python 次要版本的支援,因為這需要正確預測未來 3-4 年的 Python 發布時程表。 相比之下,基於時間的規則僅取決於過去的事件和支援窗口的長度。
從 X.Y.1 Python 版本開始的時間窗口#
這相當於從 X.Y.0 版本開始更長幾個月的支援窗口。 這是因為 X.Y.1 錯誤修復版本通常在 X.Y.0 版本發布後幾個月發布,因此從 X.Y.1 開始的 N 個月窗口大致相當於從 X.Y.0 開始的 N+3 個月。
X.Y.0 版本自然是一個特殊的版本。 如果我們將窗口錨定在 X.Y.1 上,那麼我們就會討論為什麼不是 X.Y.M?
討論#
參考資料和註腳#
用於產生支援和放棄時程表的程式碼
from datetime import datetime, timedelta
data = """Jan 15, 2017: NumPy 1.12
Sep 13, 2015: Python 3.5
Dec 23, 2016: Python 3.6
Jun 27, 2018: Python 3.7
Jun 07, 2017: NumPy 1.13
Jan 06, 2018: NumPy 1.14
Jul 23, 2018: NumPy 1.15
Jan 13, 2019: NumPy 1.16
Jul 26, 2019: NumPy 1.17
Oct 14, 2019: Python 3.8
Dec 22, 2019: NumPy 1.18
Jun 20, 2020: NumPy 1.19
Oct 05, 2020: Python 3.9
Jan 30, 2021: NumPy 1.20
Jun 22, 2021: NumPy 1.21
Oct 04, 2021: Python 3.10
Dec 31, 2021: NumPy 1.22
Jun 22, 2022: NumPy 1.23
Oct 24, 2022: Python 3.11
Dec 18, 2022: NumPy 1.24
"""
releases = []
plus42 = timedelta(days=int(365*3.5 + 1))
plus24 = timedelta(days=int(365*2 + 1))
for line in data.splitlines():
date, project_version = line.split(':')
project, version = project_version.strip().split(' ')
release = datetime.strptime(date, '%b %d, %Y')
if project.lower() == 'numpy':
drop = release + plus24
else:
drop = release + plus42
releases.append((drop, project, version, release))
releases = sorted(releases, key=lambda x: x[0])
py_major,py_minor = sorted([int(x) for x in r[2].split('.')] for r in releases if r[1] == 'Python')[-1]
minpy = f"{py_major}.{py_minor+1}+"
num_major,num_minor = sorted([int(x) for x in r[2].split('.')] for r in releases if r[1] == 'NumPy')[-1]
minnum = f"{num_major}.{num_minor+1}+"
toprint_drop_dates = ['']
toprint_support_table = []
for d, p, v, r in releases[::-1]:
df = d.strftime('%b %d, %Y')
toprint_drop_dates.append(
f'On {df} drop support for {p} {v} '
f'(initially released on {r.strftime("%b %d, %Y")})')
toprint_support_table.append(f'{df} {minpy:<6} {minnum:<5}')
if p.lower() == 'numpy':
minnum = v+'+'
else:
minpy = v+'+'
print("On next release, drop support for Python 3.5 (initially released on Sep 13, 2015)")
for e in toprint_drop_dates[-4::-1]:
print(e)
print('============ ====== =====')
print('Date Python NumPy')
print('------------ ------ -----')
for e in toprint_support_table[-4::-1]:
print(e)
print('============ ====== =====')
著作權#
本文檔已置於公共領域。