目录
我打算介绍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(最差)的等级,并对应以下风险评估:
圈复杂度评分 | 圈复杂度等级 | 说明 |
A | 简单的代码块 | |
B | 结构良好且稳定的代码块 | |
C | 轻度复杂,阻滞的代码块 | |
D | 中等复杂度的代码块 | |
E | 复杂代码块 | |
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分数 | 等级 | 可维护性 |
A | 非常高 | |
B | 中等 | |
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/* 的文件。
六. *霍尔斯特德指标简介
本文不介绍有关霍尔斯特德指标的命令,这一部分是为了帮助大家了解这些指标到底是什么东西。评估这些指标需要很多额外知识,我们自己一般是用不到它们的。
霍尔斯特德指标旨在通过源代码的静态分析,识别软件的可量化属性及其相互关系。这些指标基于以下基础参数计算得出:
:为不同运算子的个数
:为不同算子的个数
:为所有运算子合计出现的次数
:为所有算子合计出现的次数
上述的运算子包括传统的运算子及保留字,算子包括变数及常数。基于上述参数,可推导出以下关键指标:
- 程式词汇数:
;表示程序中所有唯一运算符和操作数的总数。
- 程式长度:
;表示程序中所有运算符和操作数的总使用次数。
- 计算程式长度:
;用于衡量程序的理论最小长度。
- 容量:
;表示程序的复杂度,值越大,程序越复杂。
- 难度:
;反映程序的实现难度,值越高,程序越难编写。
- 精力:
;表示编写程序所需的总工作量(单位:人·秒)。
- 程式撰写时间:
秒;估算编写程序所需的时间。
- 交付错误数量:
;预测程序中可能存在的错误数量。
七. 总结
首先,我们安装了radon库,并了解了它拥有“四大命令”——cc,mi,raw,hal。分别用于分析圈复杂度,可维护性指数,原始数据,和霍尔斯特德指标。 随后,我们更详细地了解了cc,mi,raw这三种命令的用法。最后,霍尔斯特德指标出来客串了一下。
在下一篇文章中,我们将使用这些命令开始分析自己的Python文件,届时我会说明如何分析指令的输出内容。