将AST节点转换为Python对象

7

给定一个可以自己评估但不足以作为字面值的 ast 节点,例如列表推导式,不能使用 ast.literal_eval 进行评估。

src = '[i**2 for i in range(10)]'
a = ast.parse(src)

现在 a.body[0] 是一个 ast.Expr 对象,a.body[0].value 则是一个 ast.ListComp 对象。我想要获取 eval(src) 执行后的列表,但只有 ast.Expr 节点。
1个回答

6
也许您寻找的是compile()函数?在AST对象上调用compile()的结果是一个代码对象,可以传递给eval()函数。
>>> src = '[i**2 for i in range(10)]'
>>> b = ast.parse(src, mode='eval')
>>> eval(compile(b, '', 'eval'))
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

我尝试过,但好像没能让它工作。例如,compile(a.body[0],'','eval') 出现了错误 expected Expression node, got Expr。(Expr 不仅仅是 Expression 的缩写吗?) - Kyss Tao
不要使用 a.body[0],直接传递 a 就可以了。在 Python 的 语法规则 中,Expr 是指 Expression 的主体内容。 - Amber
1
尝试使用ast.parse(src, mode='eval')来获取一个Expression对象。 - Amber
关于您的编辑:如果我将模式更改为“eval”,则会在我的代码其他地方出现问题。 - Kyss Tao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接