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 节点类型,您都可以继续这样做。 . .
我正在使用 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 节点类型,您都可以继续这样做。 . .