如何将 _ast.Dict 转换为实际的 dict?
我有一个叫做 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"))