2009-11-16 29 views
2

我有一個簡單的應用程序,需要將多對多關係配置爲其設置的一部分。例如,應用程序需要一個存儲庫URL列表,一列用戶列表和每個用戶的一部分存儲庫URL。如何允許在Python中配置多對多關係

我首先想到使用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路徑,我寧願使用標準配置方法,例如使用ini文件或YAML。

有沒有一種優雅的方式來配置這種關係,而無需直接導入Python?

回答

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 
+0

這只是票 - 謝謝! – DavidWinterbottom 2009-11-18 14:25:45

1

如果您喜歡通過縮進來表示結構的想法(比如在Python中),那麼YAML將會非常適合您。如果你不想依賴空白並且喜歡顯式語法,那麼最好使用JSON。兩者都很容易理解和流行,這意味着那裏有Python庫。

其他優點是,與使用標準Python代碼相比,您可以確定您的配置文件只能包含數據並且不會執行任意代碼。

-1

我使用的策略是將整個應用程序放在一個類中,然後不是具有可導入的配置文件,而是允許用戶將配置傳遞給構造函數。或者,在更復雜的情況下,他們甚至可以繼承應用程序類以添加成員或更改行爲。雖然這確實需要一點Python語法知識才能配置應用程序,但它並不是那麼困難,並且比ini /標記配置文件方法更加靈活。

所以你例如,你可以有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() 

然後有他們可以換出,甚至在同一時間運行第二個配置,只需應付的invoke -script並更改其中的設置。