如何在Python中配置多对多关系

时间:2009-11-16 23:13:29

标签: python configuration

我有一个简单的应用程序,需要将多对多关系配置为其设置的一部分。例如,应用程序需要存储库URL列表,用户列表以及每个用户的存储库URL子集。

我首先考虑使用类似于以下内容的config.py文件:

repositories = {
    'repo1': 'http://svn.example.com/repo1/',
    'repo2': 'http://svn.example.com/repo2/',
    'repo3': 'http://svn.example.com/repo3/',
}
user_repository_mapping = {
    'person_A': ['repo1', 'repo3'],
    'person_B': ['repo2'],
    'person_C': ['repo1', 'repo2']
}

我可以导入。但是这很乱,因为配置文件不在我的python-path之外,我宁愿使用标准配置方法,比如使用ini文件或YAML。

是否有一种优雅的方式来配置这样的关系,而无需直接导入Python?

3 个答案:

答案 0 :(得分:2)

我会以JSON格式存储配置。例如:

cfg = """
{
    "repositories": {
        "repo1": "http://svn.example.com/repo1/",
        "repo2": "http://svn.example.com/repo2/",
        "repo3": "http://svn.example.com/repo3/"
    },
    "user_repository_mapping": {
        "person_A": ["repo1", "repo3"],
        "person_B": ["repo2"],
        "person_C": ["repo1", "repo2"]
    }
}
"""

import simplejson as json
config = json.loads(cfg)
person = "person_A"
repos = [config['repositories'][r] for r in config['user_repository_mapping'][person]]
print repos

答案 1 :(得分:1)

如果您喜欢通过缩进表示结构的想法(比如Python),那么YAML将非常适合您。如果您不想依赖空格并且更喜欢显式语法,那么最好使用JSON。两者都易于理解和流行,这意味着有Python库。

另外一个优点是,与使用标准Python代码相比,您可以确保配置文件只包含数据,而不包含任何将被执行的代码。

答案 2 :(得分:-1)

我使用的策略是将整个应用程序放在一个类中,然后允许用户将配置传递给构造函数,而不是使用可导入的配置文件。或者,在更复杂的情况下,他们甚至可以将应用程序类子类化以添加成员或更改行为。虽然这确实需要一些Python语法知识才能配置应用程序,但它并不是那么困难,而且比ini / markup配置文件方法更灵活。

所以你举例说明你可以在pythonpath之外有一个调用脚本,如下所示:

#!/usr/bin/env python

import someapplication

class MySomeApplication(someapplication.Application):
    repositories = {
       'repo1': 'http://svn.example.com/repo1/',
       'repo2': 'http://svn.example.com/repo2/',
       'repo3': 'http://svn.example.com/repo3/',
    }
    user_repository_mapping = {
        'person_A': ['repo1', 'repo3'],
        'person_B': ['repo2'],
        'person_C': ['repo1', 'repo2']
    }

MySomeApplication().run()

然后要进行第二次配置,他们可以换出甚至同时运行,您只需处理调用脚本并更改其中的设置。