2010-09-17 63 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文字结构:字符串,数字,元组,列表,字典,布尔值和无。“”