Frage

Ich habe versucht, Python zu benutzen ConfigParser Modul Einstellungen zu speichern. Für meine Anwendung ist es wichtig, dass ich den Fall jeden Name in meinen Abschnitten zu bewahren. Die docs erwähnen, dass vorbei str () an ConfigParser.optionxform () würde dies erreichen, aber es für mich nicht funktioniert. Die Namen sind in Kleinbuchstaben. Bin ich etwas fehlt?

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

Python Pseudo-Code von dem, was ich bekommen:

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')]
War es hilfreich?

Lösung

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

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')

d. außer Kraft setzen optionxform, anstatt sie zu fordern; überwiegendes kann in einer Unterklasse oder in der Instanz durchgeführt werden. Wenn überschreiben, legen Sie es auf eine Funktion (und nicht das Ergebnis einer Funktion des Aufrufs).

Ich habe jetzt dies als Fehler berichtet, und es behoben seit wurde.

Andere Tipps

Für mich war sofort einzustellen optionxform nach Erstellen des Objekts

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

In dem Code:

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

Ich weiß, diese Frage beantwortet, aber ich dachte, einige Leute diese Lösung nützlich sein könnten. Dies ist eine Klasse, die die bestehende ConfigParser Klasse leicht ersetzen kann.

Edited @ OozeMeister Vorschlag übernehmen:

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

Die Verwendung ist die gleiche wie normale ConfigParser.

parser = CaseConfigParser()
parser.read(something)

Dies ist so, Sie vermeiden jedes Mal setzen optionxform Sie einen neuen ConfigParser machen, was irgendwie langweilig ist.

Caveat:

Wenn Sie die Standardeinstellung mit ConfigParser verwenden, das heißt:.

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

und dann versuchen, den Parser case-sensitive, indem Sie diese machen:

config.optionxform = str

alle Optionen von config-Datei (en) werden ihren Fall halten, aber FOO_BAZ wird in Kleinbuchstaben umgewandelt werden.

Um Standardwerte haben auch ihren Fall halten, verwenden Subklassifizieren wie in @icedtrees beantworten:

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

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

Jetzt FOO_BAZ halten es ist Fall und Sie müssen nicht InterpolationMissingOptionError .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top