Posted at

radonを使用したPythonのソースコードのメトリックスの取得

More than 5 years have passed since last update.


概要

RadonはPythonのメトリックスを計測するプログラムである。

https://github.com/rubik/radon

これにより、Pythonのコードの複雑度や行数を取得することができる。

複雑度を計測することで、ソースコードの潜在的リスクを明確にして、リファクタリングやテストをすべき対象を明示できる。


インストール方法

python2.xまたはPython3.xで下記を実行する。

easy_install easy_install radon


使い方


Cyclomatic Complexityの計測

ccコマンドを使用することでCyclomatic Complexityの計測が行える。Cyclomatic Complexityは制御文が多いほど高くなる。

詳細は下記を参考のこと。

https://radon.readthedocs.org/en/latest/intro.html#cyclomatic-complexity

使用例:

radon cc -s ".\*.py"

無題.png

出力内容:

最初の記号はブロックタイプを表す

記号
説明

F
関数

M
メソッド

C
クラス

次の数値は計測対象のブロックの開始行列を表す

行:列

次は関数名などのブロック名を表す。

「-」以降はランクとCyclomatic Complexityの値となる

ランクはCyclomatic Complexityの値によって決まる。

CCの値
ランク
リスク

1 - 5
A
low - 単純なブロック

6 - 10
B
low - よく構造化され、安定したブロック

11 - 20
C
moderate - 少し複雑なブロック

21 - 30
D
more than moderate - より複雑なブロック

31 - 40
E
high - 複雑なブロック、憂慮すべき

41+
F
very high - エラーが発生しやすい、不安定なブロック

オプション:

ccコマンドで使用できるオプションは次の通り

Option
説明

-s, --show
Cyclomatic Complexityを表示する。

-n, --min
表示する最小のランクを設定する。この引数の後に A~Fを指定

-x, --max
表示する最大のランクを設定する。この引数の後に A~Fを指定

-a, --average
Cyclomatic Complexityの平均を最後に表示する。この平均は-nや-xによるフィルタに影響をうける

--total-average
すべてのデータの平均をうける-aと異なり、フィルタの影響を受けない

-e, --exclude
解析の対象から外すファイルのパスをコンマ区切りで指定する

-i, --ignore
無視するディレクトリをコンマ区切りで指定する。無視したディレクトリ以下は検査しない

-o, --order
並び順を指定する.
SCORE 複雑度順
LINES 行数順
ALPHA ブロック名順

-j, --json
結果をJSONで出力する

--no-assert
複雑度を計算する場合にasser()命令はカウントしない


Maintainability Indexの計測

miコマンドを使用することでMaintainability Indexを計測する。MaintainabilityはCyclomatic Complexityと行数から計算され、100を最高に高いほど、保守しやすい。

詳細は以下を参照

https://radon.readthedocs.org/en/latest/intro.html#maintainability-index

使用例:

radon mi -s ".\*.py"

出力内容:

C:\dev\py33>radon mi -s "test.py"

test.py - A (58.76)

ファイル名、ランク、MI scoreを表示する

ランクについては下記の通り

MI score
Rank
Maintainability

100 - 20
A
非常に高い

19 - 10
B
中程度

9 - 0
C
非常に低い

オプション:

miコマンドで使用できるオプションは次の通り

Option
説明

-s, --show
Maintainability Indexを表示する。

-e, --exclude
解析の対象から外すファイルのパスをコンマ区切りで指定する

-i, --ignore
無視するディレクトリをコンマ区切りで指定する。無視したディレクトリ以下は検査しない

-m, --multi
複数行の文字列をコメントとみなして数えない


rawデータの計測

rawコマンドは以下の数値を出力する。

LOC :総行数

LLOC :Logical LOC。空行とかコメント行を除いたもの

SLOC :Source LOC .空行を除いたもの。

comments :コメント行

multi :複数行の文字列。コメントとみなされることがある

blank : 空行

オプション:

rawコマンドで使用できるオプションは次の通り

Option
説明

-s, --summary
計測した集計結果を表示する

-e, --exclude
解析の対象から外すファイルのパスをコンマ区切りで指定する

-i, --ignore
無視するディレクトリをコンマ区切りで指定する。無視したディレクトリ以下は検査しない

-j, --json
結果をJSONで出力する


プログラムからの利用

radonモジュールをpythonのコードにimportすることでpython上からradonが利用できる。

例:

import radon

from radon import raw
ret = radon.raw.analyze("""
if a==1:
print (a)
if a==2:
print (a)
"""
)
print(ret)

詳細についてはhelpで調べるか下記参照

https://radon.readthedocs.org/en/latest/api.html