如何从AST获取继承树?

low*_*key 3 python abstract-syntax-tree

我正在使用python的ast模块来显示类继承树.

我为a定义了一个visit_ClassDef(self, node)函数ast.NodeVisitor,并进行迭代node.bases.

但是,我一直无法将基类的名称作为字符串.到目前为止,我已经试过base.valuebase.name,但无济于事.

mgi*_*son 8

可能正在寻找id属性:

>>> import ast
>>> class Visit(ast.NodeVisitor):
...     def visit_ClassDef(self, node):
...         print [n.id for n in node.bases]
... 
>>> text = open('test.py').read()
>>> tree = ast.parse(text)
>>> Visit().visit(tree)
['Foo', 'Baz']
Run Code Online (Sandbox Code Playgroud)

这是test.py:

class Bar(Foo,Baz):
    pass
Run Code Online (Sandbox Code Playgroud)

关于这个的文档非常难以理解,但你可以看到这bases是一个expr对象列表.现在它真的可以是任何表达.你可以在那里进行函数调用:

class Bar(FooFactory(),BazFactory()): pass
Run Code Online (Sandbox Code Playgroud)

这是完全有效的python.但是,典型的情况是你只有标识符(类名),它们只不过是Name表达式.您可以从id属性中获取标识符的"名称"作为字符串.

  • 这只会打印直接基类(不比1级更深); 我怎样才能访问真正的继承树? (3认同)