为什么 ast.literal_eval() 对这两个词典的评价不同?

Why does ast.literal_eval() evaluate these two dictionaries differently?

我的问题是为什么以有效方式创建的字典“a”与字典“b”不同。

在下面的代码中,您会看到一个简单的字典“a”,我想用它来检查

a = ast.literal_eval(a)

奇怪的是,“a”似乎不是字典或任何 python 语法认为有效的东西,因为 ast.literal_eval(a) 引发异常:

a failed: malformed node or string: {':': 5}

字典操作a.keys() returns ':' 符合预期。

更奇怪的是 'transforming' 原始词典与

b = str(a)

字典 b 实际上在第二个 try 语句中被评估为字典。

import ast

a = {}
a[":"] = 5

b = str(a)

print(a)
print(b)

try:
    a = ast.literal_eval(a)
    print(type(a))
except Exception as e:
    print(f'a failed: {e}')

try:
    b = ast.literal_eval(b)
    print(type(b))
except Exception as e:
    print(f'b failed: {e}')

输出:

{':': 5}
{':': 5}
a failed: malformed node or string: {':': 5}
<class 'dict'>

ast.literal_eval 适用于字符串或 AST 节点,不适用于字典。

来自the diocumentation

ast.literal_eval(node_or_string)

Safely evaluate an expression node or a string containing a Python literal or container display.

因此 字典 a 确实是一个“格式错误的节点或字符串”,因为它们都不是。

当您说“字典 b 实际上在第二个 try 语句中被评估为字典”时,这不太正确,因为 b = str(a) 使 b 成为 字符串 。因此,b 是字典的字符串表示,因此它按预期工作。