如何在 Python 中加载配置文件并能够使用点表示法(属性)访问值?

sor*_*rin 5 python ini configparser

我正在寻找一种解决方案,允许我使用配置文件数据的属性。

我希望能够做这样的事情:

config = Config('config.ini')
print config.section1.user
print config.section2.password
Run Code Online (Sandbox Code Playgroud)

我确实知道 ConfigParser 允许我做类似的事情,config['section1']['user']但这太丑陋了,我们不能做得更好吗?

该解决方案必须适用于 Python 2.5 或更高版本。

Tad*_*eck 2

它并不难看,而是更好 - 点表示法意味着另一个自定义类的对象中可能存在一些自定义类的对象。更可行的方法是使用字典(使用括号表示法)。

但如果你坚持的话,你可以这样翻译代码:

def config2object(config):
    """
    Convert dictionary into instance allowing access to dictionary keys using
    dot notation (attributes).
    """
    class ConfigObject(dict):
        """
        Represents configuration options' group, works like a dict
        """
        def __init__(self, *args, **kwargs):
            dict.__init__(self, *args, **kwargs)
        def __getattr__(self, name):
            return self[name]
        def __setattr__(self, name, val):
            self[name] = val
    if isinstance(config, dict):
        result = ConfigObject()
        for key in config:
            result[key] = config2object(config[key])
        return result
    else:
        return config
Run Code Online (Sandbox Code Playgroud)

测试显示了预期的结果:

>>> c1 = {
    'conf1': {
        'key1': 'aaa',
        'key2': 12321,
        'key3': False,
        },
    'conf2': 'bbbb',
    }
>>> c1
{'conf2': 'bbbb', 'conf1': {'key3': False, 'key2': 12321, 'key1': 'aaa'}}
>>> c2 = config2object(c1)
>>> c2.conf1
{'key3': False, 'key2': 12321, 'key1': 'aaa'}
>>> c2.conf1.key1
'aaa'
>>> c2.conf1.key3
False
>>> c2.conf2
'bbbb'
Run Code Online (Sandbox Code Playgroud)

编辑:Sven Marnach 指出这Config('config.ini')是一些自定义类实例。它不是字典,它有一些非常有用的自定义方法,但可能会使某些配置选项无法访问(当存在名称冲突时)。因此,首选方法不是使用我提到的解决方案,而是使用括号表示法来访问配置选项。