如何将 _ast.Dict 转换为实际的 dict?

3 投票
2 回答
1793 浏览
提问于 2025-04-18 04:18

我有一个叫做 ast 的对象,它返回的类型是 '_ast.Dict'。

我该怎么把它转换成一个普通的字典呢?

我之前尝试过的方法都失败了 -

type(item.value) -> <type '_ast.Dict'>

eval(item.value) -> *** TypeError: eval: argument 1 must be string or code object

ast.parse(item.value,mode="eval") -> *** TypeError: expected a readable buffer object

dict(item.value) -> *** TypeError: '_ast.astlist' object is not callable

len(item.value) -> *** TypeError: object of type '_ast.Dict' has no len()

2 个回答

0

试试这个:

my_dict = ast.Dict(keys=('first','second'), values=(1,2))

print type(my_dict)                   #<class '_ast.Dict'>

answer = dict(zip(t.keys,t.values))
print answer                          #{'second': 2, 'first': 1}
1

有两种不错的方法可以把一个 _ast.Dict 转换成普通的 Python 字典。哪种方法更好,可能要看字典里面的内容。

如果你的 ast.Dict 实例里面包含的是普通的 Python 对象(比如列表和字符串),你可以直接用 dict(zip(d.keys, d.values)) 来转换成普通的 dict

但是,如果你的字典里面包含的是其他的 ast 节点,而不是对应的普通对象(比如用 ast.Str 表示字符串,用 ast.Num 表示数字),你可能需要递归地处理所有内容。最好的方法是把你的字典放在一个 ast.Expression 中,然后传给内置的 compile 函数,把它变成一个代码对象。这个代码对象可以再传给 eval 来执行。

在你的例子中,我怀疑 item 已经是一个 ast.Expression 了,所以你可以省略把 ast.Dict 包装成 Expression 的步骤。你可以这样得到一个普通的 dict

dct = eval(compile(item, "<ast expression>", "eval"))

撰写回答