在this question中,OP想要使用ConfigParser從配置文件中提取未知數量的節,其中所有節都共享相同的內部格式。如何使用ConfigParser提取未知數量的值對?
在我的情況下,我不得不將所有內容都限制在一個部分。我試圖找出一個可維護,理智的方法來存儲「對」數據。一個人爲的例子將解釋事情變得更好:
[pings]
host1 = foo.com
port1 = 80
interval1 = 60
host2 = bar.com
port2 = 8080
interval2 = 300
host3 = baz.com
port3 = 443
interval3 = 15
這將是一個遞增指數環被讀取,而一旦我們到達那裏沒有找到預期值的迭代,我們可以推測,我們已經達到了目的的數據並停止。問題是這是醜陋的,不可維護的,更糟糕的是,假設我們想要註釋掉host1
......我們必須重新編號列表中的所有其他內容,以防止掃描早日終止。
這不打我作爲好得多:
[pings]
hosts = foo.com, bar.com, baz.com
ports = 80, 8080, 443
intervals = 60, 300, 15
太難閱讀項目的任何顯著數量,脆弱編輯等
我可以轉動它:
[pings]
ping1 = foo.com, 80, 60
ping2 = bar.com, 8080, 300
ping3 = baz.com, 443, 15
稍微按邏輯分組,但如果項目被添加/刪除/重新排列,仍然存在行重新編號問題。也很容易迷路(想想可以掃描一個非常寬的CSV表格)。
我想避免嵌入JSON或任何形式的對象文字符號。編輯錯誤的機會太多,無法解析解析器。
很久以前,我記得使用PHP在哪裏可以添加可變數量的查詢字符串項目,如?host[]=foo.com&host[]=bar.com&host[]=baz.com
和$_GET['host']
global將成爲一個包含三個項目的數組。盜取語法,我可以這樣做:
[pings]
host[] = foo.com
port[] = 80
interval[] = 60
host[] = bar.com
port[] = 8080
interval[] = 300
host[] = baz.com
port[] = 443
interval[] = 15
...或:
[pings]
ping[] = foo.com, 80, 60
ping[] = bar.com, 8080, 300
ping[] = baz.com, 443, 15
...並會有少一點擔心添加/刪除項目時。但我相信ConfigParser實際上會發生什麼是最新的項目(或者是最早的項目?)會覆蓋其他項目......如果[]
甚至被接受爲配置項。
是否有任何已建立的最佳實踐在配置文件中表達這樣的事情?
爲什麼限制只有一個部分?對於這個問題,在我看來,像JSON或YAML將是比INI文件更好的文件格式。 – Waylan
除非外部要求強制您使用INI文件,否則另一種格式將更容易使用。 – chepner