在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 。