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

标签 python ini configparser

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

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

config = Config('config.ini')
print config.section1.user
print config.section2.password

我知道 ConfigParser 会允许我做一些像 config['section1']['user'] 但那太难看了,我们不能做得更好吗?

该解决方案必须使用 Python 2.5 或更新版本。

最佳答案

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

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

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

并且测试显示了预期的结果:

>>> 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'

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

关于python - 如何在 Python 中加载配置文件并能够使用点表示法(属性)访问值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9773982/

相关文章:

Python - 列表中每个项目后的换行符

python - 如何退出pdb并允许程序继续?

python - pySpark Kafka Direct Streaming 更新 Zookeeper/Kafka Offset

PHP - 解析 ini 文件并访问单个值

python - Revit.ini 文件 - MissingSectionHeaderError : File contains no section headers. 文件 : Revit. ini,行:1 '\xff\xfe\r\x00\n'

python - Configparser 整数

python - 关闭由 ConfigParser 打开的文件

python - ORTOOLS [python] 中的多个 MILP 解决方案

C++ 构建器应用程序设置?

shell - 如何从shell脚本修改INI文件?