如何分析Python代码以找出问题区域?


99

我有一个跨多个项目的大型资源库。我想生成一份有关源代码运行状况的报告,以确定需要解决的问题区域。

具体来说,我想找出循环复杂度高的例程,确定重复性,并可能进行一些类似于皮棉的静态分析,以发现可疑的(因而可能是错误的)构造。

我将如何构建这样的报告?

Answers:


36

为了测量圈复杂度,traceback.org提供了一个不错的工具。该页面还很好地概述了如何解释结果。

+1为pylint。它非常适合验证是否遵守编码标准(无论是PEP8还是您自己组织的变体),最终可以帮助降低循环复杂性。


4
traceback.org的链接断开
denfromufa

皮林特很棒,但是很慢。我们将其用作预推送钩子,但将flake8和一堆插件用于常规检查和预提交钩子。https://flakehell.readthedocs.io/config.html不过,我实际上会推荐这些天,因为它的执行模型更加健壮和可配置。
DylanYoung

29

对于圈复杂度,可以使用radonhttps : //github.com/rubik/radon

(使用pip安装它:pip install radon

此外,它还具有以下功能:

  • 原始指标(包括SLOC,注释行,空白行等)
  • Halstead指标(所有指标)
  • 可维护性指数(在Visual Studio中使用的指数)

如何获得Halstead指标?
Dima Tisnek

1
@qarma如果我了解文档,则认为您不能使用命令行。您必须使用Python API。
Dave Halter


11

当您需要了解新项目时,Pycana就像魅力一样工作!

PyCAna(Python代码分析器)是一个简单的python代码分析器的名字,它在执行代码后创建类图。

看看它是如何工作的:http : //pycana.sourceforge.net/

输出:

替代文字




4

有一个名为CloneDigger的工具 ,可以帮助您找到类似的代码片段。


1
它不适用于Python 3,并且从来没有得到很好的维护。
Acumenus

3

为了检查圈复杂度,当然有mccabe包装。

安装:

$ pip install --upgrade mccabe

用法:

$ python -m mccabe --min=6 path/to/myfile.py

请注意上面的阈值6。根据这个答案,分数> 5可能应该简化。

输出示例--min=3

68:1: 'Fetcher.fetch' 3
48:1: 'Fetcher._read_dom_tag' 3
103:1: 'main' 3

也可以通过pylint-mccabepytest-mccabe等使用它。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.