2009-10-23 151 views
54

我試圖使用Python的ConfigParser模塊來保存設置。對於我的應用程序來說,保留我的部分中每個名稱的大小寫很重要。文檔中提到將str()傳遞給ConfigParser.optionxform()可以實現這一點,但它對我無效。名字都是小寫的。我錯過了什麼嗎?是我所得到在ConfigParser中保留大小寫嗎?

<~/.myrc contents> 
[rules] 
Monkey = foo 
Ferret = baz 

Python的僞代碼:

import ConfigParser,os 

def get_config(): 
    config = ConfigParser.ConfigParser() 
    config.optionxform(str()) 
    try: 
     config.read(os.path.expanduser('~/.myrc')) 
     return config 
    except Exception, e: 
     log.error(e) 

c = get_config() 
print c.options('rules') 
[('monkey', 'foo'), ('ferret', 'baz')] 

回答

73

文檔是令人困惑的。他們的意思是這樣的:

import ConfigParser, os 
def get_config(): 
    config = ConfigParser.ConfigParser() 
    config.optionxform=str 
    try: 
     config.read(os.path.expanduser('~/.myrc')) 
     return config 
    except Exception, e: 
     log.error(e) 

c = get_config() 
print c.options('rules') 

即,覆蓋optionxform,而不是調用它;覆蓋可以在子類或實例中完成。重寫時,將其設置爲函數(而不是調用函數的結果)。

我現在已經報道了this as a bug,它已經被修復了。

+0

謝謝。它的工作原理,我同意文件混淆。 – pojo

+4

+1,用於報告錯誤 – Tshepang

2

我知道這個問題有答案,但我認爲有些人可能會覺得這個解決方案很有用。這是一個可以輕鬆替換現有ConfigParser類的類。

編輯納入@ OozeMeister的建議:

class CaseConfigParser(ConfigParser): 
    def optionxform(self, optionstr): 
     return optionstr 

用法是一樣的正常ConfigParser。

parser = CaseConfigParser() 
parser.read(something) 

之所以如此,您就不必在每次製作新ConfigParser時間,這是一種繁瑣的設置optionxform。

+0

由於'optionxform'只是'RawConfigParser'上的一個方法,如果您要儘可能創建自己的子類,則應該重寫子類上的方法而不是重新定義它每個實例化:'類CaseConfigParser(ConfigParser):def optionxform(self,optionstr):return optionstr' – OozeMeister

+0

@OozeMeister好主意! – icedtrees

20

爲我工作來創建對象後立即設置optionxform

config = ConfigParser.RawConfigParser() 
config.optionxform = str 
+1

太棒了! (請注意,在Python 3中它是「configparser」類名(不是大寫) –

+0

@NoamManos:您指的是模塊名稱(類名仍然是[ConfigParser](https://docs.python.org/3/) library/configparser.html#configparser.ConfigParser))。 –

+0

請注意,它也適用於'ConfigParser.ConfigParser()' –

0

警告:

如果您使用ConfigParser默認值,即:

config = ConfigParser.SafeConfigParser({'FOO_BAZ': 'bar'}) 

,然後儘量使解析器區分大小寫使用此:

config.optionxform = str 

配置文件中的所有選項都將保持不變,但FOO_BAZ將轉換爲小寫。

要具有默認值也保持自己的情況下,使用子類像@icedtrees回答:

class CaseConfigParser(ConfigParser.SafeConfigParser): 
    def optionxform(self, optionstr): 
     return optionstr 

config = CaseConfigParser({'FOO_BAZ': 'bar'}) 

現在FOO_BAZ將保持它的情況下,你不會有InterpolationMissingOptionError

相關問題