【问题标题】:What is the easiest way to generate a Control Flow-Graph for a method in Python?为 Python 中的方法生成控制流图的最简单方法是什么?
【发布时间】:2011-06-01 16:59:04
【问题描述】:

我正在编写一个尝试比较两种方法的程序。我想为所有匹配的方法生成控制流图(CFG),并使用拓扑排序来比较这两个图。

【问题讨论】:

标签: python methods graph


【解决方案1】:

有一个名为 staticfg 的 Python 包正是这样做的——从一段 Python 代码生成控制流图。

例如,将第一个quick sort Python snippet from Rosseta Code 放入qsort.py,下面的代码会生成它的控制流图。

from staticfg import CFGBuilder

cfg = CFGBuilder().build_from_file('quick sort', 'qsort.py')
cfg.build_visual('qsort', 'png')

请注意,它似乎不理解更高级的控制流,如推导。

【讨论】:

    【解决方案2】:

    RPythonPyPy 背后的翻译工具链,为type inference 提供了一种获取flow graph(在PyPy 项目的pypy/rpython/flowspace 目录中)的方法。

    这在大多数情况下效果很好,但不支持生成器。结果将采用 SSA 形式,这可能是好是坏,这取决于您想要什么。

    【解决方案3】:

    http://pycallgraph.slowchop.com/ 看起来像你需要的。

    Python trace 模块还有--trackcalls 选项,可以作为标准库中调用跟踪机制的入口点。

    【讨论】:

    • 问题询问的是Control Flow Graph,而不是Call Graph
    • 接受。调用图是 CFG 的子集吗?维基百科对彼此之间的关系保持沉默。我认为您可以从过滤后的 CFG 构建 CG。
    • @johntex,关于比较两种方法的问题。你对 using AST hashes 有什么看法?
    猜你喜欢
    • 1970-01-01
    • 2010-09-23
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多