如何获取python ast节点的值?

如何获取python ast节点的值?,python,compiler-construction,abstract-syntax-tree,Python,Compiler Construction,Abstract Syntax Tree,我正试图用python编写一个程序,对python代码进行注释。例如,对于以下输入: foo = 5 for i in range(foo): print "foobar" 我希望输出是这样的 分配5到foo 编写一个重复5次的for循环 在每次迭代中,将“foobar”打印到屏幕上 目前,我正在使用ast模块获取输入代码的语法树,而不是从头开始编写编译器。但我真的不知道如何计算ast节点以获得值。更具体地说,我的解析器如何计算出range(foo)正在进行5次迭代?那么您实际尝试了什

我正试图用python编写一个程序,对python代码进行注释。例如,对于以下输入:

foo = 5
for i in range(foo):
    print "foobar"
我希望输出是这样的

  • 分配5到foo
  • 编写一个重复5次的for循环
  • 在每次迭代中,将“foobar”打印到屏幕上

  • 目前,我正在使用
    ast
    模块获取输入代码的语法树,而不是从头开始编写编译器。但我真的不知道如何计算ast节点以获得值。更具体地说,我的解析器如何计算出
    range(foo)
    正在进行5次迭代?

    那么您实际尝试了什么呢?您是否尝试查看树中的节点?这些信息通常不是AST的一部分,因为AST只解析代码,而不执行代码。如果您执行了
    foo=random.randint(1100)
    ,那么AST显示循环运行“多少次”意味着什么?在您的情况下,您可以通过在AST中查找具有相同名称的变量来手动将其链接起来,但通常无法在AST中获取变量的值;您只能获取文本的值。@BrenBarn所以“重复5次”直到运行时才会确定?隐马尔可夫模型。。。是否有一种快速/简单的方法来逐行运行已解析的AST并维护符号表中的所有变量?(如果我们不一定污染全局名称空间,那就更好了)@wlnirvana:没有某种全局环境,你就无法真正运行代码。(例如,代码可能需要导入模块。)您可以使用调试器类型工具逐行遍历代码。但总的来说,我不确定你到底想要什么。基本上,如果不实际运行代码,您无法确切地知道代码将做什么。如果你想做一些启发性的工作来处理像你的例子这样的简单案例,你也许可以这样做,但是你必须根据AST进行大量的猜测,而不仅仅是按原样使用AST。