我有一个简单的应用程序,需要将多对多关系配置为其设置的一部分。例如,应用程序需要存储库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?
答案 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()
然后要进行第二次配置,他们可以换出甚至同时运行,您只需处理调用脚本并更改其中的设置。