2010-09-17 97 views

回答

7

好了,你可以做

d = eval(some_string) 

但是,如果字符串中包含用戶輸入,這是一個壞主意,因爲一些隨機的惡意功能可能是在表達。見Safety of Python 'eval' For List Deserialization

所以更安全的替代可能是:

import ast 
d = ast.literal_eval(some_string) 

http://docs.python.org/library/ast.html#ast.literal_eval

字符串或提供可能只包括以下 的Python字面結構的節點:字符串,數字,元組,列表,字典,布爾值, 和None。

+0

感謝您的接受! – 2010-09-17 19:07:32

11

使用ast.literal_eval

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

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

例子:

>>> some_string = '{123: False, 456: True, 789: False}' 
>>> import ast 
>>> ast.literal_eval(some_string) 
{456: True, 123: False, 789: False} 
1

唯一安全辦法做到這一點是ast.literal_eval(它是安全的,因爲,不同於內置eval「」「提供的字符串或節點可以僅由以下Python文字結構:字符串,數字,元組,列表,字典,布爾值和無。「」