我正在修补Python的ast
(抽象语法树)模块。
使用ast.NodeVisitor
,可以遍历源代码树并显示诸如每个节点名称之类的信息,如下所示:
class MyAST(ast.NodeVisitor):
def visit_ClassDef(self, node):
print(node.col_offset * " " +node.name)
self.generic_visit(node)
def visit_FunctionDef(self, node):
print(node.col_offset * " " + node.name)
self.generic_visit(node)
然后可以在任何这样的代码段上使用它:
tree = ast.parse(open("/path/to/file.py").read())
MyAST().visit(tree)
这将输出类似的内容(例如,在models.py包中的requests上使用):
RequestEncodingMixin
path_url
_encode_params
_encode_files
RequestHooksMixin
register_hook
deregister_hook
Request
__init__
__repr__
prepare
(...)
我想知道给定节点的完整“路径”。在上面的输出示例中,当我在FunctionDef
节点deregister_hook
中时,我想知道其父级为ClassDef
RequestHooksMixin
,这样我就可以输出类似RequestHooksMixin.deregister_hook
。