为什么 ast.literal_eval() 似乎忽略声明的变量?

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}

msv*_*kon 5

因为它并不意味着要这样做。从文档中:

安全地评估表达式节点或包含 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)