圈复杂度和radon库(2):radon库的命令及其作用

目录

 一. 安装radon库

二. radon库的四大命令

三. 圈复杂度分析命令

1. cc命令的说明

2. cc命令的可选项 

3. 相关示例

四. 可维护性指数分析命令

1. mi命令的说明

2. mi命令的可选项

3. 相关示例

五. 原始数据分析命令

1. raw命令的说明

 2. raw命令的可选项

3. 相关示例

六. *霍尔斯特德指标简介

七. 总结


我打算介绍Python的radon库,这是一个系列。这篇文章是第二篇,目的是说一说radon库在命令行使用时,可用的命令有哪些。

前面已经完成的内容有:

  • (1):谈一谈圈复杂度的概念,计算方式;简单介绍radon库的作用

后面的任务还有:

  • (3):介绍在命令行和程序中使用radon库的方法
  • (4):提供一个利用radon分析Python文件并生成报告的小工具

我们现在就开始吧(´・ω・)つt[ ]

radon库教程(1)https://blog.csdn.net/2402_85728830/article/details/148185974

 一. 安装radon库

要安装radon库,可以先按下Win + R,然后输入cmd召唤命令提示符。在其中运行下面的指令:

python -m pip install --user radon

就可以下载radon库了。如果你发现速度太慢或者下载老是失败,可以考虑将下载源更改为国内的镜像网站(如清华大学源):

python -m pip install --user radon -i https://pypi.tuna.tsinghua.edu.cn/simple

如果还有其他问题,推荐复制报错信息去网上搜索解决方案,互联网上到处都是高人呀(* ̄▽ ̄)~*

二. radon库的四大命令

我们前面提到过,radon可以分析圈复杂度,可维护性指数,原始数据和霍尔斯特德指标,它们分别对应命令行里这样的四条命令:

  • python -m radon cc [一系列可选项……] (文件或目录)
  • python -m radon mi [一系列可选项……] (文件或目录)
  • python -m radon raw [一系列可选项……] (文件或目录)
  • python -m radon hal [一系列可选项……] (文件或目录)

本文的任务是说明最上面的三条命令中的“一系列可选项”都有哪些,至于运行这些命令以及分析输出的做法,我将放在第三篇介绍。 有关霍尔斯特德指标的命令我将不介绍,请见谅!如有需要可以去radon官方文档查阅相关内容。

三. 圈复杂度分析命令

下面,我们来总结一下“cc”命令后面跟着的选项。圈复杂度的知识在第一篇有介绍,这里不再赘述。下面的内容基本上就是翻译和整理文档中有关cc命令的说明:

1. cc命令的说明

cc命令用于分析Python源代码文件并计算其圈复杂度。输出可以通过指定 -n 和 -x 标志进行过滤。默认情况下,复杂度分数不会显示,使用 -s(显示复杂度)选项可以切换此行为。支持通过通配符模式排除文件或目录。所有位置参数均被解释为路径,程序会遍历子路径并分析 Python 文件。

每个代码块会根据复杂度评分被分为 A(最佳)到 F(最差)的等级,并对应以下风险评估:

圈复杂度指标
圈复杂度评分圈复杂度等级说明
[1,5]A简单的代码块
[6,10]B结构良好且稳定的代码块
[11,20]C轻度复杂,阻滞的代码块
[21,30]D中等复杂度的代码块
[31,40]E复杂代码块
[41,+\infty)F易出错且不稳定的代码块

代码块还分为三类:函数(Function)、方法(Method)和类(Class)。在输出中,它们会以字母标识(F、M、C),方便快速浏览长列表:

代码块的标识
代码块种类标识
函数F
方法M
C

2. cc命令的可选项 

下面是可选项,我会重点标出比较有用的选项,分别使用红色蓝色,请至少掌握红色的命令:

  • -x, --max

设置显示的最高复杂度等级,默认为 F。

也可通过配置文件设置属性 cc_max。

  • -n, --min

设置显示的最低复杂度等级,默认为 A。

也可通过配置文件设置属性 cc_min。

  • -a, --average

如果指定,则在分析结束时显示平均圈复杂度。此选项受 -x 和 -n 影响

也可通过配置文件设置属性 average。

  • --total-average

类似于 -a,但不受 min 和 max 限制。所有分析的代码块都会被统计,无论是否显示。

也可通过配置文件设置属性 total_average。

  • -s, --show-complexity

如果指定,显示复杂度分数及其等级。我个人很推荐始终使用这个选项!

也可通过配置文件设置属性 show_complexity。

  • -e, --exclude

排除路径匹配通配符模式的文件。通常需要在命令行中使用引号包裹模式。

也可通过配置文件设置属性 exclude。

  • -i, --ignore

