Tentei usar o módulo ConfigParser do Python para salvar as configurações. Para meu aplicativo, é importante que eu preserve a caixa de cada nome em minhas seções. Os documentos mencionam que passar str () para ConfigParser.optionxform () faria isso, mas não funciona para mim. Os nomes estão todos em minúsculas. Estou esquecendo de algo?
<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz
Pseudocódigo Python do que obtenho:
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')]
Para mim, trabalhei para definir o optionxform imediatamente após criar o objeto
fonte
ConfigParser.ConfigParser()
Adicione ao seu código:
config.optionxform = lambda option: option # preserve case for letters
fonte
config.optionxform=str
:) apenas em vez de lamdba @Martin v. Löwis usastr
função incorporadaEu sei que esta pergunta foi respondida, mas pensei que algumas pessoas poderiam achar esta solução útil. Esta é uma classe que pode facilmente substituir a classe ConfigParser existente.
Editado para incorporar a sugestão de @OozeMeister:
class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
O uso é igual ao do ConfigParser normal.
Isso evita ter que definir o optionxform toda vez que fizer um novo
ConfigParser
, o que é entediante.fonte
optionxform
é apenas um método noRawConfigParser
, se você for tão longe quanto criar sua própria subclasse, você deve apenas substituir o método na subclasse em vez de redefini-lo por instanciação:class CaseConfigParser(ConfigParser): def optionxform(self, optionstr): return optionstr
Embargo:
Se você usar padrões com ConfigParser, ou seja:
config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'})
e tente tornar o analisador sensível a maiúsculas e minúsculas usando o seguinte:
todas as opções do (s) arquivo (s) de configuração manterão a caixa, mas
FOO_BAZ
serão convertidas em minúsculas.Para que os padrões também mantenham o caso, use subclasses como na resposta @icedtrees:
class CaseConfigParser(ConfigParser.SafeConfigParser): def optionxform(self, optionstr): return optionstr config = CaseConfigParser({'FOO_BAZ': 'bar'})
Agora
FOO_BAZ
manterá a caixa e você não terá InterpolationMissingOptionError .fonte