我有一个返回类型'_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()
答案 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}