PEP 680 – tomllib: Unterstützung für das Parsen von TOML in der Standardbibliothek
- Autor:
- Taneli Hukkinen, Shantanu Jain <hauntsaninja at gmail.com>
- Sponsor:
- Petr Viktorin <encukou at gmail.com>
- Discussions-To:
- Discourse thread
- Status:
- Final
- Typ:
- Standards Track
- Erstellt:
- 01. Jan 2022
- Python-Version:
- 3.11
- Post-History:
- 09. Dez 2021, 27. Jan 2022
- Resolution:
- Python-Dev thread
Inhaltsverzeichnis
- Zusammenfassung
- Motivation
- Begründung
- Spezifikation
- Auswirkungen auf die Wartung
- Abwärtskompatibilität
- Sicherheitsimplikationen
- Wie man das lehrt
- Referenzimplementierung
- Abgelehnte Ideen
- Vorherige Diskussion
- Anhang A: Unterschiede zwischen der vorgeschlagenen API und
toml - Urheberrecht
Zusammenfassung
Dieses PEP schlägt die Aufnahme des Moduls tomllib in die Standardbibliothek zum Parsen von TOML (Tom’s Obvious Minimal Language, https://toml.io) vor.
Motivation
TOML ist das bevorzugte Format für Python-Pakete, wie durch PEP 517, PEP 518 und PEP 621 belegt. Dies schafft ein Bootstrapping-Problem für Python-Build-Tools, die gezwungen sind, ein TOML-Parsing-Paket zu bündeln oder andere unerwünschte Workarounds zu verwenden, und verursacht ernsthafte Probleme für Repackager und andere nachgelagerte Nutzer. Die Aufnahme von TOML-Unterstützung in die Standardbibliothek würde all diese Probleme elegant lösen.
Darüber hinaus sind viele Python-Tools mittlerweile über TOML konfigurierbar, wie z.B. black, mypy, pytest, tox, pylint und isort. Viele, die es nicht sind, wie z.B. flake8, nennen den Mangel an Standardbibliotheksunterstützung als einen Hauptgrund dafür. Angesichts des besonderen Stellenwerts, den TOML bereits im Python-Ökosystem hat, ist es sinnvoll, es als integrierte Batterie zu betrachten.
Schließlich wird TOML als Format immer beliebter (aus den in PEP 518 dargelegten Gründen), wobei verschiedene Python-TOML-Bibliotheken etwa 2000 Reverse-Abhängigkeiten auf PyPI haben (zum Vergleich: requests hat etwa 28000 Reverse-Abhängigkeiten). Daher wird dies wahrscheinlich eine allgemein nützliche Ergänzung sein, auch über die Bedürfnisse von Python-Paketen und verwandten Tools hinaus.
Begründung
Dieses PEP schlägt vor, die Standardbibliothekunterstützung für das Lesen von TOML auf der Drittanbieterbibliothek tomli (github.com/hukkin/tomli) zu basieren.
Viele Projekte sind kürzlich auf die Verwendung von tomli umgestiegen, wie z.B. pip, build, pytest, mypy, black, flit, coverage, setuptools-scm und cibuildwheel.
tomli wird aktiv gewartet und ist gut getestet. Es handelt sich um etwa 800 Zeilen Code mit 100% Testabdeckung und es besteht alle Tests in der vorgeschlagenen offiziellen TOML-Compliance-Testsuite, sowie die etabliertere BurntSushi/toml-Test-Suite.
Spezifikation
Ein neues Modul tomllib wird der Python-Standardbibliothek hinzugefügt und exponiert die folgenden öffentlichen Funktionen
def load(
fp: SupportsRead[bytes],
/,
*,
parse_float: Callable[[str], Any] = ...,
) -> dict[str, Any]: ...
def loads(
s: str,
/,
*,
parse_float: Callable[[str], Any] = ...,
) -> dict[str, Any]: ...
tomllib.load deserialisiert ein binäres, dateiähnliches Objekt, das ein TOML-Dokument enthält, in ein Python dict. Das Argument fp muss eine read()-Methode mit derselben API wie io.RawIOBase.read() haben.
tomllib.loads deserialisiert eine str-Instanz, die ein TOML-Dokument enthält, in ein Python dict.
Das Argument parse_float ist ein aufrufbares Objekt, das als Eingabe die ursprüngliche Zeichenfolgendarstellung eines TOML-Floats annimmt und ein entsprechendes Python-Objekt zurückgibt (ähnlich wie parse_float in json.load). Zum Beispiel kann der Benutzer eine Funktion übergeben, die eine decimal.Decimal zurückgibt, für Anwendungsfälle, bei denen exakte Präzision wichtig ist. Standardmäßig werden TOML-Floats als Instanzen des Python-Typs float geparst.
Das zurückgegebene Objekt enthält nur grundlegende Python-Objekte (str, int, bool, float, datetime.{datetime,date,time}, list, dict mit String-Schlüsseln) und die Ergebnisse von parse_float.
tomllib.TOMLDecodeError wird im Falle von ungültigem TOML ausgelöst.
Beachten Sie, dass dieses PEP keine Funktionen tomllib.dump oder tomllib.dumps vorschlägt; siehe Einbeziehung einer API zum Schreiben von TOML für Details.
Auswirkungen auf die Wartung
Stabilität von TOML
Die Veröffentlichung von TOML 1.0.0 im Januar 2021 deutet darauf hin, dass das TOML-Format nun offiziell als stabil betrachtet werden sollte. Empirisch hat sich TOML auch vor der Veröffentlichung von TOML 1.0.0 als stabiles Format erwiesen. Aus dem Changelog geht hervor, dass TOML seit April 2020 keine größeren Änderungen mehr erfahren hat und in den letzten fünf Jahren (2017-2021) zwei Versionen hatte.
Im Falle von Änderungen an der TOML-Spezifikation können wir kleinere Überarbeitungen als Fehlerbehebungen behandeln und die Implementierung an Ort und Stelle aktualisieren. Im Falle von größeren, nicht abwärtskompatiblen Änderungen sollten wir die Unterstützung für TOML 1.x beibehalten.
Wartbarkeit der vorgeschlagenen Implementierung
Die vorgeschlagene Implementierung (tomli) ist reines Python, gut getestet und wiegt unter 1000 Zeilen Code. Sie ist minimalistisch und bietet eine geringere API-Oberfläche als andere TOML-Implementierungen.
Der Autor von tomli ist bereit, bei der Integration von tomli in die Standardbibliothek zu helfen und bei der Wartung zu unterstützen, wie in diesem Beitrag dargelegt. Darüber hinaus hat der Python-Core-Entwickler Petr Viktorin seine Bereitschaft signalisiert, eine Lese-API zu warten, wie in diesem Beitrag.
Eine Neufassung des Parsers in C wird derzeit nicht als notwendig erachtet. Es ist selten, dass das Parsen von TOML ein Flaschenhals in Anwendungen ist, und Benutzer mit höheren Leistungsanforderungen können eine Drittanbieterbibliothek verwenden (wie es bei JSON oft der Fall ist, obwohl Python ein C-Erweiterungsmodul in der Standardbibliothek anbietet).
TOML-Unterstützung: eine rutschige Bahn für andere Dinge
Wie im Abschnitt Motivation diskutiert, hat TOML im Python-Ökosystem einen besonderen Stellenwert für das Lesen von PEP 518 pyproject.toml-Paketierungs- und Toolkonfigurationsdateien. Dieser Hauptgrund für die Aufnahme von TOML in die Standardbibliothek trifft nicht auf andere Formate wie YAML oder MessagePack zu.
Darüber hinaus unterscheidet die Einfachheit von TOML es von anderen Formaten wie YAML, die äußerst komplex zu erstellen und zu parsen sind.
Eine API zum Schreiben von TOML kann jedoch in einem zukünftigen PEP hinzugefügt werden.
Abwärtskompatibilität
Dieser Vorschlag hat keine Rückwärtskompatibilitätsprobleme innerhalb der Standardbibliothek, da er ein neues Modul beschreibt. Jedes vorhandene Drittanbieter-Modul mit dem Namen tomllib wird beeinträchtigt, da import tomllib das Standardbibliotheksmodul importieren wird. Allerdings ist tomllib nicht auf PyPI registriert, so dass es unwahrscheinlich ist, dass ein Modul mit diesem Namen weit verbreitet ist.
Beachten Sie, dass wir die direktere Bezeichnung toml vermeiden, um Rückwärtskompatibilitätsprobleme für Benutzer zu vermeiden, die Versionen des aktuellen toml PyPI-Pakets fixiert haben. Weitere Details finden Sie im Abschnitt Alternative Namen für das Modul.
Sicherheitsimplikationen
Fehler in der Implementierung könnten potenzielle Sicherheitsprobleme verursachen. Die Ausgabe des Parsers ist jedoch auf einfache Datentypen beschränkt; die Unfähigkeit, beliebige Klassen zu laden, vermeidet Sicherheitsprobleme, die bei "mächtigeren" Formaten wie Pickle und YAML üblich sind. Außerdem ist die Implementierung in reinem Python, was für C typische Sicherheitsprobleme wie Pufferüberläufe reduziert.
Wie man das lehrt
Die API von tomllib spiegelt die von etablierten Dateiformatbibliotheken wie json und pickle wider. Das Fehlen einer dump-Funktion wird in der Dokumentation erklärt, mit einem Link zu relevanten Drittanbieterbibliotheken (z.B. tomlkit, tomli-w, pytomlpp).
Referenzimplementierung
Die vorgeschlagene Implementierung finden Sie unter https://github.com/hukkin/tomli
Abgelehnte Ideen
Basierend auf einer anderen TOML-Implementierung
Mehrere potenzielle alternative Implementierungen existieren
tomlkitist gut etabliert, aktiv gewartet und unterstützt TOML 1.0.0. Ein wichtiger Unterschied ist, dasstomlkitdas Roundtripping von Stil unterstützt. Infolgedessen hat es eine komplexere API und Implementierung (etwa 5x so viel Code wietomli). Sein Autor glaubt nicht, dasstomlkiteine gute Wahl für die Standardbibliothek ist.tomlist eine sehr weit verbreitete Bibliothek. Sie wird jedoch nicht aktiv gewartet, unterstützt TOML 1.0.0 nicht und hat eine Reihe bekannter Fehler. Ihre API ist komplexer als die vontomli. Sie ermöglicht die Anpassung des Ausgabeformats über eine komplizierte Encoder-API und einige sehr begrenzte und meist ungenutzte Funktionen zur Erhaltung des Eingabestils über eine undokumentierte Decoder-API. Weitere Details zu ihren API-Unterschieden zu diesem PEP finden Sie in Anhang A.pytomlppist ein Python-Wrapper für das C++-Projekttoml++. Reine Python-Bibliotheken sind einfacher zu warten als Erweiterungsmodule.rtomlist ein Python-Wrapper für das Rust-Projekttoml-rsund hat daher ähnliche Nachteile wiepytomlpp. Außerdem unterstützt es TOML 1.0.0 nicht.- Eine Implementierung von Grund auf neu zu schreiben. Es ist unklar, was wir dadurch gewinnen würden;
tomlierfüllt unsere Bedürfnisse und der Autor ist bereit, bei der Aufnahme in die Standardbibliothek zu helfen.
Einbeziehung einer API zum Schreiben von TOML
Es gibt mehrere Gründe, keine API zum Schreiben von TOML aufzunehmen.
Die Fähigkeit, TOML zu schreiben, wird für die Anwendungsfälle, die dieses PEP motivieren, nicht benötigt: Kern Python-Paketierungswerkzeuge und Projekte, die TOML-Konfigurationsdateien lesen müssen.
Anwendungsfälle, die die Bearbeitung einer vorhandenen TOML-Datei beinhalten (im Gegensatz zum Schreiben einer völlig neuen), werden besser von einer stil-erhaltenden Bibliothek bedient. TOML ist als menschenlesbares und -editierbares Konfigurationsformat gedacht, daher ist es wichtig, Kommentare, Formatierungen und andere Markierungen zu erhalten. Dies erfordert einen Parser, dessen Ausgabe stilbezogene Metadaten enthält, was es unpraktisch macht, reine Python-Typen wie str und dict auszugeben. Darüber hinaus verkompliziert dies das Design der API erheblich.
Selbst ohne Berücksichtigung der Stilwahrung gibt es zu viele Freiheitsgrade bei der Gestaltung einer Schreib-API. Zum Beispiel, welcher Standardstil (Einrückung, vertikale und horizontale Abstände, Anführungszeichen usw.) sollte die Bibliothek für die Ausgabe verwenden, und wie viel Kontrolle sollten Benutzer darüber haben? Wie soll die Bibliothek die Eingabe- und Ausgabevalidierung handhaben? Soll sie die Serialisierung benutzerdefinierter Typen unterstützen und wenn ja, wie? Obwohl es vernünftige Optionen zur Lösung dieser Probleme gibt, sind wir aufgrund der Natur der Standardbibliothek nur "einmal auf die richtige Art und Weise" die Chance.
Derzeit hat sich kein CPython-Core-Entwickler bereit erklärt, eine Schreib-API zu warten oder ein PEP zu sponsern, das eine solche enthält. Da es schwierig ist, etwas in der Standardbibliothek zu ändern oder zu entfernen, ist es sicherer, vorerst auf der Seite des Ausschlusses zu irren und dies möglicherweise später erneut zu prüfen.
Daher bleibt das Schreiben von TOML Drittanbieterbibliotheken überlassen. Wenn später eine gute API und relevante Anwendungsfälle dafür gefunden werden, kann die Schreibunterstützung in einem zukünftigen PEP hinzugefügt werden.
Verschiedene API-Details
Typen, die als erstes Argument von tomllib.load akzeptiert werden
Die toml-Bibliothek auf PyPI erlaubt die Übergabe von Pfaden (und Listen von pfadähnlichen Objekten, ignoriert fehlende Dateien und fasst die Dokumente zu einem einzigen Objekt zusammen) an ihre load-Funktion. Dies hier zuzulassen wäre jedoch inkonsistent mit dem Verhalten von json.load, pickle.load und anderen Standardbibliotheksfunktionen. Wenn wir uns darauf einigen, dass Konsistenz hier wünschenswert ist, ist die Zulassung von Pfaden außerhalb des Rahmens dieses PEP. Dies kann einfach und explizit im Benutzercode oder durch die Verwendung einer Drittanbieterbibliothek umgangen werden.
Die vorgeschlagene API nimmt eine binäre Datei entgegen, während toml.load eine Textdatei und json.load entweder entgegennimmt. Die Verwendung einer binären Datei ermöglicht es uns, sicherzustellen, dass UTF-8 die verwendete Kodierung ist (was eine korrekte Analyse auf Plattformen mit anderen Standardkodierungen wie Windows gewährleistet) und die fälschliche Analyse von Dateien, die einzelne Wagenrückläufe enthalten, als gültiges TOML im Textmodus zu vermeiden.
Typ, der als erstes Argument von tomllib.loads akzeptiert wird
Obwohl tomllib.load eine Binärdatei entgegennimmt, nimmt tomllib.loads eine Textzeichenkette entgegen. Dies mag auf den ersten Blick inkonsistent erscheinen.
Zitat der TOML v1.0.0 Spezifikation
Eine TOML-Datei muss ein gültiges UTF-8-kodiertes Unicode-Dokument sein.
tomllib.loads soll keine TOML-Datei laden, sondern das Dokument, das die Datei speichert. Die natürlichste Darstellung eines Unicode-Dokuments in Python ist str, nicht bytes.
Es ist möglich, bytes-Unterstützung in Zukunft hinzuzufügen, falls erforderlich, aber wir sind uns keiner Anwendungsfälle dafür bewusst.
Kontrolle des Typs von Abbildungen, die von tomllib.load[s] zurückgegeben werden
Die toml-Bibliothek auf PyPI akzeptiert ein _dict-Argument in ihren load[s]-Funktionen, das ähnlich wie das object_hook-Argument in json.load[s] funktioniert. Es gibt mehrere Verwendungen von _dict, die auf https://grep.app gefunden wurden; fast alle davon übergeben jedoch _dict=OrderedDict, was ab Python 3.7 unnötig sein sollte. Wir fanden zwei Instanzen relevanter Verwendung: In einem Fall wurde eine benutzerdefinierte Klasse für freundlichere KeyErrors übergeben; im anderen hatte die benutzerdefinierte Klasse mehrere zusätzliche Lookup- und Mutationsmethoden (z.B. zur Auflösung von Punktnotation-Schlüsseln).
Ein solcher Parameter ist für die Kern-Anwendungsfälle, die im Abschnitt Motivation skizziert sind, nicht notwendig. Das Fehlen davon kann leicht durch eine Wrapper-Klasse, eine Transformationsfunktion oder eine Drittanbieterbibliothek umgangen werden. Schließlich könnte die Unterstützung später rückwärtskompatibel hinzugefügt werden.
Entfernung der Unterstützung für parse_float in tomllib.load[s]
Diese Option ist nicht unbedingt notwendig, da TOML-Floats als "IEEE 754 binäre 64-Werte" implementiert werden sollten, was auf den meisten Architekturen einem Python float entspricht.
Die TOML-Spezifikation verwendet das Wort "SOLLTE", was jedoch eine Empfehlung impliziert, die aus gültigen Gründen ignoriert werden kann. Das Parsen von Floats anders, z.B. zu decimal.Decimal, ermöglicht Benutzern zusätzliche Präzision über die vom TOML-Format zugesicherte hinaus. Nach Erfahrung des Autors von tomli ist dies besonders nützlich in wissenschaftlichen und finanziellen Anwendungen. Dies ist auch nützlich für andere Fälle, die größere Präzision benötigen oder bei denen Endbenutzer Nicht-Entwickler sind, die sich der Grenzen von binären 64-Bit-Floats möglicherweise nicht bewusst sind.
Es gibt auch Nischenarchitekturen, bei denen der Python float kein IEEE 754 binärer 64-Wert ist. Das Argument parse_float ermöglicht es Benutzern, auch auf solchen Architekturen korrekte TOML-Semantiken zu erzielen.
Alternative Namen für das Modul
Idealerweise könnten wir den Modulnamen toml verwenden.
Das toml-Paket auf PyPI ist jedoch weit verbreitet, daher gibt es Rückwärtskompatibilitätsprobleme. Da die Standardbibliothek Vorrang vor Drittanbieterpaketen hat, würden Bibliotheken und Anwendungen, die derzeit vom toml-Paket abhängen, wahrscheinlich beim Upgrade von Python-Versionen fehlschlagen, da die vielen API-Inkompatibilitäten, die in Anhang A aufgeführt sind, auch wenn sie ihre Abhängigkeitsversionen fixieren.
Um dies weiter zu verdeutlichen, sind Anwendungen mit fixierten Abhängigkeiten hier von größter Bedeutung. Selbst wenn wir die Kontrolle über den PyPI-Paketnamen toml erhalten und ihn für ein Backport des vorgeschlagenen neuen Moduls wiederverwenden könnten, würden wir immer noch Benutzer auf neuen Python-Versionen beeinträchtigen, die ihn in der Standardbibliothek enthielten, unabhängig davon, ob sie eine ältere Version des bestehenden toml-Pakets fixiert haben. Dies ist bedauerlich, da das Fixieren wahrscheinlich eine gängige Reaktion auf unterbrechende Änderungen sein würde, die durch die Wiederverwendung des toml-Pakets als Backport (das mit dem heutigen toml inkompatibel ist) eingeführt werden.
Schließlich ist das toml-Paket auf PyPI nicht aktiv gewartet, aber bisher waren Bemühungen, den Autor aufzufordern, andere Maintainer hinzuzufügen nicht erfolgreich, daher müsste hier wahrscheinlich ohne Zustimmung des Autors gehandelt werden.
Stattdessen schlägt dieses PEP den Namen tomllib vor. Dies spiegelt plistlib und xdrlib wider, zwei weitere Dateiformatmodule in der Standardbibliothek, sowie andere Module wie pathlib, contextlib und graphlib.
Andere in Betracht gezogene, aber abgelehnte Namen sind
tomlparser. Dies spiegeltconfigparserwider, ist aber möglicherweise weniger geeignet, wenn wir in Zukunft eine Schreib-API aufnehmen.tomli. Dies setzt voraus, dass wirtomlials Grundlage für die Implementierung verwenden.tomlunter einem Namespace, wie z.B.parser.toml. Dies ist jedoch umständlich, zumal bestehende Parsing-Bibliotheken wiejson,pickle,xml,htmlusw. nicht im Namespace enthalten wären.
Vorherige Diskussion
- bpo-40059: Bereitstellen eines toml-Moduls in der Standardbibliothek
- [Python-Dev] Hinzufügen eines toml-Moduls zur Standardbibliothek?
- [Python-Ideas] Python-Standardbibliothek TOML-Modul
- [Packaging] Annahme/Empfehlung eines TOML-Parsers?
- hukkin/tomli#141: Bitte erwägen Sie, tomli in die stdlib zu pushen
Anhang A: Unterschiede zwischen der vorgeschlagenen API und toml
Dieser Anhang behandelt die Unterschiede zwischen der in diesem PEP vorgeschlagenen API und der des Drittanbieterpakets toml. Diese Unterschiede sind relevant, um das Ausmaß des Bruchs zu verstehen, den wir erwarten könnten, wenn wir den Namen toml für das Standardbibliotheksmodul verwenden würden, sowie um den Designraum besser zu verstehen. Beachten Sie, dass diese Liste möglicherweise nicht vollständig ist.
- Keine vorgeschlagene Aufnahme einer Schreib-API (kein
toml.dump[s])Dieses PEP schlägt derzeit vor, keine Schreib-API aufzunehmen; das heißt, es wird kein Äquivalent zu
toml.dumpodertoml.dumpsgeben, wie in Einbeziehung einer API zum Schreiben von TOML diskutiert.Wenn wir eine Schreib-API aufnehmen würden, wäre es relativ einfach, den Großteil des Codes, der
tomlverwendet, auf das neue Standardbibliotheksmodul zu konvertieren (wobei anerkannt wird, dass dies sehr anders ist als eine kompatible API, da es immer noch Codeänderungen erfordern würde).Ein erheblicher Teil der
toml-Benutzer verlässt sich darauf, basierend auf dem Vergleich von Vorkommen von "toml.load" mit Vorkommen von "toml.dump". - Anderes erstes Argument von
toml.loadtoml.loadhat die folgende Signaturdef load( f: Union[SupportsRead[str], str, bytes, list[PathLike | str | bytes]], _dict: Type[MutableMapping[str, Any]] = ..., decoder: TomlDecoder = ..., ) -> MutableMapping[str, Any]: ...
Dies unterscheidet sich erheblich vom in diesem PEP vorgeschlagenen ersten Argument:
SupportsRead[bytes].Zusammenfassung der Gründe dafür, zuvor erwähnt in Typen, die als erstes Argument von tomllib.load akzeptiert werden
- Die Zulassung von Pfaden (und sogar Listen von Pfaden) als Argumente ist inkonsistent mit anderen ähnlichen Funktionen in der Standardbibliothek.
- Die Verwendung von
SupportsRead[bytes]ermöglicht es uns, sicherzustellen, dass UTF-8 die verwendete Kodierung ist, und die fälschliche Analyse von einzelnen Wagenrückläufen als gültiges TOML zu vermeiden.
Ein erheblicher Teil der
toml-Benutzer verlässt sich darauf, basierend auf manueller Inspektion von Vorkommen von "toml.load". - Fehler
tomllöstTomlDecodeErroraus, gegenüber dem vorgeschlagenen PEP 8-konformenTOMLDecodeError.Ein erheblicher Teil der
toml-Benutzer verlässt sich darauf, basierend auf Vorkommen von "TomlDecodeError". toml.load[s]akzeptiert ein_dict-ArgumentDiskutiert in Kontrolle des Typs von Abbildungen, die von tomllib.load[s] zurückgegeben werden.
Wie dort erwähnt, besteht fast die gesamte Verwendung aus
_dict=OrderedDict, was in Python 3.7 und neueren Versionen nicht notwendig ist.toml.load[s]unterstützt ein undokumentiertesdecoder-ArgumentEs scheint, dass der beabsichtigte Anwendungsfall die Implementierung der Kommentarerhaltung ist. Die aufgezeichneten Informationen reichen nicht aus, um das TOML-Dokument unter Beibehaltung des Stils zu runden, die Implementierung hat bekannte Fehler, das Feature ist undokumentiert und wir konnten nur eine Instanz seiner Verwendung auf https://grep.app finden.
Die toml.TomlDecoder Schnittstelle ist weit davon entfernt, einfach zu sein und enthält neun Methoden.
Benutzer sind wahrscheinlich besser mit einer vollständigeren Implementierung der stil-erhaltenden Analyse und des Schreibens bedient.
toml.dump[s]unterstützt einencoder-ArgumentBeachten Sie, dass wir derzeit vorschlagen, keine Schreib-API aufzunehmen; wenn sich dies jedoch ändern sollte, würden diese Unterschiede wahrscheinlich relevant werden.
Das
encoder-Argument ermöglicht zwei Anwendungsfälle- Kontrolle darüber, wie benutzerdefinierte Typen serialisiert werden sollen, und
- Kontrolle darüber, wie die Ausgabe formatiert werden soll.
Das erste ist vernünftig; wir konnten jedoch nur zwei Instanzen davon auf https://grep.app finden. Eine davon nutzte diese Fähigkeit, um die Unterstützung für das Dumping von
decimal.Decimalhinzuzufügen, was eine potenzielle Standardbibliotheksimplementierung von Haus aus unterstützen würde. Falls für andere Typen benötigt, könnte dieser Anwendungsfall gut durch das Äquivalent desdefault-Arguments injson.dumpbedient werden.Der zweite Anwendungsfall wird ermöglicht, indem Benutzern erlaubt wird, Unterklassen von toml.TomlEncoder anzugeben und Methoden zu überschreiben, um Teile des TOML-Schreibprozesses zu spezifizieren. Die API besteht aus fünf Methoden und exponiert detaillierte Implementierungsdetails.
Es gibt einige Verwendungen der
encoder-API auf https://grep.app; es scheint jedoch nur einen winzigen Bruchteil der Gesamtnutzung vontomlauszumachen.- Zeitzonen
tomlverwendet und exponiert benutzerdefiniertetoml.tz.TomlTz-Zeitzonenobjekte. Die vorgeschlagene Implementierung verwendetdatetime.timezone-Objekte aus der Standardbibliothek.
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-0680.rst
Zuletzt geändert: 2025-02-01 08:55:40 GMT