für meine Programme suchte ich ein einfaches Format für Konfigurations-Dateien.
Das INI-Format war für meine Zwecke geeignet und mit dem ConfigParser aus der Standard-Bibliothek von Python war auch ein passendes Modul vorhanden.
Leider war mir die Nutzung des ConfigParsers an einigen Stellen etwas zu umständlich:
- Es gibt zwar für einige Datentypen fertige Methoden, aber sobald man was anderes auslesen möchte, ist Handarbeit angesagt.
- Zum Schreiben muss man die Daten selbst in eine Zeichenkette konvertieren.
- Es gibt keine sinnvolle Möglichkeit, für jede einzelne Option einen Standard-Wert fest zu legen.
- Und wenn man sich die Konfiguration in einer Datenstruktur anlegt, darf man diese selber "parsen" ...
Hier ist das Ergebnis: easy_config.py
Hier ein Anwendungs-Beispiel (Ich weiss: *-Importe sollte man vermeiden. In dem Fall würde ich es allerdings gelten lassen, weil nichts anderes in der Datei steht.):
Code: Alles auswählen
#
# coding: utf-8
from easy_config import *
cfg = EasyConfig({
"main": {
"pos": (OptionPoint, (100,100)),
"size": (OptionPoint, (100,100)),
},
"dialog": {
"pos": (OptionPoint, (100,100)),
"txt": (OptionStr, "Test"),
"val": (OptionInt, 33),
},
})
Jeder Eintrag in diesem Dict repräsentiert eine Sektion der INI-Datei, mit dem Schlüssel als Sktionsnamen und den Optionen als Wert.
Für diese Optionen wird ebenfalls ein Dict erwartet. Dabei ist der Schlüssel der Name der Option und als Wert wird ein Tupel (oder Liste) erwartet.
Das erste Element ist eine Klasse, die den Zugriff auf die Option regelt, das zweite ist ein optionaler Standard-Wert.
Die read-Methode erwartet einen Dateinamen, den sich die Klasseninstanz für die Verwendung in der write-Methode merkt.
Ausserdem wird die Datei nur dann gelesen, wenn sie existiert.
Auf einzelne Optionen kann man mit "object.section.option" (zB: cfg.main.pos) zugreifen, den Wert der Option kann man über die "value"-Property auslesen bzw. ändern (zB cfg.main.pos.value).
Wenn man das oben gezeigte Beispiel als config.py speichert, kann man hier (=> cfg_test.py) sehen, wie sie in einem wxpython-Script verwendet wird ...
Ich weiss, da ist noch einiges an Verbesserungs-Potential ...
- Keine Doc-Strings
- Die Schlüssel der Dicts müssen gültige Python-Bezeichner sein, was nirgends geprüft wird.
- Ausserdem kann es verwirrend sein, wenn man für die Initialisierung Zeichenketten verwendet, aber nicht bei der Nutzung.
- ...