Ich habe den Teil von den Dokumenten gelesen und festgestellt, dass ConfigParser
eine Liste mit Schlüssel / Wert zurückgibt Paare für die Optionen innerhalb eines Abschnitts. Ich dachte, dass Schlüssel innerhalb eines Abschnitts nicht eindeutig sein müssen, sonst würde der Parser nur ein Mapping zurückgeben. Ich habe mein Konfigurationsdatei-Schema um diese Annahme herum entworfen und dann leider festgestellt, dass dies nicht der Fall ist:
Dann ging ich zurück und fand den Teil der Dokumente, den ich >> lesen sollte:
Abschnitte werden normalerweise in a gespeichert eingebautes Wörterbuch. Eine Alternative Dictionary Typ kann an die übergeben werden ConfigParser-Konstruktor Beispielsweise, wenn ein Wörterbuchtyp übergeben wird sortiert seine Schlüssel, werden die Abschnitte sein Nach dem Zurückschreiben sortiert, wie das sein wird Schlüssel in jedem Abschnitt.
Um mein bestehendes Konfigurationsdateischema beizubehalten (was ich jetzt wirklich mag;) denke ich daran, ein Mapping-ähnliches Objekt wie oben erwähnt zu übergeben, das Werte anhäuft, statt sie zu überlisten. Gibt es eine einfachere Möglichkeit, den Schlüssel / Wert-Einsturz zu verhindern, den ich vermisse? Anstatt einen verrückten Adapter zu erstellen (der kaputt gehen könnte, wenn sich die Implementierung von ConfigParser
ändert), sollte ich einfach eine Variante von ConfigParser
selbst schreiben?
Ich denke, das könnte einer dieser "duh" Momente sein, in denen ich nur die schwierigen Lösungen sehe.
[Edit:] Hier ist ein präziseres Beispiel dafür, wie Ich mag würde die gleiche Taste mehrmals verwenden:
%Vor%Ich mag die kommagetrennte Listen-Syntax nicht, weil sie schwer auf die Augen wirkt, wenn Sie sie auf viele Werte skalieren; Eine kommagetrennte Liste von fünfzig Erweiterungen wäre beispielsweise nicht besonders lesbar.
ConfigParser wurde nicht für solche Bedingungen entwickelt. Außerdem macht deine Konfigurationsdatei für mich keinen Sinn.
ConfigParser gibt Ihnen eine dict-ähnliche Struktur für jeden Abschnitt. Wenn Sie also parser.items (Abschnitt) aufrufen, erwarte ich eine ähnliche Ausgabe wie dict.items (), bei der es sich nur um eine Liste von Schlüssel / Wert-Tupeln handelt. Ich würde niemals erwarten etwas zu sehen wie:
%Vor%Nicht zu erwähnen, wie würden Sie erwarten, dass sich das Folgende verhält?:
%Vor%Welches ist die beabsichtigte Möglichkeit, Werte abzurufen.
Wenn Sie mehrere Werte für denselben Schlüssel speichern möchten, würde ich in Ihrer Konfigurationsdatei so etwas vorschlagen:
%Vor%Und das in deinem Code:
%Vor%Dies funktioniert natürlich nur für Werte, die selbst keine Kommas enthalten oder mit Zitaten umgehen. Dafür sollten Sie eine fortgeschrittenere Technik verwenden (siehe dies und this ).
BEARBEITEN: Wenn Sie die zusätzliche Abhängigkeit nicht stören, können Sie ConfigObj auschecken unterstützt standardmäßig Listen als Werttyp.
Dieser Mangel an ConfigParser ist der Grund, warum Pyglet verwendet gepatchte Version von epydoc ersetzen ConfigParser mit dieser ini simple Format :
%Vor%Wenn Sie keine Abschnitte benötigen, kann dieser Ansatz nützlich sein.
Tags und Links python design configuration-files