如何使用ast(抽象语法树)模块获取到节点的完整“路径”?

时间:2019-05-27 09:53:42

标签: python abstract-syntax-tree

我正在修补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

0 个答案:

没有答案