PEP 699 – Entfernen des privaten Dictionary-Versionsfeldes aus PEP 509
- Autor:
- Ken Jin <kenjin at python.org>
- Discussions-To:
- Discourse thread
- Status:
- Akzeptiert
- Typ:
- Standards Track
- Erstellt:
- 03-Okt-2022
- Python-Version:
- 3.12
- Post-History:
- 05-Okt-2022
- Ersetzt:
- 509
- Resolution:
- Discourse-Nachricht
Zusammenfassung
PEP 509 führte ein privates Feld ma_version_tag für Dictionaries ein, um Optimierungen in CPython und Erweiterungsbibliotheken zu ermöglichen. Dieses PEP schlägt vor, PEP 509 aufzuheben und das Feld als Implementierungsdetail zu deklarieren, da es bereits durch Alternativen abgelöst wurde. Dies wird es ermöglichen, das Feld für zukünftige Optimierungen wiederzuverwenden.
Motivation
PEP 509 führte das Feld ma_version_tag in Dictionaries ein. Dieses 64-Bit-Feld speicherte einen Versionszähler, der jedes Mal aktualisiert wurde, wenn ein Dictionary geändert wurde. Der ursprüngliche Vorschlag war, diesen Versionszähler als Schutz für Optimierungen zu verwenden.
Seit CPython 3.11 wird dieses Feld von internen Optimierungsbemühungen nicht mehr verwendet. PEP 659-spezialisierte Anweisungen verwenden andere Methoden zur Überprüfung der Sicherheit bestimmter Optimierungen.
Um weitere Optimierungen in CPython zu ermöglichen, schlägt dieses PEP vor, dass das Feld ma_version_tag nicht mehr der Spezifikation von PEP 509 entspricht. Dies wird es den CPython-Entwicklern ermöglichen, andere Optimierungsinformationen zu speichern, wie z. B. Dictionary-Schreib-Watcher.
Begründung
Dieses PEP gibt nicht an, wofür das Feld in Zukunft verwendet werden kann. Dies ist beabsichtigt, da Implementierungsdetails Änderungen unterliegen und das Feld nur für den internen Gebrauch durch CPython verwendet werden sollte.
Spezifikation
Diese Spezifikation hebt diejenige in PEP 509 auf. Das Feld ma_version_tag der Python-Klasse dict wird als internes Implementierungsdetail deklariert und kann vollständig entfernt oder eine andere Darstellung haben. C-Erweiterungen sollten sich nicht auf dieses Feld verlassen.
Abwärtskompatibilität
Bestimmte Erweiterungen verwenden ma_version_tag für schnelle Dictionary- oder Globals-Lookups. Beispielsweise verwendet Cython das Feld für schnelle dynamische Modulvariablen-Lookups.
Dieses PEP schlägt vor, bei Zugriff auf ma_version_tag eine Compiler-Warnung auszugeben. Nach zwei aufeinanderfolgenden Versionen mit Warnungen wird ma_version_tag gemäß PEP 387 entfernt.
Der größte Nutzer, den der Autor für dieses Feld finden konnte, war Cython. Diskussionen mit einem Cython-Maintainer zeigten, dass die Entfernung der Unterstützung dafür aus Cython trivial ist.
Sicherheitsimplikationen
PEP 509 befasste sich mit Integer-Überläufen. Dieses PEP führt jedoch keine zusätzlichen Sicherheitsbedenken ein.
Abgelehnte Ideen
Eine mögliche Alternative ist die Beibehaltung des Feldes aus Gründen der Abwärtskompatibilität. Dieses PEP lehnt diese Alternative ab, da zukünftige Optimierungen mehr Speicher beanspruchen werden und das Feld immer als privat und undokumentiert (abgesehen vom PEP) mit keinen Garantien für Abwärtskompatibilität galt. Dictionaries in Python werden häufig verwendet, und jede Erhöhung ihres Speicherverbrauchs wird die Leistung von Python nachteilig beeinflussen.
Referenzimplementierung
Eine Referenzimplementierung finden Sie unter python/cpython#101193.
Besonderer Dank
Vielen Dank an C.A.M. Gerlach für Bearbeitungen und Wortänderungen an diesem Dokument. Vielen Dank auch an Mark Shannon und Kumar Aditya für die Bereitstellung möglicher Implementierungen.
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-0699.rst
Zuletzt geändert: 2025-02-01 08:55:40 GMT