忽略名称匹配通配符模式的目录(默认忽略以 . 开头的隐藏目录)。

也可通过配置文件设置属性 ignore。

  • -o, --order

输出结果的排序方式,可选值为:
SCORE: 按圈复杂度降序排列;(默认)
LINES: 按行号排序;
ALPHA: 按代码块名称(字母顺序)排序。
也可通过配置文件设置属性 order。

  • -j, --json

如果指定,结果将以 JSON 格式输出,适用于导出到其他应用程序。

也可通过配置文件设置属性 json。

  • --xml

如果指定,结果将以 XML 格式输出(部分信息会被省略)。此功能专为 Jenkins 插件 CCM 设计。

也可通过配置文件设置属性 xml。

  • --no-assert

计算复杂度时不计入 assert 语句(因为 Python 可运行优化模式移除 assert)。

也可通过配置文件设置属性 no_assert。

  • --include-ipynb

将 IPython 笔记本中的 Python 单元格加入到报告中。

也可通过配置文件设置属性 include_ipynb。

  • --ipynb-cells

对 .ipynb 文件中的每个单元格单独报告。

也可通过配置文件设置属性 ipynb_cells。

  • -O, --output-file

将输出保存到指定文件。注意:可以和-j,--xml一起使用

也可通过配置文件设置属性 output_file。

3. 相关示例

基本分析:

python -m radon cc path

radon 会遍历 path 的子目录,并分析所有 Python 文件。

python -m radon cc my_file.py

分析单个Python文件。 

排除特定路径:

python -m radon cc -e "path/tests*,path/docs/*" path

