在ConfigParser保留的情况下?(Preserve case in ConfigParser

2019-08-31 14:51发布

我曾尝试使用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')]

Answer 1:

该文档是令人困惑的。 他们的意思是这样的:

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 ,并且它已被修复。



Answer 2:

对我来说,努力创建对象后立即设置optionxform

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


Answer 3:

添加到您的代码:

config.optionxform = lambda option: option  # preserve case for letters


Answer 4:

我知道这个问题的答案,但我认为有些人可能会发现这种解决方案非常有用。 这是一类,它可以很容易地取代现有的ConfigParser类。

编辑纳入@ OozeMeister的建议:

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

用法是一样的正常ConfigParser。

parser = CaseConfigParser()
parser.read(something)

这是这样,您就不必在每次制作新的时间设置optionxform ConfigParser ,这是一种单调乏味。



Answer 5:

警告:

如果使用默认值与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。



文章来源: Preserve case in ConfigParser?