Lerne Coding
TOML in Python 3.11 lesen und schreiben
21.11.2022

TOML in Python 3.11 - ein neuer Standard

Inhaltsverzeichnis
[[TABLE OF CONTENTS]]
access_timeGeschätzte Lesezeit ca. Minuten

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.

Was ist TOML?

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.

Lesen und Parsen von TOML Dateien in Python

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"])

Parsen von TOML Strings in Python

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)

Fallback für alte Versionen von Python

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.

Schreiben von TOML Dateien – tomli-w

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

Zusammenfassung

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.

Bildquelle - Vielen Dank an die Ersteller:innen für dieses Bild
Kommentare zum Artikel

Es sind noch keine Kommentare vorhanden? Sei der/die Erste und verfasse einen Kommentar zum Artikel "TOML in Python 3.11 lesen und schreiben"!

Kommentar schreiben

Vom Autor Empfohlen
close