Python ast(gast)模块同一对象的多个副本

2024-10-02 02:41:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我通过gast.parse传递了以下代码,并尝试查看不同的名称对象

def foo(n:int)->int:
  if n > 0:
    return 1
  elif n < 0:
    return -1
  else:
    return 0

这是我得到的输出

function arg: <gast.gast.Name object at 0x7f84c085b3c8> , name= n
compare sees: <gast.gast.Name object at 0x7f84c085b550> , name= n
compare sees: <gast.gast.Name object at 0x7f84c085b780> , name= n

我有没有办法让它使用符号表,给我相同的符号相同的对象? (不仅针对名称对象,还针对其他对象)

编辑:使用gast(非ast)。但对于ast,也观察到类似的行为(每次使用都是一个新对象)。生成此文件的完整代码:

import gast as ast
code = '''
def foo(n:int)->int:
  if n > 0:
    return 1
  elif n < 0:
    return -1
  else:
    return 0
'''
module = ast.parse(code)

class Visitor(ast.NodeVisitor):
  def visit_FunctionDef(self, node):
    print("function arg:", node.args.args[0], ", name=", node.args.args[0].id)
    for stmt in node.body:
      self.visit(stmt)
  def visit_Compare(self, node):
    print("compare sees:", node.left, ", name=", node.left.id)

Visitor().visit(module)

Tags: 对象namenodereturnobjectdefargsvisit

热门问题