PEP 605 – Ein rollierender Feature-Release-Stream für CPython
- Autor:
- Steve Dower <steve.dower at python.org>, Alyssa Coghlan <ncoghlan at gmail.com>
- Discussions-To:
- Discourse thread
- Status:
- Abgelehnt
- Typ:
- Informational
- Erstellt:
- 20-Sep-2019
- Python-Version:
- 3.9
- Post-History:
- 01-Okt-2019, 06-Okt-2019, 20-Okt-2019
Inhaltsverzeichnis
- Ablehnungsbescheid
- Zusammenfassung
- Beispiel für zukünftige Release-Zeitpläne
- Beispiele für zukünftige Release-Ankündigungen
- Motivation
- Ziele dieses Vorschlags
- Vorschlag
- Zwei-Jahres-Kadenz für stabile Releases
- Zusammenlegung der Alpha- und Beta-Phasen zu einer „Pre-Freeze“-Phase
- Release-Candidate-Politik, Phasen-Dauer und Kadenz
- Änderungen an der Verwaltung der stabilen CPython-C-ABI
- Änderungen an der Verwaltung der vollständigen CPython-ABI
- Aktualisierung von „Python-Requires“ für Projekte, die von Änderungen an der vollständigen C-ABI betroffen sind
- Vorbehalte und Einschränkungen
- Design-Diskussion
- Warum rollierende Pre-Freeze-Releases anstelle von einfach häufigeren X.Y.0-Releases?
- Ist es notwendig, das Namensschema „Alpha“ und „Beta“ beizubehalten?
- Warum rollierende Pre-Freeze-Releases anstelle von abwechselnden stabilen und instabilen Release-Serien?
- Warum nicht Kalenderversionierung für den rollierenden Release-Stream verwenden?
- Wie würden Benutzer der rollierenden Pre-Freeze-Releases API-Änderungen erkennen?
- Warum eine neue Pre-Freeze-ABI-Flagge hinzufügen, um Recompilierungen nach X.Y.0rc1 zu erzwingen?
- Warum zusätzliche Alpha-Releases nach X.Y.0a1 zulassen?
- Auswirkungen auf die CPython-Kernentwicklung
- Auswirkungen auf die Entwicklung von Python-Bibliotheken
- Auswirkungen auf die vorgeschlagene Support-Periode für das wissenschaftliche Python-Ökosystem
- Abstimmung des Release-Zyklus auf Core-Entwicklungs-Sprints
- Abstimmung des Release-Zyklus auf prominente Linux-Distributionen
- Auswirkungen auf einfache Bereitstellungsumgebungen
- Auswirkungen auf komplexe Bereitstellungsumgebungen
- Danksagungen
- Referenzen
- Urheberrecht
Ablehnungsbescheid
Dieser PEP wurde zugunsten von PEP 602 abgelehnt. Die potenzielle Alpha/Beta-Abwechslung wurde als zu verwirrend empfunden und die Zwei-Jahres-Kadenz zwischen den Releases als zu lang.
Zusammenfassung
Lange Zeit war die nominelle Kadenz von CPython-Feature-Releases „alle 18–24 Monate“, und in den letzten Jahren lag sie ziemlich konstant am „18-Monats“-Ende dieses Fensters. PEP 607 bietet einige allgemeine Hintergrundinformationen zu den Problemen, die sich aus dieser Kadenzwahl ergeben, sowie einige der Risiken, die bei der Änderung dieser Kadenz berücksichtigt werden müssen.
Der in diesem PEP vorgeschlagene Ansatz zielt darauf ab, die Benutzerbasis von CPython in zwei unterschiedliche, aber überlappende Gruppen aufzuteilen:
- Benutzer von stabilen Feature-Releases (und deren zugehörigen Wartungs-Release-Streams), die alle 24 Monate veröffentlicht werden; und
- Frühadopter eines neuen rollierenden Release-Streams, der den bisherigen CPython-Pre-Release-Prozess ersetzt.
Als Teil dieses Vorschlags würde die Nutzungsempfehlung für Beta-Releases von „nicht für den Produktionseinsatz geeignet“ auf „nur für den Produktionseinsatz geeignet in Umgebungen mit ausreichend robusten Kompatibilitätstests und operativen Überwachungsfunktionen“ geändert werden.
In ähnlicher Weise würde die Empfehlung für Alpha-Releases dahingehend geändert, dass sie „für Kompatibilitätstests von Bibliotheken und die Erstellung von ABI-kompatiblen Binärartefakten bestimmt sind“ anstelle der einfachen Aussage „nicht für den Produktionseinsatz geeignet“.
Die Autoren des PEP sind der Meinung, dass diese Ergebnisse durch die Änderung des Pre-Release-Management-Prozesses von CPython wie im folgenden Abschnitt „Vorschlag“ beschrieben erzielt werden können.
Dieser PEP schlägt auch vor, die Häufigkeit von X.Y.0-Releases anzupassen, um jede neue Release-Serie im August alle zwei Jahre zu beginnen (beginnend 2021, etwa zwei Jahre nach der Veröffentlichung von Python 3.8.0).
Beispiel für zukünftige Release-Zeitpläne
Im Rahmen dieses Vorschlags würde Python 3.9.0a1 im Dezember 2019 veröffentlicht werden, zwei Monate nach dem grundlegenden Feature-Release von Python 3.8.0 im Oktober 2019.
Unter der Annahme, dass keine weiteren abwärts inkompatiblen Änderungen an der vollständigen CPython-ABI vorgenommen wurden, würde das 3.9.0b2-Release zwei Monate später im Februar 2020 folgen und bis 3.9.0b9 im April 2021 fortgesetzt werden.
Jedes Mal, wenn eine abwärts inkompatible Änderung an der vollständigen CPython-ABI eingeführt wurde, würde die erste Pre-Release, die sie enthielt, als Alpha-Release gekennzeichnet werden.
3.9.0rc1 würde im Juni 2021 veröffentlicht, 3.9.0rc2 im Juli 2021, und dann würde die vollständige Veröffentlichung als 3.9.0 im August 2021 erfolgen.
Der Zyklus würde im Oktober 2021 mit der Veröffentlichung von 3.10.0a1 (4 Monate nach Erstellung des Wartungszweigs 3.9.x) von neuem beginnen.
Der genaue Zeitplan für Wartungs-Releases liegt im Ermessen des Release-Teams, aber unter der Annahme, dass auch für 3.9.x alle zwei Monate Wartungs-Releases erscheinen würden (versetzt zu den Beta-Releases von 3.10.0), würde der gesamte Release-Zeitplan wie folgt aussehen:
- 2019-12: 3.9.0a1
- 2020-02: 3.9.0b2
- … Beta- (oder Alpha-) Releases alle zwei Monate
- 2021-04: 3.9.0b9
- 2021-06: 3.9.0rc1 (Feature-Freeze, ABI-Freeze, pyc-Format-Freeze)
- 2021-07: 3.9.0rc2
- 2021-08: 3.9.0
- 2021-09: 3.9.1, 3.8.x (letztes binäres Wartungs-Release von 3.8.x)
- 2021-10: 3.10.0a1
- 2021-11: 3.9.2
- 2021-12: 3.10.0b2
- … Beta- (oder Alpha-) und Wartungs-Releases setzen sich in alternierenden Monaten fort
- 2023-04: 3.10.0b10
- 2023-05: 3.9.11
- 2023-06: 3.10.0rc1 (Feature-Freeze, ABI-Freeze, pyc-Format-Freeze)
- 2023-07: 3.10.0rc2, 3.9.12
- 2023-08: 3.10.0
- 2023-09: 3.10.1, 3.9.13 (letztes binäres Wartungs-Release von 3.9.x)
- 2023-10: 3.11.0a1
- 2023-12: 3.11.0b2
- … etc.
Wenn wir annehmen, dass zwei zusätzliche Pre-Releases eingeführt wurden, die abwärts inkompatible Änderungen an der vollständigen CPython-ABI in den Releases 3.9.0a5 und 3.9.0a7 enthielten, dann würde der Gesamt-Kalender wie folgt aussehen:
Abbildung 1. Auswirkung der Änderungen am Pre-Release-Prozess auf den Kalender.
In diesem Modell gibt es immer zwei oder drei aktive Wartungszweige, was in dieser Hinsicht den Status quo bewahrt. Der Hauptunterschied besteht darin, dass wir die Anbieter ermutigen würden, vorab kompilierte Binärdateien für die rollierenden Pre-Freeze-Releases zusätzlich zu den stabilen Wartungszweigen bereitzustellen.
Abbildung 2. Testmatrix im 18-Monats-Kadenz vs. dem 24-Monats-Kadenz.
Paketanbieter, die auf die vollständige CPython-ABI abzielen und vorab kompilierte Binärdateien für die rollierenden Pre-Freeze-Releases bereitstellen möchten, müssten mindestens neue Wheel-Archive nach der Veröffentlichung von 3.9.0a1 erstellen. Ob sie aktualisierte Binärdateien nach späteren Alpha-Releases (z. B. die Releases 3.9.0a5 oder 3.9.0a7 in der Beispiel-Zeitachse) veröffentlichen müssen, hängt davon ab, ob sie tatsächlich von den ABI-Brüchen in diesen späteren Releases betroffen waren.
Wie beim Status quo müssen alle Paketanbieter, die vorab kompilierte Binärdateien für die endgültige Veröffentlichung bereitstellen möchten, neue Wheel-Archive nach dem Datum des ABI-Freezes erstellen. Im Gegensatz zum Status quo wird dieses Datum durch die Veröffentlichung des ersten Release Candidates klar gekennzeichnet und findet früh genug statt, um den Anbietern einige Monate Zeit zur Vorbereitung auf die endgültige Veröffentlichung zu geben.
Beispiele für zukünftige Release-Ankündigungen
Wenn dieser PEP akzeptiert wird, wären die Hauptkanäle zur Kommunikation des aktualisierten Pre-Release-Management-Prozesses an Endbenutzer das „Was ist neu in Python 3.9“-Dokument und die Release-Ankündigungen selbst.
Dieser Abschnitt enthält Entwürfe für Texte, die für diese Zwecke verwendet werden könnten.
Vorgeschlagener Eintrag „Was ist neu in Python 3.9“
Die folgende Unterabschnitt würde dem Dokument „Was ist neu in Python 3.9“ hinzugefügt und von jeder Python 3.9 Alpha- und Beta-Ankündigung verlinkt werden.
PEP 605: Änderungen am Prozess der Vorabversionsverwaltung
Wie in PEP 605 detailliert, wurde der Pre-Release-Management-Prozess aktualisiert, um eine rollierende Serie von Beta-Releases zu produzieren, die für den Produktionseinsatz in Umgebungen mit ausreichend robusten Integrations-Tests und operativen Überwachungsfunktionen als geeignet gelten.
Unter diesem neuen rollierenden Modell sind die Alpha- und Beta-Releases als Teil einer kombinierten „Pre-Freeze“-Periode vermischt, wobei Alpha-Releases Brüche in der vollständigen CPython-ABI anzeigen, die eine Neukompilierung von Erweiterungsmodulen oder Einbettungsanwendungen erfordern können, und Beta-Releases vollständige Binärkompatibilität mit der unmittelbar vorhergehenden Pre-Release anzeigen.
Im Gegensatz zu früheren Releases wird die Veröffentlichung von vorab kompilierten Binärdateien für 3.9.0 Alpha- und Beta-Releases aktiv gefördert, da ein neues Pre-Release-ABI-Flag („p“) nun gesetzt wird, wenn Erweiterungsmodule vor dem vollständigen CPython-ABI-Freeze kompiliert und geladen werden, was sicherstellt, dass alle solchen Pre-Freeze-Erweiterungsmodul-Builds von Post-Freeze-Interpreter-Builds ignoriert werden.
Die vollständige CPython-ABI wird eingefroren und das Pre-Release-Flag von den ABI-Flags in 3.9.0rc1 entfernt, was voraussichtlich 2 Monate vor der endgültigen Veröffentlichung von 3.9.0 erfolgen wird (siehe Release-Zeitplan in PEP 596 für genaue Zieldaten).
Für Anwendungsentwickler bietet die Migration zum rollierenden Release-Stream die Möglichkeit, aktiv an der Gestaltung und Entwicklung von Verbesserungen der Standardbibliothek und des Referenzinterpreters vor der nächsten stabilen Veröffentlichung teilzunehmen. Sie bietet auch die Möglichkeit, von Leistungsverbesserungen des Interpreters bis zu einem Jahr oder länger vor ihrer Verfügbarkeit in einer stabilen Veröffentlichung zu profitieren.
Für Bibliotheksentwickler, die vorab kompilierte Wheel-Archive veröffentlichen, erfordert die Entscheidung, den 3.9.x-Roll-Release-Stream zusätzlich zur stabilen 3.8-Release-Serie zu unterstützen, keine spezifische Aktion, wenn das Projekt bereits reine Python-Wheels (getaggt als py3-none-any) oder Builds gegen die stabile C-ABI (getaggt als cp38-abi3-<platform> oder das Äquivalent einer früheren CPython 3.x-Version) veröffentlicht.
Für Bibliotheksentwickler, die vorab kompilierte Wheel-Archive veröffentlichen, die gegen die vollständige CPython-ABI erstellt wurden, müssen die Binärdateien für die 3.9-stabile Release-Serie nach dem vollständigen CPython-ABI-Freeze (d. h. mit 3.9.0rc1 oder später) erstellt werden.
Entwickler dieser Bibliotheken können sich auch dafür entscheiden, den rollierenden Release-Stream zu unterstützen, indem sie gegen die 3.9.0a1-Version (oder eine spätere Beta-Version) kompilieren und das Ergebnis wie gewohnt veröffentlichen.
Im Idealfall funktionieren auf diese Weise kompilierte Binärdateien bis zur letzten Pre-Freeze-Version. Wenn das Projekt jedoch von einer Änderung in der vollständigen CPython-C-ABI während der Pre-Freeze-Periode betroffen ist, muss eine Wartungsaktualisierung veröffentlicht werden, die die betroffenen Binärdateien gegen die Alpha-Version neu kompiliert, die die relevante Schnittstelle geändert hat. In diesen Fällen sollte ein entsprechender Python-Requires-Eintrag in den Projektmetadaten hinzugefügt werden. Wenn beispielsweise ein Projekt von einer ABI-Änderung betroffen ist, die in 3.9.0a5 eingeführt wurde, dann wäre der hinzuzufügende Python-Requires-Eintrag:
Python-Requires: >= "3.9.0b6"; python_version == "3.9" and full_python_version != "3.9.0a5"
(Diese zusätzlichen Metadaten stellen sicher, dass die aktualisierte Version nicht auf früheren Pre-Releases der 3.9er Serie installiert wird, die eine ältere Variante der ABI anbieten.)
Wie bei den Anwendungsentwicklern haben auch Bibliotheksentwickler, die sich entscheiden, den rollierenden Release-Stream zu unterstützen, die Möglichkeit, Feedback zu neuen und aktualisierten API-Designs zu geben, *bevor* sie für mehrere Jahre in einem stabilen Release (oder als provisorische API in einer stabilen Release-Serie) gesperrt werden.
Beispielhafter Ankündigungstext für das Release 3.9.0a1
Dies ist die erste Vorschauversion von Python 3.9. Als Alpha-Release ist sie für Kompatibilitätstests von Bibliotheken und Anwendungen sowie für die Erstellung von ABI-kompatiblen Binärartefakten bestimmt. Die Verwendung in Produktionsumgebungen wird nicht empfohlen.
Änderungen am Prozess der Vorabversionsverwaltung
CPython ist auf einen neuen Pre-Release-Management-Prozess umgestiegen, der darauf ausgelegt ist, eine rollierende Serie von Beta-Releases zu produzieren, die für den Produktionseinsatz in Umgebungen mit ausreichend robusten Integrations-Tests und operativen Überwachungsfunktionen als geeignet gelten. Details finden Sie im Dokument „Was ist neu in Python 3.9“ (verlinkt zum relevanten Abschnitt).
Wichtige neue Features der 3.9er Serie im Vergleich zu 3.8
Viele neue Features für Python 3.9 sind noch in Planung und werden entwickelt. Zu den wichtigsten bereits implementierten neuen Features und Änderungen gehören:
- …
- (Hallo, Kollege Core-Entwickler oder Nutzer des rollierenden Release-Streams, wenn Ihnen ein wichtiges Feature in dieser Liste fehlt, informieren Sie bitte <den Release Manager>.)
Das nächste Pre-Release von Python 3.9 wird voraussichtlich 3.8.0b2 sein, derzeit geplant für den 02.02.2020.
Beispielhafter Ankündigungstext für das Release 3.9.0b2
Dies ist die zweite Vorschauversion von Python 3.9. Als Beta-Release ist sie vollständig binärkompatibel mit dem vorherigen 3.9.0a1-Release. Die Verwendung in Produktionsumgebungen wird nur in Umgebungen mit ausreichend robusten Integrations-Tests und operativen Überwachungsfunktionen empfohlen.
(Rest wie in der Ankündigung von 3.9.0a1, mit Aktualisierungen für implementierte Änderungen und dem nächsten erwarteten Release 3.9.0b3)
Beispielhafter Ankündigungstext für 3.9.0a5 (eine Alpha-Version mitten im Stream)
Dies ist die fünfte Vorschauversion von Python 3.9. Als Alpha-Release ist sie NICHT vollständig binärkompatibel mit dem vorherigen 3.9.0b4-Release. Dieses Release ist für Kompatibilitätstests von Bibliotheken und Anwendungen sowie für die Erstellung von ABI-kompatiblen Binärartefakten bestimmt. Die Verwendung in Produktionsumgebungen wird nicht empfohlen.
Abwärts inkompatible Änderungen in der vollständigen CPython-ABI zwischen 3.9.0b4 und 3.9.0a5
- neues Feld
ob_examplezurPyObjectStruktur hinzugefügt - provisorisches Feld
tp_exampleaus derPyTypeObjectStruktur entfernt
Projekte, die den rollierenden Release-Stream unterstützen und einen Rebuild benötigen, um die Binärkompatibilität wiederherzustellen, sollten die folgenden Metadaten zu ihrem aktualisierten Release hinzufügen:
Python-Requires: >= "3.9.0b6"; python_version == "3.9" and full_python_version != "3.9.0a5"
(Rest wie in der Ankündigung von 3.9.0a1, mit Aktualisierungen für implementierte Änderungen und dem nächsten erwarteten Release 3.9.0b6)
Beispielhafter Ankündigungstext für 3.9.0rc1
Dies ist der erste Release Candidate für Python 3.9. Als Release Candidate ist dieses Release nun funktionsvollständig, die vollständige CPython-ABI ist nun eingefroren, und das Pre-Release-Marker wurde von den ABI-Kompatibilitätsflags entfernt. Die Verwendung in Produktionsumgebungen wird nur in Umgebungen mit ausreichend robusten Integrations-Tests und operativen Überwachungsfunktionen empfohlen.
Vorbereitung auf die endgültige Veröffentlichung von 3.9.0
Da die vollständige CPython-ABI nun eingefroren ist, werden Bibliotheksentwickler, die auf diese ABI abzielen, ermutigt, Binärdateien für die stabile 3.9.x-Serie zu erstellen und zu veröffentlichen.
Anwendungsentwickler, die nicht gegen den rollierenden Release-Stream getestet haben, werden ermutigt, ihre Anwendungen gegen den Release Candidate zu testen und alle Kompatibilitätsregressionen zu melden, die nicht bereits im Portierungsleitfaden erwähnt wurden (verlinkt zum relevanten Abschnitt „Was ist neu“).
Ein zweiter Release Candidate ist für den 02.07.2021 geplant, und die endgültige Veröffentlichung von 3.9.0 ist für den 02.08.2021 geplant.
Wichtige neue Features der 3.9er Serie im Vergleich zu 3.8
Einige der wichtigsten neuen Features und Änderungen in diesem Release:
- …
- (Hallo, Kollege Core-Entwickler oder Nutzer des rollierenden Release-Streams, wenn Ihnen ein wichtiges Feature in dieser Liste fehlt, informieren Sie bitte <den Release Manager>.)
Motivation
Die aktuellen CPython-Pre-Release- und Release-Management-Prozesse wurden in einer Zeit entwickelt, in der automatisierte Continuous-Integration- und operative Überwachungssysteme noch relativ unreif waren. Seitdem haben viele Organisationen Bereitstellungsmodelle übernommen, die es ihnen ermöglichen, neue CPython-Feature-Releases zu integrieren, ohne wesentlich mehr Risiko einzugehen als bei jeder anderen Codeänderung. Neuere Bereitstellungsmodelle, wie leichtgewichtige, aufgabenbezogene Anwendungscontainer, erleichtern auch die Kombination einer Anwendung mit einer Sprachlaufzeit in einer CI-Pipeline und deren Beibehaltung, bis das gesamte Container-Image später durch ein aktualisiertes ersetzt wird.
Angesichts dieser Änderungen im breiteren Umfeld hat PEP 602 vorgeschlagen, die Latenzzeit bei der Bereitstellung von Features für die Python-Standardbibliothek und den CPython-Referenzinterpreter zu reduzieren, indem die Häufigkeit von CPython-Feature-Releases von alle 18–24 Monate auf alle 12 Monate erhöht wird.
Leider skalieren die Kosten für viele Organisationen bei der Einführung einer neuen Python-Version nicht automatisch nach unten, wenn die Anzahl der Änderungen in der Version reduziert wird, da die Hauptkosten nicht mit der Behebung entdeckter Probleme verbunden sind; die Hauptkosten sind mit der *Suche* nach Problemen verbunden. Diese Suche kann manuelle Tests von Softwaresystemen, menschliche Überprüfung von schriftlichen Materialien und andere Aktivitäten umfassen, bei denen die benötigte Zeit mit der Größe des bestehenden Systems und nicht mit der Anzahl der Änderungen zwischen den Python-Versionen skaliert.
Für Entwickler von Drittanbieterbibliotheken sind die Kosten hauptsächlich mit der *Anzahl* der unterschiedlichen, weit verbreiteten Python-Versionen verbunden. Dies wird derzeit tendenziell durch eine Kombination beeinflusst, welche Releases noch aktiv von python-dev gewartet werden und welche Releases die neuesten Versionen sind, die von bestimmten Redistributoren angeboten werden (wobei die Python-Versionen von Debian, Ubuntu LTS und RHEL/CentOS besonders beliebte Entwicklungsziele sind). Zusätzlich zu den grundlegenden CI-Kosten für Tests mit mehreren Python-Versionen kann die Verbreitung von mehr Varianten die Bestimmung erschweren, ob ein Fehlerbericht ein tatsächlicher Fehler im Projekt ist oder ein Problem in der Umgebung des meldenden Benutzers.
PEP 602 schlägt vor, dass betroffene Organisationen und Projekte einfach auf jede zweite oder dritte CPython-Version umsteigen, anstatt zu versuchen, jede Version zu übernehmen. Dies birgt jedoch eigene neue Probleme, die gelöst werden müssen, sowohl praktische (z. B. müssten Deprecations mehr als eine Version abdecken, wenn wir erwarten, dass Benutzer routinemäßig Versionen überspringen) als auch kulturelle (z. B. bei einer größeren Anzahl von aktiv genutzten Versionen steigt die Wahrscheinlichkeit erheblich, dass Open-Source-Bibliotheksentwickler Fehlerberichte erhalten, die nur bei Python-Versionen auftreten, die sie selbst nicht verwenden).
PEP 598 war ein erster Versuch eines der Autoren dieses PEPs, ein alternatives Schema zur Reduzierung der Latenzzeit bei der Feature-Bereitstellung vorzuschlagen, indem eine Politik im Stil der semantischen Versionierung übernommen wurde, die die inkrementelle Bereitstellung rückwärtskompatibler Features innerhalb einer Release-Serie ermöglichte, bis diese Serie den Feature-Complete-Status erreichte. Diese Variante hatte immer noch die unerwünschte Folge, sichtbare Änderungen für Endbenutzer einzuführen, die mit dem aktuellen Release-Management-Modell zufrieden genug sind.
Dieser PEP vertritt die Ansicht, dass sowohl PEP 598 als auch PEP 602 einen gemeinsamen Fehler aufweisen: Sie versuchen, die Bedürfnisse zweier sehr unterschiedlicher Zielgruppen innerhalb der Einschränkungen eines einzigen Release-Modells zu erfüllen, was zu widersprüchlichen Designanforderungen und der Notwendigkeit unbequemer Kompromisse zwischen diesen widersprüchlichen Anforderungen führt. Der in diesem PEP vorgeschlagene Ansatz zielt darauf ab, diesen Fehler zu vermeiden, indem die Schaffung von zwei *unterschiedlichen* produktionsbereiten Release-Streams vorgeschlagen wird, wobei der bestehende Release-Stream weitgehend unverändert bleibt, während der neue Release-Stream auf die Zielgruppe zugeschnitten ist, die am meisten von einer Reduzierung der Latenzzeit bei der Feature-Bereitstellung profitieren würde.
Ziele dieses Vorschlags
Der in diesem PEP vorgeschlagene Ansatz beruht auf den folgenden Kernannahmen:
- die überwiegende Mehrheit der Python-Benutzer verlangt nicht aktiv nach neuen Sprach- und Runtime-Features, sondern aktualisiert nur, wenn entweder die zuvor verwendete Version nicht mehr unterstützt wird, ihr Python-Anbieter standardmäßig eine neuere Version anbietet oder genügend für sie interessante Änderungen angesammelt wurden, um einen überzeugenden Grund für ein Upgrade zu liefern.
- bei vielen Benutzern neuer Releases ergeben sich viele der Arbeiten bei der Übernahme einer neuen Version nicht aus Kompatibilitätsproblemen auf Sprachebene, sondern aus Kompatibilitätsproblemen auf Komponentenebene (d. h. Änderungen an Dateinamen und Installationspfaden).
- dass es eine Teilmenge der Python-Benutzerbasis gibt, die bereit wäre, produktionsreife Pre-Releases (ähnlich wie Windows Insider oder Debian Testing Builds) für mindestens einige ihrer Anwendungsfälle zu nutzen.
Der Kern des in diesem PEP vorgeschlagenen Ansatzes besteht darin, den CPython-Pre-Release-Prozess zu ändern, um einen rollierenden Stream von inkrementellen Feature-Releases in regelmäßiger Kadenz zu produzieren und sicherzustellen, dass die meisten dieser Builds ein ausreichendes Stabilitätsniveau bieten, um für den Einsatz in angemessen verwalteten Produktionssystemen geeignet zu sein.
Durch die Übernahme dieses Ansatzes zielt der Vorschlag darauf ab, ein verbessertes Ergebnis für fast alle Python-Benutzer und -Beitragenden zu erzielen:
- Für Benutzer des neuen inkrementellen Feature-Release-Streams ermöglicht die Ausrichtung auf die Pre-Release-Phase eine noch geringere Latenzzeit bei der Feature-Bereitstellung als die jährliche Kadenz, die in PEP 602 vorgeschlagen wird.
- Für Core-Entwickler, die an neuen Features arbeiten, sollten die erhöhte Häufigkeit und Akzeptanz von Pre-Releases die Feedbackzyklen für Pre-Releases verbessern.
- Für Benutzer des etablierten Release-Streams sollten die erhöhte Akzeptanz und die verbesserten Feedbackzyklen während der Pre-Release-Periode zu einer erhöhten Feature-Reife zum Zeitpunkt der ersten X.Y.0-Veröffentlichung sowie zu einem höheren Grad an Ökosystembereitschaft führen.
- Für Python-Bibliotheksentwickler sollen die rollierenden Pre-Release-Streams hoffentlich mehr Möglichkeiten bieten, Designprobleme zu erkennen und zu beheben, bevor sie in einem vollständigen stabilen Release landen, als der aktuelle Pre-Release-Management-Prozess bietet.
- Für Entwickler von alternativen Python-Implementierungen kann der rollierende Pre-Release-Stream einen zusätzlichen Anreiz für Autoren von Erweiterungsmodulen bieten, von der vollständigen CPython-ABI zur stabilen Python-ABI zu migrieren, was auch dazu beitragen würde, mehr des Ökosystems mit Implementierungen kompatibel zu machen, die nicht die vollständige CPython-C-API emulieren.
Dennoch wird anerkannt, dass nicht alle Ergebnisse dieses Vorschlags für alle Mitglieder des breiteren Python-Ökosystems von Vorteil sein werden:
- Für Python-Bibliotheksentwickler würden sowohl dieser PEP als auch PEP 602 wahrscheinlich Druck von Benutzern ausüben, die schnellere Release-Kadenz zu unterstützen. Während dieser PEP versucht, dies zu mildern, indem klar gekennzeichnet wird, welche Pre-Releases potenziell abwärts inkompatible Änderungen an der vollständigen CPython-C-ABI enthalten, und PEP 602 versucht, dies zu mildern, indem die minimale Zeit zwischen vollständigen Releases bei 12 Monaten gehalten wird, ist es nicht möglich, diesen Nachteil vollständig zu eliminieren.
- Für Entwickler von Drittanbieter-Erweiterungsmodulen würden sowohl dieser PEP als auch PEP 602 wahrscheinlich Druck von Benutzern ausüben, die stabile ABI-Unterstützung anbieten, um Wheel-Archive bereitzustellen, die mit der neuen Version kompatibel sind, sobald diese verfügbar ist. Ob dies ein Netto-Negativum ist oder nicht, hängt davon ab, wie die Anfrage an sie gestellt wird (es könnte positiv sein, wenn die Anfrage in Form eines höflichen Beitrags zu ihrem Projekt von einem Entwickler kommt, der daran interessiert ist, die rollierenden Pre-Freeze-Releases zu unterstützen).
- Für einige Benutzer des etablierten Release-Streams, die auf die Verfügbarkeit von vorab kompilierten Wheel-Archiven angewiesen sind, mag der Wechsel zur Übernahme einer neuen Version alle 12 Monate eine akzeptable Erhöhung der Rate sein, während die konsistente Bewegung zum 24-Monats-Ende der historischen 18–24-Monats-Kadenz eine unerwünschte Reduzierung der Rate im Vergleich zum 18-Monats-Zyklus darstellen würde, der für neuere Releases verwendet wurde. Ob dieser Vorschlag für diese Benutzer ein Netto-Negativum wäre, hängt davon ab, ob wir die Bibliotheksentwickler davon überzeugen können, dass es sich lohnt, die kommende stabile Version während ihrer Pre-Freeze-Periode zu unterstützen, anstatt bis ihre API und ABI eingefroren sind.
Vorschlag
Die Mehrheit der in diesem PEP vorgeschlagenen Änderungen betrifft nur die Handhabung von Pre-Release-Versionen. Die einzige Änderung, die vollständige Release-Versionen betrifft, ist eine vorgeschlagene Änderung ihrer Kadenz.
Zwei-Jahres-Kadenz für stabile Releases
Da die rollierenden Pre-Freeze-Releases für Benutzer verfügbar sind, die die neuesten Versionen des Referenzinterpreters und der Standardbibliothek nutzen möchten, schlägt dieser PEP vor, die Häufigkeit von X.Y.0-Releases anzupassen, um alle zwei Jahre im August eine neue stabile Version zu veröffentlichen (beginnend 2021, etwa zwei Jahre nach der Veröffentlichung von Python 3.8.0).
Diese Änderung ist wohl orthogonal zu den vorgeschlagenen Änderungen an der Handhabung der Pre-Freeze-Release-Periode, aber die Verbindung ist, dass ohne diese Änderungen am Pre-Release-Management die Nachteile einer Zwei-Jahres-Full-Release-Kadenz die Vorteile wahrscheinlich überwiegen würden, während das Gegenteil für eine 12-Monats-Release-Kadenz gilt (d. h. mit den in diesem PEP vorgeschlagenen Änderungen am Pre-Release-Management würden die Nachteile einer 12-Monats-Full-Release-Kadenz die Vorteile überwiegen).
Zusammenlegung der Alpha- und Beta-Phasen zu einer „Pre-Freeze“-Phase
Anstatt des Status quo fortzuführen, bei dem die Alpha- und Beta-Phasen vor der Veröffentlichung getrennt und sequenziell sind, schlägt dieser PEP vor, sie stattdessen in eine einzige „Pre-Freeze“-Phase mit einer monoton steigenden Seriennummer für die Releases zu kombinieren.
Anstatt getrennte Phasen zu bezeichnen, würden die Namen „Alpha“ und „Beta“ stattdessen angeben, ob das Release abwärts inkompatible Änderungen an der vollständigen CPython-C-ABI enthält oder nicht.
- „Alpha“-Releases wären „ABI-breaking“-Releases, bei denen Erweiterungsmodule, die gegen die vollständige CPython-ABI im vorhergehenden Pre-Release kompiliert wurden, nicht unbedingt korrekt geladen werden.
- „Beta“-Releases wären „binärkompatible“ Releases, bei denen Erweiterungsmodule, die gegen die vollständige CPython-ABI im vorhergehenden Pre-Release kompiliert wurden, voraussichtlich korrekt geladen werden, solange diese Module die folgenden zusätzlichen Kriterien einhalten:
- das Modul darf keine provisorischen oder privaten C-APIs (entweder aus der vorherigen stabilen Release-Serie oder der in Entwicklung befindlichen Pre-Release-Serie) verwenden, die in diesem Beta-Release entfernt oder auf eine ABI-inkompatible Weise geändert wurden.
- das Modul darf keine C-APIs verwenden, die in der vorherigen stabilen Release-Serie als veraltet markiert und in diesem Beta-Release entfernt wurden.
Dauer und Kadenz der Pre-Freeze-Phase
Anstatt monatlich für einen Zeitraum von einigen Monaten veröffentlicht zu werden, während auf ein neues X.Y.0-Release vorbereitet wird, würden Pre-Freeze-Releases stattdessen konsistent alle zwei Monate veröffentlicht werden.
Die einzige Ausnahme von dieser Regel wäre während der zweimonatigen Release-Candidate-Periode für eine bevorstehende X.Y.0-Version (weitere Einzelheiten finden Sie im Abschnitt über Release Candidates unten). Dies bedeutet, dass zwei ansonsten geplante Veröffentlichungen übersprungen würden (eine entsprechend dem ersten Release-Candidate-Datum, eine mit dem Datum der endgültigen Veröffentlichung).
Die Pre-Freeze-Phase würde typischerweise 2 Monate nach der vorherigen stabilen X.Y.0-Veröffentlichung beginnen.
Die erste Pre-Freeze-Veröffentlichung für jede neue Release-Serie wird immer X.Y.0a1 sein (da es keine vorherige Veröffentlichung mit denselben ABI-Versionsmarkern gibt, um die Binärkompatibilität zu beurteilen).
Pre-Freeze-Veröffentlichungen würden ein zusätzliches Flag in ihren C-ABI-Kompatibilitätsmarkern erhalten, um Binärkompatibilitätsprobleme mit der endgültigen stabilen Veröffentlichung zu vermeiden.
Release-Politik für Beta-Releases
Diese PEP schlägt vor, dass die Richtlinie für Beta-Versionen wie folgt festgelegt wird:
- Wie bei aktuellen Beta-Versionen wird erwartet, dass die stabile BuildBot-Flotte vor der Vorbereitung und Veröffentlichung der Beta-Version grün ist.
- Wie bei aktuellen Beta-Versionen wird erwartet, dass der Release-Manager offene Release-Blocker-Probleme vor der Vorbereitung und Veröffentlichung der Beta-Version prüft.
- Wie bei aktuellen Beta-Versionen wird erwartet, dass alle Ergänzungen zur stabilen C-ABI der
abi3permanent Teil dieser ABI werden, bis diese stabile ABI-Version vollständig zurückgezogen wird (Hinweis: Es gibt derzeit keine Pläne, die stabile ABI-Version zu erhöhen). - Im Gegensatz zu aktuellen Beta-Versionen gelten Beta-Versionen unter dieser PEP nicht als Feature-Complete für die nächste X.Y.0-Version.
- Im Gegensatz zu aktuellen Beta-Versionen gelten alle seit der letzten CPython-Feature-Veröffentlichung hinzugefügten APIs (außer Ergänzungen zur stabilen C-ABI) als provisorisch.
- Im Gegensatz zu aktuellen Beta-Versionen werden Beta-Versionen unter dieser PEP aus dem Master-Entwicklungszweig vorbereitet und veröffentlicht.
- Im Gegensatz zu aktuellen Alpha- oder Beta-Versionen müssen Beta-Versionen unter dieser PEP vollständig ABI-kompatibel mit der unmittelbar vorhergehenden Vorabversion der Serie sein (ausgenommen Änderungen an provisorischen APIs oder die Entfernung von APIs, die in der vorherigen Release-Serie als veraltet gekennzeichnet wurden).
Release-Politik für Alpha-Releases
Diese PEP schlägt vor, dass die Richtlinie für Alpha-Versionen wie folgt festgelegt wird:
- Wie bei aktuellen Alpha-Versionen wird erwartet, dass die stabile BuildBot-Flotte vor der Vorbereitung und Veröffentlichung der Alpha-Version grün ist.
- Wie bei aktuellen Alpha-Versionen wird erwartet, dass der Release-Manager offene Release-Blocker-Probleme vor der Vorbereitung und Veröffentlichung der Beta-Version prüft.
- Im Gegensatz zu aktuellen Alpha-Versionen wird erwartet, dass der Release-Manager auch für Alpha-Versionen ein ähnliches Stabilitätsniveau wie bei aktuellen Beta-Versionen anstrebt.
Unter dieser PEP wird eine Alpha-Version veröffentlicht, wenn es nicht möglich ist, eine Version zu veröffentlichen, die die Kriterien für eine Beta-Version erfüllt, und wenn zusätzliche Zeit vor der Veröffentlichung das Problem nicht löst.
Es wird erwartet, dass die vollständige CPython-API, die sich in einer Weise ändert, die die ABI-Kompatibilität bricht (z. B. wurde ein Feld zu oder aus einer öffentlichen Strukturdefinition hinzugefügt oder entfernt), der wahrscheinlichste Grund für die Veröffentlichung zusätzlicher Alpha-Versionen über den anfänglichen Kompatibilitätstag hinaus ist, der die X.Y.0a1-Version definiert, aber die Entscheidung für jede bestimmte Version liegt beim Release-Manager.
Release-Candidate-Politik, Phasen-Dauer und Kadenz
Angesichts der vorgeschlagenen Änderungen an den Alpha- und Beta-Release-Phasen würde die Release-Candidate-Phase die folgenden damit verbundenen Anpassungen erfahren:
- Feature-Freeze, ABI-Freeze, pyc-Dateiformat-Freeze und die Erstellung des Wartungszweigs würden alle mit der Erstellung von X.Y.0rc1 zusammenfallen (derzeit geschehen diese über eine Mischung aus X.Y.0b1, der letzten Beta-Version und X.Y.0rc1).
- Die X.Y.0 Release-Candidate-Periode würde von 3 Wochen auf 2 Monate verlängert.
- Normalerweise würden zwei Release Candidates im Abstand von einem Monat herausgegeben, aber zusätzliche Candidates können nach Ermessen des Release Managers veröffentlicht werden.
- Die endgültige X.Y.0-Version würde zwischen 1 und 4 Wochen nach dem letzten Release Candidate erfolgen (abhängig davon, ob nach dem zweiten zusätzliche Release Candidates benötigt wurden).
- Wenn die endgültige X.Y.0-Version über das August-Zieldatum hinaus verzögert wird, wird die nachfolgende Release-Serie nicht beeinträchtigt und wird weiterhin für August geplant (jetzt knapp zwei Jahre später).
Zusätzlich zur größeren Zeit für Endbenutzerfeedback zu den Release Candidates bietet diese angepasste Richtlinie den Maintainern von Python-Projekten zusätzliche Zeit, um vorab kompilierte Wheel-Archive für die neue stabile Release-Serie zu erstellen und zu veröffentlichen, was die anfängliche Benutzererfahrung der X.Y.0-Version erheblich verbessert.
Änderungen an der Verwaltung der stabilen CPython-C-ABI
Die stabile CPython-ABI [5] verpflichtet sich, dass Binär-Erweiterungsmodule, die gegen eine bestimmte CPython-Version kompiliert wurden, auch mit zukünftigen CPython-Versionen funktionieren, die dieselbe stabile ABI-Version unterstützen (diese Version ist derzeit abi3).
Unter dem vorgeschlagenen Rolling-Pre-Freeze-Release-Modell würde diese Verpflichtung erweitert, um auch für Beta-Versionen zu gelten: Sobald eine beabsichtigte Ergänzung zur stabilen ABI abi3 für die kommende Python-Version in einer Beta-Version ausgeliefert wurde, wird sie für zukünftige Versionen nicht mehr entfernt, solange die stabile ABI-Version abi3 unterstützt wird.
Zwei Hauptmechanismen stehen zur Verfügung, um Community-Feedback zu Ergänzungen zur stabilen ABI zu erhalten:
- Der bevorzugte Mechanismus ist, neue APIs zuerst zur vollständigen CPython-API hinzuzufügen und sie erst zur stabilen ABI zu befördern, nachdem sie in mindestens einer veröffentlichten Beta-Version enthalten waren und relevantes Benutzerfeedback erhalten haben.
- Für APIs, bei denen dieser Ansatz aus irgendeinem Grund nicht verfügbar ist (z. B. einige API-Ergänzungen dienen keinem nützlichen Zweck, wenn die vollständige CPython-API verfügbar ist), können Entwickler den Release-Manager bitten, die nächste Version als Alpha-Version zu kennzeichnen (auch ohne ABI-Bruch in der vollständigen CPython-API) und auf diese Weise weiteres Feedback zu erhalten.
Als leichte Verbesserung der Lesbarkeit und Benutzerfreundlichkeit schlägt diese PEP auch die Einführung von Aliassen für jede wichtige stabile ABI-Version vor.
#define Py_LIMITED_API_3_3 0x03030000
#define Py_LIMITED_API_3_4 0x03040000
#define Py_LIMITED_API_3_5 0x03050000
#define Py_LIMITED_API_3_6 0x03060000
#define Py_LIMITED_API_3_7 0x03070000
#define Py_LIMITED_API_3_8 0x03080000
#define Py_LIMITED_API_3_9 0x03090000
// etc...
Diese würden sowohl im Code von Erweiterungsmodulen verwendet, um die Ziel-ABI-Version festzulegen,
#define Py_LIMITED_API Py_LIMITED_API_3_8
Als auch in der CPython-Interpreter-Implementierung, um zu überprüfen, welche Symbole verfügbar gemacht werden sollen.
#if !defined(Py_LIMITED_API) || Py_LIMITED_API+0 >= Py_LIMITED_API_3_9
// A Python 3.9+ addition to the stable ABI would appear here
#endif
Die Dokumentation für die Rolling-Pre-Freeze-Releases und die stabile C-ABI würde klarstellen, dass Erweiterungsmodule, die gegen die stabile ABI in einer späteren Pre-Freeze-Veröffentlichung kompiliert wurden, möglicherweise nicht korrekt auf einer früheren Pre-Freeze-Veröffentlichung geladen werden.
Die Dokumentation für Alpha-Versionen und die stabile C-ABI würde klarstellen, dass selbst Erweiterungsmodule, die gegen die stabile ABI in einer Alpha-Version kompiliert wurden, möglicherweise nicht korrekt auf der nächsten Version geladen werden, wenn zwei Alpha-Versionen nacheinander veröffentlicht werden (dieser Fall wäre idealerweise selten).
Änderungen an der Verwaltung der vollständigen CPython-ABI
Diese PEP schlägt zwei Änderungen an der Verwaltung der vollständigen CPython-ABI vor.
Eine explizite Konvention für Commits und NEWS-Dateien zur Kennzeichnung von ABI-breaking Changes
Der Vorschlag in dieser PEP verlangt, dass Release-Manager in der Lage sein müssen, eine Pre-Freeze-Version entsprechend als Alpha- oder Beta-Version zu kennzeichnen, je nachdem, ob sie eine ABI-breaking-Änderung enthält oder nicht.
Um diesen Prozess zu unterstützen, werden Core-Entwickler gebeten, einen „(CPython ABI break)“-Marker am Anfang aller NEWS-Datei-Snippets für Änderungen aufzunehmen, die eine breaking-Änderung in der vollständigen CPython-C-ABI einführen.
Der Marker „CPython“ wird aufgenommen, um klarzustellen, dass sich diese Annotationen auf die vollständige CPython-ABI und nicht auf die stabile ABI beziehen.
Für Commit-Nachrichten wird der kürzere Marker „(ABI break)“ am Anfang der Zusammenfassungszeile für den Commit platziert.
Die Pre-Merge-Bots werden aktualisiert, um sicherzustellen, dass, wenn der ABI-Break-Marker an einem der beiden Orte erscheint, er an beiden erscheint.
Wenn der Marker versehentlich aus der ursprünglichen Commit-Nachricht und dem NEWS-Eintrag weggelassen wird, sollte der Commit-Nachrichten-Marker in dem nachfolgenden Commit enthalten sein, der den Marker zum NEWS-Eintrag hinzufügt.
Zusätzlich zur Nützlichkeit für Release-Manager sollten diese Marker auch für Entwickler nützlich sein, die unerwartete Segfaults untersuchen, wenn sie gegen die betroffene Version testen.
Explizite Kennzeichnung von Builds gegen die Pre-Freeze-ABI
Die vollständige CPython-ABI arbeitet seit langem nach der Richtlinie, dass die Binärkompatibilität nur innerhalb einer Release-Serie gilt, nachdem die ABI als eingefroren deklariert wurde, und dass zwischen verschiedenen Release-Serien nur die Quellcode-Kompatibilität gilt.
Diese Richtlinie bedeutet, dass Erweiterungsmodule, die gegen CPython-Vorabversionen vor dem ABI-Freeze für diese Release-Serie kompiliert wurden, möglicherweise nicht korrekt auf der endgültigen Version geladen werden.
Dies liegt daran, dass das Erweiterungsmodul sich auf provisorische oder zuvor veraltete Schnittstellen stützen könnte, die in einer späteren Alpha- oder Beta-Version geändert oder entfernt wurden, oder es liegt daran, dass öffentliche Strukturen, die vom Erweiterungsmodul verwendet werden, aufgrund der Hinzufügung neuer Felder ihre Größe geändert haben.
Historisch gesehen war die Akzeptanz von Alpha- und Beta-Versionen gering genug, dass dies in der Praxis kein Problem darstellte. Diese PEP schlägt jedoch vor, den operativen Einsatz von Beta-Versionen aktiv zu fördern, was es wünschenswert macht, sicherzustellen, dass Benutzer dieser Versionen nicht versehentlich Binär-Erweiterungsmodule veröffentlichen, die bei Benutzern der Release Candidates und endgültigen Versionen zu Segfaults führen.
Zu diesem Zweck schlägt diese PEP vor, das SOABI-Marker für Erweiterungsmodule SOABI unter Nicht-Windows-Systemen um ein neues „p“-Flag für CPython-Vorabversionen zu ergänzen und erst dann wieder auf das Weglassen dieses Flags zurückzukehren, wenn die ABI für diese bestimmte X.Y.0-Version beim Eintritt in die Release-Candidate-Phase eingefroren wurde.
Mit dieser Änderung würden Alpha- und Beta-Versionen von 3.9.0 ein SOABI-Tag von cpython-39p erhalten, während alle Release Candidates und endgültigen Builds (sowohl für 3.9.0 als auch für spätere 3.9.x-Versionen) ein uneingeschränktes SOABI-Tag von cpython-39 erhalten.
Debug-Builds würden immer noch das „d“ am Ende des Tags hinzufügen, was zu cpython-39pd für Debug-Builds von Vorabversionen führt.
Unter Windows-Systemen würde das Suffix für markierte pyd-Dateien in Vorabversionen „p“ als Vorabversionsmarker unmittelbar nach der Versionsnummer enthalten, was zu Markierungen wie „cp39p-win_amd64“ führt.
Eine vorgeschlagene Referenzimplementierung für diese Änderung ist verfügbar unter [4] (Hinweis: zum Zeitpunkt der Erstellung wurde diese Implementierung noch nicht unter Windows getestet).
Aktualisierung von „Python-Requires“ für Projekte, die von Änderungen an der vollständigen C-ABI betroffen sind
Wenn ein Projekt zum ersten Mal beschließt, vorab kompilierte binäre Wheels für die Rolling-Pre-Freeze-Release-Serie bereitzustellen, müssen sie nichts Besonderes tun: Sie würden die Rolling-Release-Serie zu ihren Build- und Testmatrizen hinzufügen und binäre Archive veröffentlichen, die als kompatibel mit dieser Release-Serie gekennzeichnet sind, genau wie sie es tun würden, wenn sie vorab kompilierte binäre Wheels nach dem vollständigen CPython-ABI-Freeze für diese Release-Serie bereitstellen würden.
Wenn das Projekt jedoch von einem CPython-ABI-Kompatibilitätsbruch im Rolling-Release-Stream betroffen ist, müssen sie eine Versionsaktualisierung herausgeben, die sowohl den neuen Binär-Build als auch einen neuen, umgebungseingeschränkten Python-Requires-Marker enthält.
Wenn beispielsweise ein Projekt, das den Rolling-Release-Stream unterstützt, von einem CPython-ABI-Kompatibilitätsbruch in der 3.9.0a5-Version betroffen war, würden sie den folgenden Metadateneintrag auf die Version setzen, die den aktualisierten Binär-Build veröffentlicht hat:
Python-Requires: >= "3.9.0b6"; python_version == "3.9" and full_python_version != "3.9.0a5"
Dies fügt eine zusätzliche Kompatibilitätsbeschränkung als Teil der veröffentlichten Pakete hinzu, sodass Python 3.9.0 Beta-Versionen vor 3.9.0b6 das aktualisierte Paket nicht als Installationskandidaten betrachten, und die einzige Alpha-Version, die das Paket berücksichtigen wird, ist 3.9.0a5 selbst.
Vorbehalte und Einschränkungen
Tatsächliche Veröffentlichungstermine können bis zu einem Monat früher oder später nach Ermessen des Release-Managers geplant werden, basierend auf der Verfügbarkeit des Release-Teams und dem Timing anderer Ereignisse (z. B. PyCon US oder die jährlichen Core-Developer-Sprints). Da ein Ziel des Vorschlags darin besteht, eine konsistente Release-Kadenz zu bieten, sollten Anpassungen jedoch idealerweise selten sein.
Innerhalb einer Release-Serie liegt die genaue Häufigkeit von Wartungsversionen weiterhin beim Release-Manager und dem Binär-Release-Team; diese PEP schlägt nur eine erwartete Kadenz für Vorabversionen und X.Y.0-Versionen vor.
Der Einfachheit halber der Beispielzeitpläne geht die PEP jedoch davon aus, dass Wartungsversionen alle zwei Monate veröffentlicht werden, wodurch sie mit den Rolling-Pre-Freeze-Versionen abwechseln können.
Der Release-Manager und der Steering Council behalten sich auch die Befugnis vor, verschiedene Details des Vorschlags in dieser PEP zu ändern. Mögliche Änderungen umfassen (sind aber nicht darauf beschränkt):
- Änderung des Zeitpunkts für die Erstellung des Wartungszweigs. Wenn eine größere Änderung, die eine neue Alpha-Version erfordert, relativ spät im Vorabversionsprozess landet, könnte der Release-Manager möglicherweise wählen, von einem Punkt vor dieser größeren Änderung abzweigen. Zum Beispiel könnte es sinnvoll sein, dies zu tun, wenn die nächste geplante Version die endgültige Beta-Version oder die erste Release Candidate sein sollte.
- Die Kriterien für die Deklaration einer Alpha-Version könnten potenziell auf alle Änderungen erweitert werden, die einen „Porting“-Eintrag im „What’s New“-Dokument erfordern.
- Anstatt Alpha-Versionen nach Bedarf zu deklarieren, könnte der Release-Manager einige Daten im Voraus als Alpha-Versionen deklarieren und Core-Entwickler bitten, ihre risikoreicheren Änderungen entsprechend zu timen.
Die Absicht des konkreten Vorschlags in der PEP ist es, ein klares illustratives Beispiel für Rezensenten zu liefern, nicht unsere Fähigkeit einzuschränken, spezifische Details basierend auf praktischer Erfahrung mit dem Prozess anzupassen.
Design-Diskussion
Warum rollierende Pre-Freeze-Releases anstelle von einfach häufigeren X.Y.0-Releases?
Für große Teile der Python-Benutzerbasis ist die Verfügbarkeit neuer CPython-Feature-Releases nicht der limitierende Faktor für ihre Übernahme dieser neuen Releases (dieser Effekt zeigt sich in Metriken wie PyPI-Download-Metadaten).
Daher muss jeder Vorschlag, der auf der Beschleunigung vollständiger Feature-Releases basiert, ein Gleichgewicht finden zwischen der Erfüllung der Bedürfnisse von Benutzern, die jede Version übernehmen würden, sobald sie verfügbar ist, und denen, die nun in der Lage wären, jede 2., 3. oder 4. Version zu übernehmen, anstatt fast jede Version im Laufe ihres Lebenszyklus migrieren zu können.
Dieser Vorschlag zielt darauf ab, das Problem aus einem anderen Blickwinkel anzugehen, indem ein neuer produktionsreifer Release-Stream definiert wird, der speziell auf die Interessen von Betriebsumgebungen zugeschnitten ist, die neue Releases so schnell konsumieren können, wie das CPython-Core-Team sie produzieren kann.
Ist es notwendig, das Namensschema „Alpha“ und „Beta“ beizubehalten?
Die Verwendung der „a“- und „b“-Kürzel für die vorgeschlagenen Rolling-Releases ist eine Designbeschränkung, die sich aus einigen pragmatischen Aspekten der Veröffentlichung von CPython-Versionsnummern ergibt.
Insbesondere Alpha-Versionen, Beta-Versionen und Release Candidates werden an einigen Stellen mit den Zeichenketten „a“, „b“ und „c“ gemeldet, während sie an anderen Stellen mit den Hexadezimalziffern 0xA, 0xB und 0xC gemeldet werden. Wir möchten dies beibehalten und gleichzeitig sicherstellen, dass alle Python-Requires-Beschränkungen gegen die Beta-Versionen und nicht gegen die Alpha-Versionen ausgedrückt werden (da letztere möglicherweise keine abi3-Stabilitätsanforderungen erzwingen, wenn zwei Alpha-Versionen nacheinander auftreten).
Es gibt jedoch nichts, was uns zwingt zu sagen, dass „a“ für „Alpha“ oder „b“ für „Beta“ steht.
Das bedeutet, dass, wenn wir die Akzeptanz bei Leuten erhöhen wollen, die nur durch das Label „Beta“ abgeschreckt wurden, es sinnvoll sein könnte, die Namen „*A*BI breaking“ und „*B*inary compatible“ gegenüber den Namen „Alpha“ und „Beta“ zu betonen, was zu Folgendem führt:
- 3.9.0a1: ABI-breaking Pre-Freeze-Version
- 3.9.0b2: Binärkompatible Pre-Freeze-Version
- 3.9.0rc1: Release Candidate
- 3.9.0: Finale Version
Diese Iteration der PEP geht nicht so weit, da die Begrenzung der anfänglichen Akzeptanz der Rolling-Pre-Freeze-Versionen auf Personen, die mit dem Label „Beta“ vertraut sind, wahrscheinlich gut ist, da es die Early Adopters dieser Versionen sind, die auf unerwartete Konsequenzen auf der Ebene des breiteren Python-Ökosystems stoßen werden, und wir brauchen sie, um aktiv an der Lösung dieser Probleme teilzunehmen.
Eine Abkehr von der Beta-Namensgebung wäre dann eine Option, die für die Zukunft im Auge zu behalten wäre, vorausgesetzt, die daraus resultierende Erfahrung ist ausreichend positiv, dass wir entscheiden, dass der Ansatz fortgesetzt werden soll.
Warum rollierende Pre-Freeze-Releases anstelle von abwechselnden stabilen und instabilen Release-Serien?
Anstatt die Beta-Phase für Rolling-Releases zu nutzen, wäre eine andere Option, zwischen traditionellen stabilen Releases (für 3.8.x, 3.10.x usw.) und Release-Serien, die die neue Rolling-Release-Kadenz nutzten (für 3.9.x, 3.11.x usw.), abzuwechseln.
Diese Idee leidet unter demselben Kernproblem wie PEP 598 und PEP 602: Sie erzwingt Änderungen bei Endbenutzern, die mit dem Status quo zufrieden sind, ohne ihnen einen klaren kompensierenden Vorteil zu bieten.
Sie ist auch von einer der Hauptbedenken betroffen, die gegen PEP 598 vorgebracht wurden: Mindestens einige Core-Entwickler und Endbenutzer bevorzugen es nachdrücklich, dass keine bestimmte Semantik dem Wert einer der Zahlen in einer Release-Version zugewiesen wird. Diese Community-Mitglieder bevorzugen stattdessen, dass die gesamte semantische Bedeutung mit der Position innerhalb der Versionsnummer verbunden ist, die sich ändert.
Im Gegensatz dazu zielt der Rolling-Pre-Freeze-Release-Vorschlag darauf ab, dieses Anliegen zu adressieren, indem sichergestellt wird, dass sich die vorgeschlagenen Änderungen der Richtlinien alle darum drehen, ob eine bestimmte Version eine Alpha-Version, Beta-Version, Release Candidate oder finale Version ist.
Warum nicht Kalenderversionierung für den rollierenden Release-Stream verwenden?
Steve Dower's ursprüngliche Ausarbeitung dieses Vorschlags [1] schlug die Verwendung von Kalenderversionierung für den Rolling-Release-Stream vor (so dass die erste Rolling-Pre-Release nach Python 3.8.0 Python 2019.12 statt 3.9.0b1 gewesen wäre).
Paul Moore wies [2] auf zwei Hauptpraktische Probleme bei diesem Vorschlag hin:
- Für Benutzer von Kalender-basierten Versionen wird nicht klar sein, wo sie im Verhältnis zu den traditionell nummerierten Versionen stehen.
- Es bricht die Verarbeitung von Metadaten für
Python-Requiresin Packaging-Tools, ohne eine klare Möglichkeit zur zuverlässigen Behebung (da alle Kalenderversionen neuer als jede Standardversion erscheinen würden).
Diese PEP zielt darauf ab, beide Probleme durch die Verwendung der etablierten Beta-Versionsnummern für die Rolling-Releases zu lösen.
Betrachten Sie als Beispiel die folgende Frage: „Enthält Python 2021.12 alle neuen Funktionen, die in Python 3.9.0 veröffentlicht wurden?“. Mit Kalenderversionierung bei den Rolling-Releases ist dies ohne Konsultation eines Release-Kalenders nicht zu beantworten, um zu sehen, wann 3.9.0rc1 aus dem Rolling-Release-Stream ausgecheckt wurde.
Im Gegensatz dazu ist die äquivalente Frage für Rolling-Pre-Freeze-Releases einfach zu beantworten: „Enthält Python 3.10.0b2 alle neuen Funktionen, die in Python 3.9.0 veröffentlicht wurden?“. Allein durch die Formulierung der Frage ist die Antwort eindeutig „Ja, es sei denn, es waren provisorische Funktionen, die entfernt wurden“.
Der Beta-Nummerierungsansatz vermeidet auch andere Fragen, die sich aus dem Konzept der Kalenderversionierung ergeben, wie z. B. wie sys.version_info, PY_VERSION_HEX, die Benennung von site-packages-Verzeichnissen und die Benennung von installierten Python-Binärdateien und Erweiterungsmodulen funktionieren würden.
Wie würden Benutzer der rollierenden Pre-Freeze-Releases API-Änderungen erkennen?
Beim Hinzufügen neuer Funktionen werden Core-Entwickler dringend ermutigt, Feature-Erkennung und graceful Fallback auf alternative Ansätze über Mechanismen zu unterstützen, die nicht auf sys.version_info oder Laufzeit-Codeobjekt-Introspektion angewiesen sind.
In den meisten Fällen reicht eine einfache hasattr-Prüfung für das betroffene Modul aus, aber wenn dies nicht der Fall ist, werden alternative Ansätze als Teil der Feature-Addition betrachtet. Bisherige Vorgehensweisen in diesem Bereich umfassen das pickle.HIGHEST_PROTOCOL-Attribut, das hashlib.algorithms_available-Set und die verschiedenen os.supports_*-Sets, die das os-Modul bereits für plattformabhängige Fähigkeitserkennung bietet.
Es wäre auch möglich, Funktionen hinzuzufügen, die explizit über einen __future__-Import aktiviert werden müssen, wenn sie erstmals in die Rolling-Pre-Freeze-Releases aufgenommen werden, auch wenn dieser Feature-Flag nachträglich standardmäßig aktiviert wurde, bevor er zum ersten Mal in einem X.Y.0-Release Candidate erschien.
Die Begründung für diese Ansätze ist, dass explizite Erkennung/Aktivierung wie diese es Benutzern des Rolling-Pre-Freeze-Release-Streams erleichtern würde, zu bemerken, wenn wir provisorische Funktionen entfernen oder ändern (z. B. from __future__-Importe brechen bei der Kompilierung, wenn das Feature-Flag nicht mehr existiert) oder sicher auf frühere Funktionalität zurückzugreifen.
Die reiche Attributsuchmaschine des Interpreters bedeutet, dass wir auch Warnungen für provisorische oder veraltete Importe und Attribute hinzufügen können, für die wir keine praktischen Möglichkeiten haben, Prüfungen gegen den Wert von sys.version_info durchzuführen.
Warum eine neue Pre-Freeze-ABI-Flagge hinzufügen, um Recompilierungen nach X.Y.0rc1 zu erzwingen?
Das Kernentwicklungsteam rät derzeit aktiv von der Erstellung von öffentlich vorab kompilierten Binärdateien für eine X.Y-Serie vor dem ABI-Freeze-Datum ab.
Der Grund dafür ist, das Risiko schmerzhafter Debugging-Sitzungen bei der stabilen X.Y.0-Version zu vermeiden, die auf „Oh, unsere Abhängigkeit ‚superfast-binary-operation‘ war von einem CPython-ABI-Bruch in X.Y.0a3 betroffen, aber das Projekt hat seitdem keinen neuen Build veröffentlicht“ zurückzuführen sind.
Mit dem vorgeschlagenen Pre-Freeze-ABI-Flag ändert sich dieser Aspekt des Release-Adoptationsprozesses im Wesentlichen nicht vom Status quo: Eine neue CPython X.Y-Release-Serie erreicht den ABI-Freeze -> Paket-Maintainer veröffentlichen neue Binär-Erweiterungsmodule für diese Release-Serie -> Endbenutzer erhalten Segfaults nur aufgrund tatsächlicher Fehler, nicht nur durch Builds gegen eine inkompatible ABI.
Das Hauptziel des neuen Pre-Freeze-ABI-Flags ist es also, die Benutzererfahrung der Rolling-Pre-Freeze-Releases selbst zu verbessern, indem vorab kompilierte Binärarchive für diese Releases veröffentlicht werden können, ohne die Probleme zu riskieren, die uns derzeit dazu veranlassen, die Veröffentlichung von Binärartefakten vor dem ABI-Freeze aktiv abzuraten.
Im Idealfall müssen Paket-Maintainer nur einen Pre-Freeze-Binär-Build bei X.Y.0a1 veröffentlichen und dann einen Post-Freeze-Build nach X.Y.0rc1. Die einzigen Situationen, die in der Zwischenzeit einen Neuaufbau erfordern sollten, sind solche, bei denen das Projekt tatsächlich von einem CPython-ABI-Bruch in einer dazwischen liegenden Alpha-Version betroffen war.
Als konkretes Beispiel betrachten Sie das Szenario, in dem wir drei Releases haben, die ABI-Brüche beinhalten: X.Y.0a1, X.Y.0a5, X.Y.0a7. Die X.Y.0a7-ABI ist dann die ABI, die durch alle nachfolgenden Beta-Versionen und in X.Y.0rc1 fortgesetzt wird. (Dies ist das in Abbildung 1 dargestellte Szenario)
Jeden dazu zu zwingen, die Welt jedes Mal neu zu bauen, wenn es eine Alpha-Version im Rolling-Release-Stream gibt, würde fast sicher dazu führen, dass Publisher entscheiden, dass die Unterstützung der Rolling-Releases mehr Ärger als wert war, daher möchten wir zulassen, dass Module, die gegen X.Y.0a1 kompiliert wurden, gegen X.Y.0a7 geladen werden, da sie wahrscheinlich kompatibel sind (es gibt sehr wenige Projekte, die jede C-API nutzen, die CPython veröffentlicht, und die meisten ABI-Brüche betreffen eine einzelne spezifische API).
Sobald wir X.Y.0rc1 veröffentlichen, wollen wir jedoch sicherstellen, dass alle Binärdateien, die gegen X.Y.0a1 und X.Y.0a4 kompiliert wurden, vollständig aus der Endbenutzererfahrung entfernt werden. Es wäre schön, die Builds gegen X.Y.0a7 und alle nachfolgenden Beta-Versionen beibehalten zu können (da sich herausstellte, dass diese tatsächlich gegen die Post-Freeze-ABI gebaut wurden, auch wenn wir das damals nicht wussten), aber deren Verlust ist nicht schlimmer als der Status quo.
Das bedeutet, dass das Pre-Freeze-Flag „das Einfachste, was möglicherweise funktionieren kann“ ist, um dieses Problem zu lösen – es ist nur ein neues ABI-Flag, und wir haben bereits die Werkzeuge, um mit ABI-Flags umzugehen (sowohl im Interpreter als auch in den Werkzeugen zur Veröffentlichung und Installation von Paketen).
Da sich die ABI-Flags im Verhältnis zu den Vorabversionen geändert haben, müssen Projekte nicht einmal eine neue Version veröffentlichen: Sie können neue Wheel-Archive zu ihren bestehenden Releases hochladen, genau wie sie es heute können.
Ein clevereres Schema, das alles, was gegen die letzte Alpha- oder nachfolgenden Beta-Releases kompiliert wurde, retroaktiv akzeptieren konnte, wäre wahrscheinlich möglich, aber es wird nicht als notwendig für die Akzeptanz dieser PEP angesehen, da selbst wenn wir anfänglich mit einem einfachen Pre-Release-ABI-Flag beginnen, es immer noch möglich wäre, einen ausgefeilteren Ansatz für die Zukunft zu entwickeln.
Warum zusätzliche Alpha-Releases nach X.Y.0a1 zulassen?
In einer idealen Welt würden alle breaking changes an der vollständigen CPython-ABI in X.Y.0a1 zusammen mit den Dateisystem-Layout-Änderungen landen, und die ABI für die Release-Serie bliebe danach stabil.
Die jüngste Geschichte deutet jedoch nicht darauf hin, dass wir diese Verpflichtung eingehen und uns daran halten könnten, daher geht die PEP davon aus, dass ABI-Änderungen progressiv während der Pre-Freeze-Periode vorgenommen werden und der vollständige Lockdown erst mit der Erstellung des X.Y.z-Wartungszweigs bei der Vorbereitung von X.Y.0rc1 erfolgt.
Auswirkungen auf die CPython-Kernentwicklung
Die wichtigste Änderung für die CPython-Kernentwicklung ist die Notwendigkeit, den Master-Zweig konsistenter Release-ready zu halten.
Während die Hauptanforderung dafür wäre, die stabile BuildBot-Flotte grün zu halten, würde auch ermutigt, die Entwicklungsversion der Dokumentation für Benutzer der Rolling-Pre-Freeze-Releases aktuell zu halten. Dies wird die Bereitstellung von Entwürfen für „What’s New“-Einträge für Änderungen beinhalten, sobald diese implementiert sind, obwohl die anfänglichen Versionen relativ spärlich sein können und dann basierend auf Feedback von Beta-Release-Benutzern erweitert werden.
Für Core-Entwickler, die an der CPython C API arbeiten, gäbe es auch eine neue Anforderung, ABI-breaking Änderungen in ihren NEWS-Datei-Snippets konsistent zu markieren.
Zum spezifischen Thema der stabilen ABI können die meisten API-Designs einen Prozess durchlaufen, bei dem sie zuerst als provisorischer Teil der vollständigen CPython-API eingeführt werden (was Änderungen zwischen Pre-Freeze-Releases zulässt) und erst zur stabilen ABI befördert werden, sobald Entwickler zuversichtlich sind, dass die Schnittstelle tatsächlich stabil ist.
Nur in seltenen Fällen, in denen eine API außerhalb der stabilen ABI keinen Nutzen hat, kann es sinnvoll sein, eine Alpha-Version mit einer provisorischen stabilen ABI-Ergänzung zu veröffentlichen, anstatt das Design in der provisorischen CPython-API stattdessen zu iterieren.
Auswirkungen auf die Entwicklung von Python-Bibliotheken
Wenn diese PEP ihre Ziele erreicht, sollte die Unterstützung des Rolling-Pre-Freeze-Release-Streams für Bibliotheksautoren nicht wesentlich schmerzhafter sein als die Unterstützung der stabilen Releases.
Für Publisher von reinen Python-Paketen wäre dies eine Frage der Veröffentlichung von Wheel-Archiven mit dem Tag „py3“ und möglicherweise der Aufnahme des Rolling-Pre-Freeze-Release-Streams in ihre Testmatrix, wenn diese Option für sie verfügbar ist.
Für Publisher von Binär-Erweiterungsmodulen wäre die bevorzugte Option, die stabile C-ABI anzuzielen (sofern machbar) und somit eine ähnliche Erfahrung wie bei reinen Python-Paketen zu genießen, bei der ein einziges vorab kompiliertes Wheel-Archiv mehrere Python-Versionen, einschließlich des Rolling-Pre-Freeze-Release-Streams, abdecken kann.
Diese Option wird nicht für alle Bibliotheken praktikabel sein, und das gewünschte Ergebnis für diese Autoren ist, dass sie die Rolling-Releases unterstützen können, indem sie ein zusätzliches Wheel-Archiv erstellen und veröffentlichen, das gegen die erste X.Y.0a1-Version kompiliert wurde. Der nachfolgende Build gegen X.Y.0rc1 oder später ist dann derselbe Build, der benötigt worden wäre, wenn nur die endgültige stabile Version unterstützt worden wäre.
Zusätzliche Wheel-Builds über diese beiden hinaus sollten dann nur benötigt werden, wenn die betreffende Bibliothek direkt von einem ABI-Bruch in einer anderen Alpha-Version betroffen ist, die zwischen diesen beiden Punkten auftritt.
Ein verfügbarer Rolling-Pre-Freeze-Release-Stream könnte es auch mehr CI-Anbietern ermöglichen, eine „CPython Beta Release“-Testoption anzubieten. Derzeit ist diese Funktion nur von CI-Anbietern verfügbar, die bereit und in der Lage sind, die notwendige Zeit und Mühe in die Erstellung, Prüfung und Veröffentlichung ihrer eigenen Builds aus dem CPython-Master-Zweig zu investieren (z. B. [6]).
Auswirkungen auf die vorgeschlagene Support-Periode für das wissenschaftliche Python-Ökosystem
Basierend auf Diskussionen auf der SciPy 2019 wurde NEP (NumPy Enhancement Proposal) 29 [3] ausgearbeitet, um eine gemeinsame Konvention im Scientific-Python-Ökosystem für das Ablegen der Unterstützung älterer Python-Versionen vorzuschlagen.
Obwohl die genaue Formulierung dieser Richtlinie noch diskutiert wird, empfiehlt der Entwurf (Stand 20. Oktober 2019), dass Projekte jede Python-Feature-Version, die in den letzten 42 Monaten veröffentlicht wurde, unterstützen, wobei mindestens die beiden neuesten Python-Feature-Versionen unterstützt werden.
Für eine 18-monatige Feature-Release-Kadenz würde dies bedeuten, dass immer mindestens die beiden neuesten Feature-Releases unterstützt werden und die Unterstützung für alle X.Y.Z-Releases etwa 6 Monate nach der Veröffentlichung von X.(Y+2).0 eingestellt wird. Das bedeutet, dass es ungefähr alle zwei Jahre einen 6-monatigen Zeitraum gibt, in dem die drei neuesten Feature-Releases unterstützt werden.
Für eine 12-monatige Release-Kadenz würde dies bedeuten, dass immer mindestens die drei neuesten Feature-Releases unterstützt werden und die Unterstützung für alle X.Y.Z-Releases etwa 6 Monate nach der Veröffentlichung von X.(Y+3).0 eingestellt wird. Das bedeutet, dass für die Hälfte jedes Jahres die vier neuesten Feature-Releases unterstützt werden, während die andere Hälfte des Jahres hoffentlich genutzt wird, um sich auf die Feature-Release des Jahres vorzubereiten.
Für eine 24-monatige Release-Kadenz hat die zweite Klausel Vorrang vor der ersten, und die empfohlene Python-Versionsunterstützungsdauer erhöht sich auf 48 Monate ab der ursprünglichen X.Y.0-Veröffentlichung, um konsistent die beiden neuesten CPython-Feature-Releases zu unterstützen. Für Projekte, die auch den Rolling-Release-Stream unterstützen, erhöht sich die Anzahl der unterstützten Feature-Releases auf drei.
Abstimmung des Release-Zyklus auf Core-Entwicklungs-Sprints
Mit dem Vorschlag in dieser PEP wird erwartet, dass sich der Fokus der Kernentwicklungs-Sprints leicht verschiebt, abhängig vom aktuellen Zeitpunkt im zweijährigen Zyklus.
In Release-Jahren ist das Timing von PyCon US für neue Mitwirkende geeignet, um an Fehlerbehebungen und kleineren Features zu arbeiten, bevor der erste Release Candidate herauskommt, während sich die Language Summit und die Diskussionen der Core-Entwickler auf Pläne für die nächste Release-Serie konzentrieren können.
Der Pre-Alpha-Core-Development-Sprint in Release-Jahren bietet die Gelegenheit, Feedback zur vorherigen Version zu integrieren, entweder als Teil der nächsten Wartungsversion (für Fehlerbehebungen und Feedback zu provisorischen APIs) oder als Teil der ersten Alpha-Version der nächsten Release-Serie (für Feedback zu stabilen APIs).
Diese anfänglichen Alpha-Versionen wären auch das bevorzugte Ziel für ABI-breaking Änderungen an der vollständigen CPython-ABI (während Änderungen später im Release-Zyklus weiterhin wie in dieser PEP beschrieben zulässig wären, aber die Aufnahme in die X.Y.0a1-Version bedeutet, dass sie keine zusätzlichen Arbeiten für Publisher von vorab kompilierten Binärpaketen auslösen).
Die Wahlen zum Steering Council für den nächsten Release-Zyklus finden wahrscheinlich auch ungefähr zur gleichen Zeit wie die Pre-Alpha-Entwicklungssprints statt.
In Nicht-Release-Jahren würde sich der Fokus für beide Veranstaltungen nur auf die bevorstehenden Wartungs- und Pre-Freeze-Releases konzentrieren. Diese weniger intensiven Jahre würden hoffentlich eine Gelegenheit bieten, verschiedene Prozessänderungen und Infrastruktur-Upgrades anzugehen, ohne den Release-Candidate-Vorbereitungsprozess zu beeinträchtigen.
Abstimmung des Release-Zyklus auf prominente Linux-Distributionen
Einige Rolling-Release-Linux-Distributionen (z. B. Arch, Gentoo) sind möglicherweise in der Lage, die in diesem PEP vorgeschlagenen neuen Rolling-Pre-Freeze-Releases zu übernehmen, aber es wird erwartet, dass die meisten Distributionen weiterhin etablierte Releases verwenden.
Die in diesem PEP vorgeschlagenen spezifischen Daten für die endgültigen Veröffentlichungen wurden so gewählt, dass sie mit den Zeitplänen für den Feature Freeze für die jährlichen Oktober-Veröffentlichungen der Ubuntu- und Fedora-Linux-Distributionen übereinstimmen.
Für Fedora und Ubuntu bedeutet dies, dass die Release Candidate-Phase mit der Entwicklungsperiode für ein Distro-Release übereinstimmt, was der ideale Zeitpunkt für sie ist, eine neue Version zu testen und Feedback zu potenziellen Regressionen und Kompatibilitätsproblemen zu geben.
Für Ubuntu bedeutet dies auch, dass ihre April-LTS-Releases von einem vollständigen kurzfristigen Release-Zyklus mit der neuen System-Python-Version profitiert haben, während diese CPython-Version die meiste Zeit bis zur nächsten Ubuntu-LTS-Version für Upstream-Bugfixes offen bleibt.
Die einzige Ausrichtungsüberschneidung von Linux-Release-Zyklen, die mit dem spezifischen Vorschlag in diesem PEP wahrscheinlich durchweg schlecht ausfällt, ist mit Debian, da dieses seit 2005 in der ersten Jahreshälfte von ungeraden Jahren veröffentlicht wird (ungefähr 12 Monate versetzt zu den Ubuntu-LTS-Releases).
Mit dem jährlichen Release-Vorschlag in PEP 602 würden sowohl Debian als auch Ubuntu LTS konsistent eine System-Python-Version erhalten, die etwa 6 Monate alt ist, aber auch konsistent unterschiedliche Python-Versionen voneinander auswählen würden.
Mit einer zweijährlichen Kadenz und CPython-Releases in der zweiten Jahreshälfte werden sie wahrscheinlich dieselbe Version voneinander auswählen, aber eine von ihnen wird eine CPython-Version auswählen, die mehr als 18 Monate hinter den neuesten Beta-Releases zurückliegt, bis die Linux-Distribution ausgeliefert wird.
Wenn diese Situation eintritt und als unerwünscht erachtet wird (aber nicht so unerwünscht, dass Debian seinen Veröffentlichungszeitplan anpasst), dann ist es dort, wo die zusätzliche Komplexität des Vorschlags der „inkrementellen Feature-Releases“ in PEP 598 sich als lohnenswert erweisen könnte.
(Das Verschieben von CPython-Releases in die gleiche Jahreshälfte wie die Debian- und Ubuntu-LTS-Releases würde potenziell helfen, das Problem zu mildern, schafft aber auch neue Probleme, bei denen eine Verschiebung des CPython-Release-Zeitplans direkt den Release-Zeitplan einer Linux-Distribution beeinflussen könnte oder dazu führt, dass eine Distribution eine Python-Version ausliefert, die mehr als 18 Monate alt ist.)
Auswirkungen auf einfache Bereitstellungsumgebungen
Für die Zwecke dieses PEP ist eine „einfache“ Bereitstellungsumgebung jeder Anwendungsfall, bei dem es einfach ist sicherzustellen, dass alle Zielumgebungen auf eine neue Python-Version gleichzeitig (oder zumindest vor dem Rollout neuer übergeordneter Anwendungsversionen) aktualisiert werden, und jedes Pre-Release-Testing, das stattfindet, muss nur eine einzige Python-Mikroversion ansprechen.
Der einfachste Fall wäre das Scripting für den persönlichen Gebrauch, bei dem die Test- und Zielumgebungen genau dieselbe Umgebung sind.
Ähnlich einfache Umgebungen wären containerisierte Webdienste, bei denen derselbe Python-Container in der CI-Pipeline verwendet wird wie bei der Bereitstellung, und jede Anwendung, die ihre eigene Python-Runtime bündelt, anstatt sich auf eine bereits vorhandene Python-Bereitstellung auf dem Zielsystem zu verlassen.
Für diese Anwendungsfälle gibt es einen einfachen Mechanismus, um die Auswirkungen dieses PEP zu minimieren: Weiterhin die stabilen Releases verwenden und die Rolling-Pre-Freeze-Releases ignorieren.
Um die Rolling-Pre-Freeze-Releases in diesen Umgebungen tatsächlich zu übernehmen, wird die größte Herausforderung darin bestehen, das Potenzial für Segfaults von Erweiterungsmodulen zu handhaben, wenn die nächste Pre-Freeze-Version eine Alpha-Version und keine Beta-Version ist, was darauf hindeutet, dass die CPython-ABI möglicherweise auf inkompatible Weise geändert wurde.
Wenn alle verwendeten Erweiterungsmodule die stabile ABI ansprechen, dann gibt es kein Problem und alles funktioniert genauso reibungslos wie bei den stabilen Releases.
Alternativ könnte „alle Erweiterungsmodule neu kompilieren und zwischenspeichern“ zu einer Standardaktivität werden, die als Teil der Aktualisierung auf eine Alpha-Version durchgeführt wird.
Schließlich wäre es auch vernünftig, sich keine Sorgen darüber zu machen, bis etwas tatsächlich fehlschlägt, und es dann wie jedes andere Problem mit der Bibliothekskompatibilität zu behandeln, das bei einer neuen Alpha- oder Beta-Version gefunden wird.
Abgesehen von der ABI-Kompatibilität von Erweiterungsmodulen ist der andere Hauptpunkt zusätzlicher Komplexität bei der Verwendung der Rolling-Pre-Freeze-Releases die „Rollback“-Kompatibilität für unabhängig versionierte Features wie Pickle und SQLite, bei denen die Verwendung neuer oder vorläufiger Features im Beta-Stream Dateien erstellen kann, die von der stabilen Version nicht gelesen werden können. Anwendungen, die diese Arten von Features verwenden und auch die Fähigkeit benötigen, zuverlässig auf eine frühere stabile CPython-Version zurückzugreifen, wird, wie heute, geraten, die Verwendung von Vorabversionen zu vermeiden.
Auswirkungen auf komplexe Bereitstellungsumgebungen
Für die Zwecke dieses PEP sind „komplexe“ Bereitstellungsumgebungen Anwendungsfälle, die nicht die Kriterien für „einfache Bereitstellung“ erfüllen. Sie können mehrere verschiedene Python-Versionen, die Verwendung einer personalisierten Python-Version oder „Gatekeeper“ beinhalten, die die Verwendung einer neuen Version vor der Bereitstellung genehmigen müssen.
Zum Beispiel fallen Organisationen, die Python als Teil einer Standardbetriebsumgebung auf den Rechnern ihrer Benutzer installieren, in diese Kategorie, ebenso wie diejenigen, die eine Standard-Build-Umgebung bereitstellen. Distributionen wie conda-forge oder WinPython, die Sammlungen von konsistent gebauten und verifizierten Paketen anbieten, sind in ähnlicher Weise betroffen.
Diese Organisationen bevorzugen in der Regel entweder hohe Stabilität (z. B. alle, die glücklich die System-Python in einer stabilen Linux-Distribution wie Debian, RHEL/CentOS oder Ubuntu LTS als bevorzugte Python-Umgebung verwenden) oder schnelle Durchlaufzeiten (z. B. diejenigen, die regelmäßig zu den neuesten CPython-Vorabversionen beitragen).
In einigen Fällen können beide Nutzungsmodelle innerhalb derselben Organisation für unterschiedliche Zwecke existieren, wie zum Beispiel
- Verwendung einer stabilen Python-Umgebung für geschäftskritische Systeme, aber Datenwissenschaftlern die Nutzung der neuesten verfügbaren Version für ad-hoc-Datenanalysen zu ermöglichen
- ein Hardwarehersteller, der eine stabile Python-Version als Teil seiner Produktionsfirmware bereitstellt, aber die neueste verfügbare Version bei der Entwicklung und Ausführung seiner automatisierten Integrationstests verwendet
Unter jedem Release-Modell generiert jede neue Python-Version Arbeit für diese Organisationen. Diese Arbeit kann rechtliche, sicherheitstechnische oder technische Überprüfungen von Python selbst, Bewertung und Verifizierung von wirkungsvollen Änderungen, erneutes Anwenden von Patches, Neukompilieren und Testen von Drittanbieter-Abhängigkeiten und erst dann die Bereitstellung umfassen.
Organisationen, die Updates schnell übernehmen können, sollten in der Lage sein, die häufigeren Beta-Releases zu nutzen. Obwohl jede Aktualisierung immer noch ähnliche Ermittlungsarbeiten erfordert, wie sie heute erforderlich sind, sollte das Arbeitsvolumen pro Release reduziert werden, da jedes Release dem vorherigen ähnlicher sein wird als im aktuellen Modell. Ein Vorteil des vorgeschlagenen Modells mit monatlichen Releases ist, dass Organisationen ihre eigene Übernahmekadenz wählen können, von der Übernahme jedes Beta-Releases bis hin zur Übernahme eines pro Quartal, eines alle 6 Monate oder eines pro Jahr. Darüber hinaus wäre es wahrscheinlich sinnvoller, weiterhin die stabilen Releases zu verwenden.
Für Organisationen mit strengeren Bewertungen oder einer Präferenz für Stabilität wird der längere Release-Zyklus für stabile Releases den jährlichen Aufwand für Updates reduzieren, die längere Release-Candidate-Phase mehr Zeit für interne Tests vor dem X.Y.0-Release ermöglichen und die größere Nutzung durch andere während der Beta-Phase mehr Vertrauen in die anfänglichen Releases bieten. In der Zwischenzeit kann die Organisation mit Zuversicht durch Wartungsreleases für eine längere Zeit aufrüsten, ohne Angst vor Breaking Changes zu haben.
Danksagungen
Dank Łukasz Langa für die Erstellung von PEP 602 und die Anregung dieser Diskussion über mögliche Verbesserungen der CPython-Release-Kadenz, und an Kyle Stanley und h-vetinari für konstruktives Feedback zum ersten Entwurf dieses PEP.
Referenzen
Urheberrecht
Dieses Dokument wird in die Public Domain oder unter die CC0-1.0-Universal-Lizenz gestellt, je nachdem, welche Lizenz permissiver ist.
Quelle: https://github.com/python/peps/blob/main/peps/pep-0605.rst
Zuletzt geändert: 2025-02-01 08:59:27 GMT