如何从AST获取继承树?

时间:2013-10-04 06:25:08

标签: python abstract-syntax-tree

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

我为visit_ClassDef(self, node)定义了ast.NodeVisitor函数,并遍历node.bases

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

1 个答案:

答案 0 :(得分: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']

这是test.py

class Bar(Foo,Baz):
    pass

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

class Bar(FooFactory(),BazFactory()): pass

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