Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python Enhancement Proposals

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

Wichtig

Dieses PEP ist ein historisches Dokument. Die aktuelle, kanonische Dokumentation finden Sie unter tomllib.

×

Siehe PEP 1, um Änderungen vorzuschlagen.

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

  • tomlkit ist gut etabliert, aktiv gewartet und unterstützt TOML 1.0.0. Ein wichtiger Unterschied ist, dass tomlkit das Roundtripping von Stil unterstützt. Infolgedessen hat es eine komplexere API und Implementierung (etwa 5x so viel Code wie tomli). Sein Autor glaubt nicht, dass tomlkit eine gute Wahl für die Standardbibliothek ist.
  • toml ist 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 von tomli. 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.
  • pytomlpp ist ein Python-Wrapper für das C++-Projekt toml++. Reine Python-Bibliotheken sind einfacher zu warten als Erweiterungsmodule.
  • rtoml ist ein Python-Wrapper für das Rust-Projekt toml-rs und hat daher ähnliche Nachteile wie pytomlpp. 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; tomli erfü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 spiegelt configparser wider, ist aber möglicherweise weniger geeignet, wenn wir in Zukunft eine Schreib-API aufnehmen.
  • tomli. Dies setzt voraus, dass wir tomli als Grundlage für die Implementierung verwenden.
  • toml unter einem Namespace, wie z.B. parser.toml. Dies ist jedoch umständlich, zumal bestehende Parsing-Bibliotheken wie json, pickle, xml, html usw. nicht im Namespace enthalten wären.

Vorherige Diskussion

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.

  1. 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.dump oder toml.dumps geben, 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 toml verwendet, 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".

  2. Anderes erstes Argument von toml.load

    toml.load hat die folgende Signatur

    def 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".

  3. Fehler

    toml löst TomlDecodeError aus, gegenüber dem vorgeschlagenen PEP 8-konformen TOMLDecodeError.

    Ein erheblicher Teil der toml-Benutzer verlässt sich darauf, basierend auf Vorkommen von "TomlDecodeError".

  4. toml.load[s] akzeptiert ein _dict-Argument

    Diskutiert 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.

  5. toml.load[s] unterstützt ein undokumentiertes decoder-Argument

    Es 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.

  6. toml.dump[s] unterstützt ein encoder-Argument

    Beachten 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.Decimal hinzuzufü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 des default-Arguments in json.dump bedient 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 von toml auszumachen.

  7. Zeitzonen

    toml verwendet und exponiert benutzerdefinierte toml.tz.TomlTz-Zeitzonenobjekte. Die vorgeschlagene Implementierung verwendet datetime.timezone-Objekte aus der Standardbibliothek.


Quelle: https://github.com/python/peps/blob/main/peps/pep-0680.rst

Zuletzt geändert: 2025-02-01 08:55:40 GMT