Python ast到点图

2024-09-30 20:36:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在分析python代码生成的AST,目的是为了“有趣和利润”,我希望有一些比ast.转储“来实际查看生成的AST。在

理论上已经是一棵树了,所以创建一个图应该不会太难,但是我不明白我怎么能做到。在

在步行街似乎走在一个BFS策略,和visitX方法我真的看不见父或我似乎找不到一个方法来创建一个图形。。。在

似乎唯一的方法就是编写自己的DFS walk函数,它有意义吗?在


Tags: 方法函数目的图形理论ast策略代码生成
2条回答

如果你看看ast.NodeVisitor公司,这是一个相当简单的类。您可以将其子类化,也可以根据需要重新实现其行走策略。例如,在访问节点时保持对父节点的引用非常简单,只需添加一个visit方法,该方法也接受父节点作为参数,并从您自己的generic_visit传递该方法。在

顺便说一下,NodeVisitor.generic_visit似乎实现了DFS,所以您所要做的就是添加父节点传递。在

太棒了,真的很简单

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)

所以它和普通的NodeVisitor是一样的,但是我有一个defaultdict,我在其中为每个子节点添加了节点的类型。 然后我把这本字典递给pygraphviz.AGraph公司我得到了很好的结果。在

唯一的问题是这个类型不怎么说,但是另一方面使用ast.转储()太冗长了。在

最好的办法是获得每个节点的实际源代码,这可能吗?在

编辑:现在好多了,我把源代码也传给构造函数,如果可能的话,我会尽量得到代码行,否则只打印出类型。在

^{pr2}$

相关问题 更多 >