为什么 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 节点,不适用于字典。
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
是字典的字符串表示,因此它按预期工作。
我的问题是为什么以有效方式创建的字典“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 节点,不适用于字典。
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
是字典的字符串表示,因此它按预期工作。