我一直在努力构建一个可以返回字典的复杂数据结构。当前该类返回形式的字符串对象
{ cset : x, b1 : y, b2 : z, dep : { cset : x1, b1 : y1, b2 : z1, dep : { cset : x2, b1 : y2, b2 : z2, dep : <same as above.it recurses few more levels> ... } } }
我想将整个字符串对象转换成字典。我读了一篇有关使用pickle模块的文章,但是我不想将其序列化为某个文件并使用它。
pickle
参考:http : //bytes.com/topic/python/answers/36059-convert- dictionary-string-vice- versa
如果可能的话,我正在寻找其他更整洁的方式。
很高兴知道任何这样的方式。
不要使用eval。如果您确定该字符串将始终包含有效的Python dict,请使用ast.literal_eval。这工作很像eval,但如果表达式是有效的,只计算dict,list等,如果不是抛出一个例外。这比尝试在运行时评估可能包含任意代码的字符串安全得多。
eval
dict
ast.literal_eval
list
从文档:
安全地评估表达式节点或包含Python表达式的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串,数字,元组,列表,字典,布尔值和无。 这可用于安全地评估包含来自不受信任来源的Python表达式的字符串,而无需自己解析值。
安全地评估表达式节点或包含Python表达式的字符串。提供的字符串或节点只能由以下Python文字结构组成:字符串,数字,元组,列表,字典,布尔值和无。
这可用于安全地评估包含来自不受信任来源的Python表达式的字符串,而无需自己解析值。
代码示例:
>>> import ast >>> ast.literal_eval("1+1") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.6/ast.py", line 68, in literal_eval return _convert(node_or_string) File "/usr/lib/python2.6/ast.py", line 67, in _convert raise ValueError('malformed string') ValueError: malformed string >>> ast.literal_eval("\"1+1\"") '1+1' >>> ast.literal_eval("{'a': 2, 'b': 3, 3:'xyz'}") {'a': 2, 3: 'xyz', 'b': 3}