排除路径匹配 path/tests* 和 path/docs/* 的文件。

限制显示范围:

python -m radon cc --min B --max E path

仅显示 path 子目录的文件里,复杂度等级在 B(6)到 E(40)之间的代码块。

四. 可维护性指数分析命令

可维护性指数(Maintainability Index)是衡量代码可维护性的软件标准,它的计算方法还是挺复杂的,我就不翻译了。后面会给出一个表格,帮你根据输出结果判断代码处于什么水平。

有意思的是,radon文档指出“Maintainability Index is still a very experimental metric, and should not be taken into account as seriously as the other metrics.” ,说可维护性指数是一个实验性的指标,不应像其它内容那样被非常认真地对待。

1. mi命令的说明

该命令用于分析 Python 源代码文件并计算其 可维护性指数(Maintainability Index, MI)。每个位置参数均被视为起始点,radon 会从该点递归搜索所有 Python 文件(类似 cc 命令)。可通过 -e 选项排除特定路径。可维护性指数的范围始终在[0, 100]之间,具体如下:

可维护性指数指标
MI分数等级可维护性
[20, 100]A非常高
[10, 19]B中等
[0, 9]C极低

2. mi命令的可选项

  • -x, --max

设置显示的最高 MI 等级。接受字母 A-F,默认为 C。
可通过配置文件的 mi_max 属性设置。

  • -n, --min

设置显示的最低 MI 等级。接受字母 A-F,默认为 A。
可通过配置文件的 mi_min 属性设置。

  • -e, --exclude

排除路径匹配通配符模式的文件。通常需要在命令行中用引号包裹模式。
可通过配置文件的 exclude 属性设置。

  • -i, --ignore

忽略名称匹配通配符模式的目录(radon 不会进入这些目录)。默认忽略以 . 开头的隐藏目录。
可通过配置文件的 ignore 属性设置。

  • -m, --multi

如果指定,radon 不会将多行字符串视为注释。此行为通常安全(因为多行字符串常用于函数文档字符串),但需注意多行字符串的用途不限于此,有时将其视为注释是错误的。
可通过配置文件的 multi 属性设置。

  • -s, --show

如果指定,结果中会显示实际的 MI 值及其等级。我个人非常推荐始终使用此选项!
可通过配置文件的 show_mi 属性设置。

  • -j, --json

以 JSON 格式输出结果。
无直接配置项,仅通过命令行指定。

  • --include-ipynb

包含 IPython 笔记本中的 Python 单元格到报告中。
可通过配置文件的 include_ipynb 属性设置。

  • --ipynb-cells

对 .ipynb 文件中的每个单元格单独报告。
可通过配置文件的 ipynb_cells 属性设置。

  • -O, --output-file

将输出保存到指定文件。
可通过配置文件的 output_file 属性设置。

3. 相关示例

基本分析:

python -m radon mi path1 path2

radon 会递归分析 path1 和 path2 下的所有 Python 文件。

python -m radon mi my_file.py

分析单个Python模块。 

排除特定路径:

python -m radon mi path1 -e "path1/tests/*"

排除所有匹配 path1/tests/* 的文件。

不将多行字符串视为注释:

python -m radon mi -m path1

与之前的例子类似,但不会将多行字符串视为注释。 

五. 原始数据分析命令

1. raw命令的说明

raw命令用于分析 Python 模块并计算原始代码度量指标。这些指标包括:

  • LOC:总代码行数(不必然等于文件中的实际行数)。
  • LLOC:逻辑代码行数(每行逻辑代码对应一个语句)。
  • SLOC:源代码行数(不必然等于 LLOC),也可以翻译成“物理代码行数”。
  • Comments:注释行数(仅统计单行注释 #,多行字符串不计入注释)。
  • Multi:多行字符串注释的行数。
  • Blanks:空白行数(或仅包含空格的行)。 

文档中还给出了下面的公式:

SLOC + Multi + Single comments + Blanks = LOC

此外,还会计算以下比率:

  • C % L:注释行数占总代码行数(LOC)的百分比。
  • C % S:注释行数占源代码行数(SLOC)的百分比。
  • C + M % L:注释行数与多行字符串行数占总代码行数(LOC)的百分比。

据我所知,这三个比例分别推荐在 20%,20%,25%以上;这时说明注释没偷懒,且文档化得不错。

 2. raw命令的可选项

  • -e, --exclude

排除路径匹配通配符模式的文件。通常需要在命令行中用引号包裹模式。
可通过配置文件的 exclude 属性设置。

  • -i, --ignore

忽略名称匹配通配符模式的目录(radon 不会进入这些目录)。默认忽略以 . 开头的隐藏目录。
可通过配置文件的 ignore 属性设置。

  • -s,--summary

如果指定,分析结束后会显示所有度量指标的摘要。这个选项不如cc和mi的-s有用。
无直接配置项,仅通过命令行指定。

  • -j, --json

如果指定,结果将以 JSON 格式输出
无直接配置项,仅通过命令行指定。

  • -O, --output-file

将输出保存到指定文件
可通过配置文件的 output_file 属性设置。

  • --include-ipynb

包含 IPython 笔记本中的 Python 单元格到报告中。
可通过配置文件的 include_ipynb 属性设置。

  • --ipynb-cells

对 .ipynb 文件中的每个单元格单独报告。
可通过配置文件的 ipynb_cells 属性设置。

3. 相关示例

基本分析:

python -m radon raw path1 path2

radon 会递归分析 path1 和 path2 下的所有 Python 文件。

python -m radon raw my_file.py

分析单个Python文件。

排除特定路径:

python -m radon raw path1 -e "path1/tests/*"

排除所有匹配 path1/tests/* 的文件。

六. *霍尔斯特德指标简介

本文不介绍有关霍尔斯特德指标的命令,这一部分是为了帮助大家了解这些指标到底是什么东西。评估这些指标需要很多额外知识,我们自己一般是用不到它们的。

霍尔斯特德指标旨在通过源代码的静态分析,识别软件的可量化属性及其相互关系。这些指标基于以下基础参数计算得出:

  • \eta_{1}:为不同运算子的个数
  • \eta_{2}:为不同算子的个数
  • N_{1}:为所有运算子合计出现的次数
  • N_{2}:为所有算子合计出现的次数

上述的运算子包括传统的运算子及保留字,算子包括变数及常数。基于上述参数,可推导出以下关键指标:

  • 程式词汇数:\eta=\eta_{1}+\eta_{2};表示程序中所有唯一运算符和操作数的总数。
  • 程式长度:N=N_{1}+N_{2};表示程序中所有运算符和操作数的总使用次数。
  • 计算程式长度:\hat{N}=\eta_{1}log_{2}\eta_{1}+\eta_{2}log_{2}\eta_{2};用于衡量程序的理论最小长度。
  • 容量:V=N\cdot log_{2}\eta;表示程序的复杂度,值越大,程序越复杂。
  • 难度:D=\frac{\eta_{1}}{2}\cdot \frac{N_{2}}{\eta_{2}};反映程序的实现难度,值越高,程序越难编写。
  • 精力:E=D\cdot V;表示编写程序所需的总工作量(单位:人·秒)。
  • 程式撰写时间:T=\frac{E}{18}秒;估算编写程序所需的时间。
  • 交付错误数量:B=\frac{V}{3000}=\frac{E^{\frac{2}{3}}}{3000};预测程序中可能存在的错误数量。

七. 总结

首先,我们安装了radon库,并了解了它拥有“四大命令”——cc,mi,raw,hal。分别用于分析圈复杂度,可维护性指数,原始数据,和霍尔斯特德指标。 随后,我们更详细地了解了cc,mi,raw这三种命令的用法。最后,霍尔斯特德指标出来客串了一下。

在下一篇文章中,我们将使用这些命令开始分析自己的Python文件,届时我会说明如何分析指令的输出内容。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值