Python 'ast' 具有访问者模式的模块 - 获取节点的组,而不是具体的 class

Python 'ast' module with Visitor pattern - get node's group, not concrete class

我正在使用 ast python 库并想遍历我的 ast 节点。

库中很好地支持访问者模式,但是如果我使用它,我将不得不实现访问具体项目的方法 类,例如def visit_Load。在我的例子中,具体的 类 并不是那么重要——我想根据给定的结构 here 知道节点是 operator 还是 expr

当然,我可以添加 generic_visit 方法,然后在此处检查所有条件,但这似乎是错误的模式使用方式。

有没有其他漂亮的方法来实现这个想法而不需要大量的代码重复?

这可能不太好,但您可以通过内省动态创建所有方法:

def visit_expr(self, node):
    """Do something in here!"""
    self.generic_visit(node)

ExprVisitor = type('ExprVisitor', (ast.NodeVisitor,), {
    'visit_' % cls.__name__: visit_expr for cls in ast.expr.__subclasses__()})

当然,对于需要处理的任何 ast 节点类型,您都可以继续这样做。 . .