我曾尝试使用Python的ConfigParser模块保存设置。 对于我的应用它,我保存每个名称的情况下,在我的部分是很重要的。 该文档提到,经过STR()来ConfigParser.optionxform()会做到这一点,但它并没有为我工作。 名字都是小写。 我缺少的东西吗?
<~/.myrc contents>
[rules]
Monkey = foo
Ferret = baz
是我所得到的Python伪代码:
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')]
该文档是令人困惑的。 他们的意思是这样的:
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')
即覆盖optionxform的,而不是调用它; 压倒一切可以在子类或实例来完成。 重写时,将其设置为一个功能(而不是调用函数的结果)。
现在我已经报告这个bug ,并且它已被修复。
对我来说,努力创建对象后立即设置optionxform
config = ConfigParser.RawConfigParser()
config.optionxform = str
添加到您的代码:
config.optionxform = lambda option: option # preserve case for letters
我知道这个问题的答案,但我认为有些人可能会发现这种解决方案非常有用。 这是一类,它可以很容易地取代现有的ConfigParser类。
编辑纳入@ OozeMeister的建议:
class CaseConfigParser(ConfigParser):
def optionxform(self, optionstr):
return optionstr
用法是一样的正常ConfigParser。
parser = CaseConfigParser()
parser.read(something)
这是这样,您就不必在每次制作新的时间设置optionxform ConfigParser
,这是一种单调乏味。
警告:
如果使用默认值与ConfigParser,即:
config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'})
然后尝试通过使用这个方法,使解析器区分大小写:
config.optionxform = str
从配置文件(S)的所有选项将保持他们的情况,但FOO_BAZ
将被转换为小写。
有默认值也保持自己的情况下,使用子类像@icedtrees回答:
class CaseConfigParser(ConfigParser.SafeConfigParser):
def optionxform(self, optionstr):
return optionstr
config = CaseConfigParser({'FOO_BAZ': 'bar'})
现在FOO_BAZ
将保持它的情况下,你不会有InterpolationMissingOptionError。