我如何从_ast.Dict转到实际的字典?

时间:2014-04-25 22:33:42

标签: python parsing dictionary compiler-construction abstract-syntax-tree

我有一个返回类型'_ast.Dict'的ast对象

我如何将其转换为常规字典?

我失败的尝试 -

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 :(得分:1)

_ast.Dict获取常规Python字典有两种不错的方法。哪个更好可能取决于字典的内容。

如果您的ast.Dict实例包含常规Python对象(例如列表和字符串),则可以使用dict将其直接转换为常规dict(zip(d.keys, d.values))

但是,如果您的词典包含其他ast个节点而不是相应的常规对象(例如,ast.Str表示字符串而ast.Num表示数字),您可能希望以递归方式评估所有内容。我看到这样做的最好方法是将字典包装在ast.Expression中,然后将其传递给内置的compile函数,将其转换为代码对象。然后可以将代码对象传递给eval

在您的示例中,我怀疑item已经是ast.Expression,因此您可以跳过将ast.Dict打包到Expression的步骤。您可以通过以下方式获得常规dict

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

答案 1 :(得分: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}