Preserve Fall in ConfigParser?
-
05-07-2019 - |
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')]
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 .