2010-06-09 2 views
7

Ich möchte ein Konfigurationsdateiformat verwenden, das Schlüsselwertpaare und verschachtelbare, wiederholbare Strukturen unterstützt und das so wenig Syntax wie möglich enthält. Ich stelle mir etwas in den folgenden Zeilen vor:Python: Ordentliches Konfigurationsdateiformat

cachedir = /var/cache 
mail_to = [email protected] 

job { 
    name = my-media 
    frequency = 1 day 
    source { 
     from = /home/michael/Images 

    source { } 
    source { }  
} 

job { } 

Ich wäre glücklich mit etwas, das auch signifikante Leerzeichen verwendet.

JSON benötigt zu viele explizite Syntaxregeln (Anführungszeichen, Kommas usw.). YAML ist eigentlich ziemlich gut, würde aber erfordern, dass die Jobs als eine YAML-Liste definiert werden, was ich etwas unbeholfen finde.

Antwort

13

Ich denke, YAML für diesen Zweck groß ist, tatsächlich:

jobs: 
- name: my-media 
    ... 

- name: something else 
    ... 

Oder als dict statt Liste:

jobs: 
    my-media: 
    frequency: 1 day 
    ... 
    something-else: 
    frequency: 2 day 
    ... 

andere Sache zu prüfen, die Sie nicht haben könnten, ist Verwenden der Python-Quelle für die Konfiguration. Sie können Python-Dicts und -Listen sehr gut lesbar verschachteln und es bietet mehrere unerwartete Vorteile. Django verwendet zum Beispiel Python-Quellen für seine Einstellungsdateien.

+1

Danke für die dict Idee. Ich hätte diese Syntax lieber über eine Liste, hätte diesen Ansatz nicht berücksichtigt. – miracle2k

2

Ich denke, Sie sollten libconfig Bibliothek http://www.hyperrealm.com/libconfig/ überprüfen. Es sollte irgendwo Python-Bindungen dafür sein.

Eine andere Lösung ist die Verwendung des JSON-Formats, das bereits von Python selbst bereitgestellt wird. Suchdokumentation für JSON-Modul.

8

Da Pythons eingebautes configparser Modul verschachtelte Abschnitte nicht unterstützt, würde ich zuerst versuchen ConfigObj. (Siehe ein Einführungs-Tutorial here).Nach seiner Homepage, das ist der Satz von Funktionen erwähnenswert:

  • Nested Abschnitte (Unterabschnitte), auf jeder Ebene
  • Listenwerte
  • Mehrere Linienwerte
  • String-Interpolation (Substitution)
  • mit einem leistungsstarken Validierungssystem Integrierte
    • einschließlich automatischer Typprüfung/Umwandlung
    • wiederholte Abschnitte
    • und damit Standardwerte
  • Wenn Konfigurationsdateien auszuschreiben, bewahrt ConfigObj alle Kommentare und die Reihenfolge der Elemente und Abschnitte
  • Viele nützliche Methoden und Optionen für Arbeiten mit Konfigurationsdateien (wie die 'reload' Methode)
  • Volle Unicode-Unterstützung

ConfigObj wird von Bazaar, Trac, IPython, matplotlib und vielen anderen großen Pythons pr verwendet Projekte, so scheint es ziemlich reif und stabil für mich (obwohl ich es selbst nie benutzt habe).

0

Sie können auch Jsonnet in Betracht ziehen, wenn Ihre Anforderungen diese anderen Optionen überschreiten. Jsonnet ist eine Erweiterung von JSON, die auf den ersten Blick Kommentare hinzufügt, Kommatregeln lockert und so viele Zitate überflüssig macht. Aber wenn Sie tiefer schauen, sehen Sie, dass es wirklich eine voll funktionsfähige Programmiersprache bietet und Unterstützung für die Template-Erweiterung über Mixins, Dateiimporte usw. bietet. Es gibt eine Python-Bindung dafür, aber seine tatsächliche Implementierung ist C++.