Próbowałem użyć modułu ConfigParser języka Python, aby zapisać ustawienia. W przypadku mojej aplikacji ważne jest, aby zachować wielkość liter w każdej z sekcji. Dokumentacja wspomina, że przekazanie str () do ConfigParser.optionxform () mogłoby to osiągnąć, ale nie działa to dla mnie. Nazwy są pisane małymi literami. Czy coś mi brakuje?
<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz
Pseudokod w Pythonie tego, co otrzymuję:
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')]
U mnie pracował nad ustawieniem optionxform natychmiast po utworzeniu obiektu
źródło
ConfigParser.ConfigParser()
Dodaj do swojego kodu:
config.optionxform = lambda option: option # preserve case for letters
źródło
config.optionxform=str
:) tylko zamiast twojego lamdba @Martin v. Löwis używa wbudowanejstr
funkcjiWiem, że udzielono odpowiedzi na to pytanie, ale pomyślałem, że niektórzy ludzie mogą uznać to rozwiązanie za przydatne. Jest to klasa, która może łatwo zastąpić istniejącą klasę ConfigParser.
Edytowano w celu uwzględnienia sugestii @ OozeMeister:
class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
Użycie jest takie samo jak w przypadku zwykłego ConfigParser.
Dzięki temu unikniesz konieczności ustawiania optionxform za każdym razem, gdy tworzysz nowy
ConfigParser
, co jest trochę żmudne.źródło
optionxform
jest to tylko metoda na platformieRawConfigParser
, jeśli masz zamiar posunąć się do tworzenia własnej podklasy, powinieneś zamiast tego po prostu nadpisać metodę w podklasie, zamiast redefiniować ją dla każdej instancji:class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
Ostrzeżenie:
Jeśli używasz wartości domyślnych z ConfigParser, tj .:
config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'})
a następnie spróbuj rozróżniać wielkość liter w parserze, używając tego:
wszystkie opcje z plików konfiguracyjnych zachowają wielkość liter, ale
FOO_BAZ
zostaną przekonwertowane na małe litery.Aby wartości domyślne również zachowywały wielkość liter, użyj podklas, jak w odpowiedzi @icedtrees:
class CaseConfigParser(ConfigParser.SafeConfigParser): def optionxform(self, optionstr): return optionstr config = CaseConfigParser({'FOO_BAZ': 'bar'})
Teraz
FOO_BAZ
zachowa wielkość liter i nie będziesz mieć InterpolationMissingOptionError .źródło