在ConfigParser中保存大小写?

我试图使用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 ,现在已经修复了。

对于我在创build对象后立即设置了optionxform

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

我知道这个问题已经得到解答,但我认为有些人可能会觉得这个解决scheme很有用。 这是一个很容易replace现有的ConfigParser类的类。

编辑合并@ OozeMeister的build议:

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

用法与普通的ConfigParser相同。

 parser = CaseConfigParser() parser.read(something) 

这是为了避免在每次创build一个新的ConfigParser时都必须设置ConfigParser ,这很ConfigParser

警告:

如果你使用ConfigParser的默认值,即:

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

然后尝试使用以下命令使parsing器区分大小写:

 config.optionxform = str 

所有的configuration文件中的选项将保持他们的情况,但FOO_BAZ将被转换为小写。

要有默认也保持他们的情况下,使用subclassing就像在@icedtrees答案:

 class CaseConfigParser(ConfigParser.SafeConfigParser): def optionxform(self, optionstr): return optionstr config = CaseConfigParser({'FOO_BAZ': 'bar'}) 

现在FOO_BAZ将保持这种情况,你将不会有InterpolationMissingOptionError