2011-06-02 37 views
10

ConfigParser要求所有部分,鍵和值都是字符串;沒有驚喜。它有方法將值轉換爲數據類型getfloat,getint,getboolean。如果你不知道的數據類型,你可以包裝get()eval()得到了字符串評估,如:將ConfigParser值轉換爲python數據類型

>>> from ConfigParser import SafeConfigParser 
>>> cp = SafeConfigParser() 
>>> cp.add_section('one') 
>>> cp.set('one', 'key', '42') 
>>> print cp.get('one', 'key') 
'42' 
>>> print eval(cp.get('one', 'key')) 
42 
>>> cp.set('one', 'key', 'None') 
>>> print eval(cp.get('one', 'key')) 
None 
>>> 

有沒有更好的辦法?我認爲在評估文件中的文本時存在一些嚴重的安全問題 - 我承認;我完全信任這個文件。

我以爲我會用pickle這個,但我真的想保持配置文件的人類可讀性。

你會怎麼做?

回答

13

如果正在使用Python 2.6或以上則可以使用ast.literal_eval

ast.literal_eval(node_or_string)
安全評估的表達式節點或含有Python表達式的字符串。提供的字符串或節點可能只包含以下Python文字結構:字符串,數字,元組,列表,字典,布爾值和無。

這可以用於從不受信任的來源安全地評估包含Python表達式的字符串,而不需要自己解析值。

這會像eval當字符串是安全的:

>>> literal_eval("{'key': 10}") 
{'key': 10} 

但是如果除了文檔中列出的各類事情出現就會失敗:

>>> literal_eval("import os; os.system('rm -rf somepath')") 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib64/python2.6/ast.py", line 49, in literal_eval 
    node_or_string = parse(node_or_string, mode='eval') 
    File "/usr/lib64/python2.6/ast.py", line 37, in parse 
    return compile(expr, filename, mode, PyCF_ONLY_AST) 
    File "<unknown>", line 1 
    import os; os.system('rm -rf somepath') 
     ^
SyntaxError: invalid syntax 
+0

我用你的答案創建內容:HTTP://代碼審查。stackexchange.com/questions/2775/python-subclassing-configparser – tMC 2011-06-02 02:22:17

1

如果您在2.7+然後你可以使用.getint.getfloat.getbool方法。您可以瞭解更多關於他們在docs

所以,你的應用程序將使用print cp.getint('one', 'key')

3

對於那些可能會尋找另一種更簡單的答案,您不必自己轉換數據類型,您可以使用localconfig模塊爲您進行轉換。轉換是通過基於值猜測數據類型(即,123是一個int,123.4是一個浮點數,true是一個布爾值,等等)來完成的。

這是繼OP的一個例子:

>>> from localconfig import config 
>>> config.read('[one]\nkey = 42\nkey2 = None') 
>>> config.one.key, type(config.one.key) 
(42, <type 'int'>) 
>>> config.one.key2, type(config.one.key2) 
(None, <type 'NoneType'>) 
>>> config.get('one', 'key'), config.get('one', 'key2') 
(42, None) 

這是ConfigParser的一種包裝,所以它是完全兼容。

瞧瞧吧https://pypi.python.org/pypi/localconfig

+0

謝謝,你的軟件包對我非常有幫助! – crazjo 2017-12-13 12:16:41

相關問題