2011-04-28 52 views
0

例如配置文件可以有不管位置如何,解析配置文件中的參數?

CFLAGS = "xyz" 
CXXFLAGS = "xyz" 

OR

CXXFLAGS = "xyz" 
CFLAGS = "xyz" 

我能想到的是隻拆分的說法最佳實施和左側送入開關

for line in file 
    x = line.split("=") 
    switch(x[0]) 
     case CFLAGS 
      do cflags 
     case CXXFLAGS 
      do cxxflags 

但如何做比我更有經驗的人做它嗎?我知道可能有些開源軟件會這樣做,但我甚至不知道在哪裏尋找他們的源代碼。 我主要在Python和C編程,所以實現/僞代碼/ whattolookup都將是首選,雖然其他語言也很好。

在此先感謝。

P.S.儘量避免在答案中說出任何形式的re,regex,regexp,正則表達式或其任何派生詞,除非它不可避免:P。

回答

0

由於Eli Bendersky說,在Python中,你應該只使用提供的ConfigParser

如果你堅持自己做,他將配置存儲爲字典的方法是我推薦的方法。另一種方法是將選項所對應的處理值,並做一些與他們的功能:

# Map the options to functions to handle them. 
handlers = { 
    'CFLAGS': some_function, 
    'CXXFLAGS': other_function, 
} 

# Loop through each option. 
for line in configuration: 
    # Get the option and value. 
    option, value = line.split('=') 
    option = option.strip().upper() 
    value = value.strip() 

    # Try to find a handler and process the option. 
    handler = handlers.get(option) 
    if handler: 
     handler(option, value) 
    else: 
     raise Exception('Unknown option.') 

顯然,處理函數必須能夠接受optionvalue參數你傳遞它。

+0

你雖然沒有做任何有用的值。我將選項名稱和值傳遞給處理程序(名稱允許處理程序處理幾個相關的鍵) – 2011-04-28 08:16:37

+0

@Eli:是的,這就是我想要做的。感謝您指出了這一點。 – Blair 2011-04-28 08:19:21

+0

我喜歡你的答案,所以我upvoted eli(因爲他已經有一些自己的upvotes),並接受布萊爾的。謝謝 – Enders 2011-04-28 08:29:26

4

在Python中,只需使用ConfigParser模塊,它將爲您解析類似.ini的配置文件。

重新實現這一點,我發現查看配置數據作爲一種字典很方便。這自然轉化爲Python的類型的字典,所以如果我分割線<key> = <value>我只是去和更新:

confdict[key] = value 

有了這個計劃,在配置文件中鍵的順序並不重要,就像它在字典本身並不重要 - 只要你可以查找鍵的值,你很高興。


如果你看的ConfigParser引擎蓋下,例如(相關的方法是_read),你會發現這正是它的作用。選項保存在字典中(每個部分一個,因爲.ini配置文件具有一個層次結構)。使用正則表達式從文件中解析行,並按照上面所述將key, value對添加到字典中。


這是Python。在C中,我想有相當多的庫可以做到這一點,但是實現你自己的將遵循完全相同的算法。你會爲字典使用某種關聯數組結構(散列表,樹或任何其他東西,並不重要),並執行相同的分配分配&。