Fall in ConfigParser beibehalten?


87

Ich habe versucht, das ConfigParser- Modul von Python zum Speichern von Einstellungen zu verwenden. Für meine App ist es wichtig, dass ich die Groß- und Kleinschreibung jedes Namens in meinen Abschnitten behalte. In den Dokumenten wird erwähnt, dass die Übergabe von str () an ConfigParser.optionxform () dies erreichen würde, aber es funktioniert bei mir nicht. Die Namen sind alle in Kleinbuchstaben. Vermisse ich etwas

<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz

Python-Pseudocode von dem, was ich bekomme:

import ConfigParser,os

def get_config():
   config = ConfigParser.ConfigParser()
   config.optionxform(str())
    try:
        config.read(os.path.expanduser('~/.myrc'))
        return config
    except Exception, e:
        log.error(e)

c = get_config()  
print c.options('rules')
[('monkey', 'foo'), ('ferret', 'baz')]

Antworten:


111

Die Dokumentation ist verwirrend. Was sie bedeuten, ist Folgendes:

import ConfigParser, os
def get_config():
    config = ConfigParser.ConfigParser()
    config.optionxform=str
    try:
        config.read(os.path.expanduser('~/.myrc'))
        return config
    except Exception, e:
        log.error(e)

c = get_config()  
print c.options('rules')

Dh Optionxform überschreiben, anstatt es aufzurufen; Das Überschreiben kann in einer Unterklasse oder in der Instanz erfolgen. Setzen Sie es beim Überschreiben auf eine Funktion (und nicht auf das Ergebnis des Aufrufs einer Funktion).

Ich habe dies jetzt als Fehler gemeldet und es wurde seitdem behoben.


Danke dir. Es funktioniert und ich stimme zu, dass die Dokumente verwirrend sind.
Pojo

37

Bei mir wurde daran gearbeitet, optionxform sofort nach dem Erstellen des Objekts festzulegen

config = ConfigParser.RawConfigParser()
config.optionxform = str 

2
Funktioniert super! (Beachten Sie, dass es sich in Python 3 um den Klassennamen "configparser" handelt (kein Großbuchstabe)
Noam Manos

1
@NoamManos: Sie beziehen sich auf den Modulnamen (der Klassenname lautet weiterhin ConfigParser ).
Jonas Byström

2
Beachten Sie, dass es auch mitConfigParser.ConfigParser()
Jean-Francois T.

6

Fügen Sie Ihrem Code hinzu:

config.optionxform = lambda option: option  # preserve case for letters

1
Dies scheint zumindest in Python 2.7 für mich zu funktionieren und ist viel sauberer als die akzeptierte Antwort. Danke foo!
hrbdg

2
Dies ist das Gleiche wie die am besten config.optionxform=strbewertete Antwort - siehe Zeile :) Nur anstelle Ihrer Lamdba @Martin v. Löwis verwendet die eingebettete strFunktion
Xuthus

@xuthus - In der Tat können Sie 11 Codezeilen anstelle von 1 Zeile verwenden. Wie es Dir gefällt.
FooBar167

4

Ich weiß, dass diese Frage beantwortet wird, aber ich dachte, einige Leute finden diese Lösung möglicherweise nützlich. Dies ist eine Klasse, die die vorhandene ConfigParser-Klasse problemlos ersetzen kann.

Bearbeitet, um den Vorschlag von @ OozeMeister aufzunehmen:

class CaseConfigParser(ConfigParser):
    def optionxform(self, optionstr):
        return optionstr

Die Verwendung entspricht der von ConfigParser.

parser = CaseConfigParser()
parser.read(something)

Auf diese Weise müssen Sie nicht jedes Mal, wenn Sie eine neue erstellen, optionxform festlegen ConfigParser, was etwas mühsam ist.


Da optionxformes sich nur um eine Methode für die RawConfigParserErstellung einer eigenen Unterklasse handelt, sollten Sie stattdessen die Methode für die Unterklasse überschreiben, anstatt sie pro Instanziierung neu zu definieren:class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
OozeMeister

@OozeMeister tolle Idee!
Eisbäume

2

Vorbehalt:

Wenn Sie mit ConfigParser Standardeinstellungen verwenden, z.

config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'})

und versuchen Sie dann, den Parser zwischen Groß- und Kleinschreibung zu unterscheiden, indem Sie Folgendes verwenden:

config.optionxform = str

Alle Ihre Optionen aus Konfigurationsdateien behalten ihre Groß- und FOO_BAZKleinschreibung bei, werden jedoch in Kleinbuchstaben konvertiert.

Verwenden Sie Unterklassen wie in der Antwort von @icedtrees, um die Standardeinstellungen beizubehalten:

class CaseConfigParser(ConfigParser.SafeConfigParser):
    def optionxform(self, optionstr):
        return optionstr

config = CaseConfigParser({'FOO_BAZ': 'bar'})

Jetzt FOO_BAZbleibt es so und Sie haben keinen InterpolationMissingOptionError .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.