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

时间:2016-01-26 19:53:29

标签: python visitor

我使用ast python库并希望遍历我的ast节点。

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

当然,我可以添加generic_visit方法,然后检查这里的所有条件,但这看起来像是使用模式的错误方法。

在没有大量代码重复的情况下,还有其他任何方法可以实现这个想法吗?

1 个答案:

答案 0 :(得分:0)

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

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__()})

当然,您可以继续为您需要处理的任何节点类型执行此操作。 。