Mit Python 3.11 hat Python nun ein TOML Reader für Konfigurationsdateien hinzugefügt – unter dem Namen tomllib, diese ist eine TOML Library. Besonderheit ist hier, dass TOML zwar gelesen werden kann – aber nicht geschrieben werden kann mit dem Standardmodul. Diese hat einen ganz einfachen Grund – es ist nicht notwendig – da Tools wie black, mypy, pytest usw. vorwiegend TOML Files lesen müssen, aber nicht schreiben. Wurde sich dafür entschieden, mit PEP 680 einen Parser zu implementieren, aber keinen Writer.
Die TOML Implementierung soll dazu beitragen, die Lesbarkeit von Konfigurationsdateien in Python zu verbessern und TOML als Standard für Python zu etablieren. Eine API zum Schreiben von TOML Dateien wurde mit PEP 680 kategorisch ausgeschlossen – da der Hauptgrund für PEP 680 ist, dass eben Konfigurationsdatei gut gelesen werden können, weshalb kein Schreiben von TOML Dateien notwendig ist. Zum Schreiben von TOML Dateien wird in der tomllib Modul Doku nach wie vor auf das tomli-w Modul verwiesen, um diese zu schreiben.
TOML [Tom's Obvious Minimal Language] hat syntaktische Ähnlichkeiten zu JSON und YAML.
TOML hat bereits Support in vielen verschiedenen Sprachen wie: Java, JavaScript, Perl, PHP, Dart, Elixir, Erlang, Golang und vielen weiteren. Es werden verschiedenste Datentypen wie Zeiten, Arrays, Integers & Floats und Booleans unterstützt. Mehr dazu findest du auch in der Spezifikation: https://toml.io/en/v1.0.0.
# Das ist ein TOML Beispiel
name = "TOML Example"
[author]
name = "Felix Schürmeyer"
birthday = 1998-05-06T00:00:00-08:00
[artikels]
[artikels.drafts]
liste = ["Was ist TOML?"]
[artikels.published]
liste = ["Was ist Python?"]
Tipp: Für Visual Studio Code kann, ich die Extension „Better TOML“ empfehlen. Da Standardmäßig kein Syntax Highlighter Vorhanden ist in Visual Studio Code.
Viele Pakete oder aufwendige Konzepte sind nicht notwendig, um TOML Dateien zu lesen, es ist vollkommen ausreichend vom tomllib
Paket die load Methode zu verwenden, um eine TOML Datei zu lesen. Anschließende kann man wie auch von JSON oder YAML gewohnt das entsprechende Python Dictionary durchgehen und auf seine Values zugreifen.
import tomllib
with open("test.toml", "rb") as f:
data = tomllib.load(f)
print(data["author"]["name"])
Neben dem Einlesen von Dateien können auch direkt Strings eingelesen werden. Diese ist zum Beispiel dann nützlich, wenn die Konfiguration mittels externem Request geladen wird zum Beispiel. Der Unterschied ist hier, dass die loads Methode genutzt wird und nicht die load Methode. Und da wir keine Dateioperation haben, benötigen wir auch keinen Context Manger, sondern wir übergeben einfach unseren String an die Methode.
import tomllib
strings = """
# Das ist ein TOML Beispiel
name = "TOML Example"
[author]
name = "Felix Schürmeyer"
birthday = 1998-05-06T00:00:00-08:00
[artikels]
[artikels.drafts]
liste = ["Was ist TOML?"]
[artikels.published]
liste = ["Was ist Python?"]
"""
data = tomllib.loads(strings)
Falls du nun unterschiedliche Python Versionen supporten möchtest, bietet sich an, mit dem tomli
Modul zu arbeiten und das als tomllib
zu benennen – so kann nahtlos gearbeitet werden, diese ist ebenfalls die offizielle Empfehlung. Da dieselben Methoden bereitgestellt worden – so muss am Quellcode für neuere Versionen nichts verändert werden.
try:
import tomllib
except ModuleNotFoundError:
import tomli as tomllib
Mit einem einfach try, except Block und dem ModuleNotFoundError kann die Verfügbarkeit eines TOML Parsers gewährleistet werden.
Um eine Python Dictionary in eine TOML Datei zu schreiben, gibt es das Modul tomli-w
dieses wird auch in der offiziellen Dokumentation empfohlen. Da wie oben schon beschrieben es nicht empfohlen wird TOML Dateien zu Schreiben – da diese Primäre zur Konfiguration gedacht sind.
Ein Programm, um eine Entsprechenden TOML String zu erstellen, könnte aussehen wie im Nachfolgenden Beispiel, Alternative zu dumps kann auch dump verwendet werden und als zweiten Parameter direkt eine File Stream übergeben, um den Output in eine TOML Datei zu schreiben.
import tomli_w as tomlwriter
docs = {
"author": {
"name": "Felix",
"age": 24
}
}
print(tomlwriter.dumps(docs))
# [author]
# name = "Felix"
# age = 24
Persönlich bin ich kein Fan von TOML – ich bevorzuge gerne YAML, weil dieses zum Beispiel auch bei Docker Compose zum Einsatz kommt – und so vermeintlich erst einmal eine höhere Verbreitung hat. Zum anderen finde ich das YAML syntaktisch besser zu Python passt als TOML, weil eben beide mit der Syntaktischen Einrückung Arbeiten, was bei TOML gänzlich nicht vorhanden ist.
Hinterlasse mir gerne einen Kommentar zum Artikel und wie er dir weitergeholfen hat beziehungsweise, was dir helfen würde das Thema besser zu verstehen. Oder hast du einen Fehler entdeckt, den ich korrigieren sollte? Schreibe mir auch dazu gerne ein Feedback!
Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "TOML in Python 3.11 lesen und schreiben"!