Hierarchische Konfigurationsdateien mit Vererbung.

Du hast eine Idee für ein Projekt?
Antworten
syntor
User
Beiträge: 88
Registriert: Donnerstag 2. Dezember 2010, 03:56

Moin


Im Codesnippets-Forum habe ich vor einigen Tagen einen Thread erstellt, in dem ich eine hierarchische Konfigurationsdatei parse, deren Syntax an YAML angelehnt ist.
Schon im Vorfeld hatte ich mir Gedanken darüber gemacht, eine Art Vererbung für die Konfigurationsdatei zu implementieren.

Die Syntax die im Moment unterstützt ist, sieht wie folgt aus:

Code: Alles auswählen

#Kommentar - beeinträchtigt Hierarchie nicht, dennoch "AST" enhalten -> prgrammatische Regeneration der Datei ermöglicht.
Key1:
    # dict
    # Block der unter var["Key1"] zu erreichen ist, für die verschachtelten Elemente gelten ähnliche Regeln wie bei Python: mindestens ein eingerücktes Element, alle weiteren müssen gleich eingerückt sein (ausser Elemente weiterer Blöcke, natürlich)
    Key1: Value1
    # Der Wert wird von Whitespace, der ihn umgibt, bereinigt - mögliche Erweiterungen wären z.B. explizite Anführungs und Schlusszeichen (optional)
    KeyX:
        # verschachtelter Block
        Key1: Value1
Key2:
    # Listen
    - Value1
    - Value2
Natürlich dürfen Doppelpunkte auch innerhalb eines Wertes oder am Ende vorkommen.

Nun kann man eine solche "Konfiguration" (oder was es auch immer darstellen soll, wegen Mangels eines besseren Begriffes werde ich dieses Wort benützen) als "overlay" einer anderen definieren - selbstverständlich auch als overlay eines overlays.
Damit gibt es eine Art Vererbung der Konfigurationswerte. Gegenwärtig, die policy wie der lookup gemacht wird, ist wie folgt:
Begonnen wird beim "höchsten" overlay, also der, der in der Vererbungskette zuunterst steht. Im Grunde gilt immer der Wert, der zuerst kommt, wenn man durch die Vererbungskette schreitet. Listen werden um Elemente erweitert, "ältere" Elemente sind weiter hinten. Dicts werden einfach ge-merged. Nun ist es nicht notwendig, dass unter dem selben Key immer der gleiche "Datentyp" liegt (dict, list, Wert). Folgt in der Vererbungskette ein anderer Typ, so wird an diesem Ort einfach abgebrochen, und nur zurückgegeben, was bis hierhin gefunden wurde.

Ich hoffe man kann das verstehen :)

Natürlich gibt es andere Strategien, wie man diese Vererbung der Daten auflösen kann: bei Listen sind unterschiedliche Möglichkeiten angebracht - insbesondere dann, wenn die Daten nach einem bestimmten Muster geordnet sein müssen. Es kann also z.B. auch gewünscht sein, Elemente zu entfernen, anstatt nur am Ende einfügen zu können, wie es im Moment der Fall ist. Man möchte in der Lage sein, Elemente am Anfang oder an einer bestimmten Position einzufügen.

Wie sollte die Syntax für diese Möglichkeiten angepasst werden, um es dennoch "lightweight" zu halten?

Eine Idee, wie man die Syntax für Listen anpassen kann, wäre wie folgt:

Code: Alles auswählen

#Element am Anfang anfügen
< Wert
# Am Ende
> Wert
# Löschen
- Wert
Ich habe bewusst einen zusätzlichen Thread erstellt, da es mir hier primär um die Idee als solches geht (nicht um die technische Seite der Implementierung) und Erweiterung derer.
Antworten