我使用ast
python库并希望遍历我的ast节点。
库中支持访问者模式很好,但如果我使用它,我将不得不实现访问具体类项的方法,例如def visit_Load
。就我而言,具体的课程并不那么重要 - 我想根据给定here的结构知道节点是operator
还是expr
。
当然,我可以添加generic_visit
方法,然后检查这里的所有条件,但这看起来像是使用模式的错误方法。
在没有大量代码重复的情况下,还有其他任何方法可以实现这个想法吗?
答案 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__()})
当然,您可以继续为您需要处理的任何节点类型执行此操作。 。