Edu*_*eMe 0 python dictionary eval
我听说 ast.literal_eval 比 eval() 安全得多,但是在更改代码时,我收到“格式错误的字符串/节点”错误。
例如:
bar = False
incorrect = {"foo":bar}
correct = {"foo":"bar"}
ast.literal_eval(incorrect)
Run Code Online (Sandbox Code Playgroud)
返回错误但是
ast.literal_eval(correct)
Run Code Online (Sandbox Code Playgroud)
返回预期的 {"foo":"bar"}
为什么第一次评估不返回 {"foo":False}
因为它并不意味着要这样做。从文档中:
安全地评估表达式节点或包含 Python 表达式的 Unicode 或 Latin-1 编码字符串。提供的字符串或节点只能包含以下 Python 文字结构:字符串、数字、元组、列表、字典、布尔值和 None。
ast.literal_eval旨在eval将 python 代码的字符串表示形式转换为...有效的 python 代码。
这是行不通的:
>>> ast.literal_eval({"foo": "bar"})
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/usr/lib/python2.7/ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "/usr/lib/python2.7/ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string <-- Telltale right here.
Run Code Online (Sandbox Code Playgroud)
这是因为您已经拥有一个正在尝试评估的有效 python 结构。
如果您将整个内容加上引号,它将创建一个字典:
>>> ast.literal_eval('{"foo": "bar"}')
{'foo': 'bar'}
Run Code Online (Sandbox Code Playgroud)