class AstGraphGenerator(object):
def __init__(self):
self.graph = defaultdict(lambda: [])
def __str__(self):
return str(self.graph)
def visit(self, node):
"""Visit a node."""
method = 'visit_' + node.__class__.__name__
visitor = getattr(self, method, self.generic_visit)
return visitor(node)
def generic_visit(self, node):
"""Called if no explicit visitor function exists for a node."""
for _, value in ast.iter_fields(node):
if isinstance(value, list):
for item in value:
if isinstance(item, ast.AST):
self.visit(item)
elif isinstance(value, ast.AST):
self.graph[type(node)].append(type(value))
self.visit(value)
如果你看看ast.NodeVisitor公司,这是一个相当简单的类。您可以将其子类化,也可以根据需要重新实现其行走策略。例如,在访问节点时保持对父节点的引用非常简单,只需添加一个
visit
方法,该方法也接受父节点作为参数,并从您自己的generic_visit
传递该方法。在顺便说一下,
NodeVisitor.generic_visit
似乎实现了DFS,所以您所要做的就是添加父节点传递。在太棒了,真的很简单
所以它和普通的NodeVisitor是一样的,但是我有一个defaultdict,我在其中为每个子节点添加了节点的类型。 然后我把这本字典递给pygraphviz.AGraph公司我得到了很好的结果。在
唯一的问题是这个类型不怎么说,但是另一方面使用ast.转储()太冗长了。在
最好的办法是获得每个节点的实际源代码,这可能吗?在
编辑:现在好多了,我把源代码也传给构造函数,如果可能的话,我会尽量得到代码行,否则只打印出类型。在
^{pr2}$相关问题 更多 >
编程相关推荐