はじめに
なぜないんですか。pythonで、rails statsのようにコードの統計情報を表示したかっただけなんですが。車輪の再発明かもしれません。もし同じようなものがあればコメントから教えてください。使い方は下記だけなので、コピペしたら業務にお戻りください。
$ pip install pycodestats
$ pycodestats . --by-file
File Lines LOC Classes Methods M/C LOC/M
-------------------------------------------------------------------------
src/main.py 120 100 2 10 5 13
src/utils.py 80 50 1 5 5 18
src/models.py 100 80 3 15 5 8
-------------------------------------------------------------------------
SUM: 300 230 6 30 5 11
pycodestatsとは
Pythonプロジェクトのコード統計を出力する方法として、Pythonコード、シェルスクリプト、バッチファイル、または cloc
などのツールを使用するさまざまなアプローチをインターネット上で見つけることができます。しかしいずれの方法でも、コメントや空行、Docstringを除外したり、.pyファイルごとに詳細な統計を出力する要件を満たすものは見つかりませんでした。そこで、これらの要件を満たすpycodestatsが生まれました。
インストール
pycodestats
のインストールは以下のコマンドで行います。
$ pip install pycodestats
コマンド実行
プロジェクトのルートディレクトリで、次のコマンドを実行することで集計できます。
オプションは、ファイル毎の出力を指定する[--by-file]
オプション、出力形式を指定する[--json | --xml]
などがあります。
$ pycodestats <ディレクトリ>
出力内容
各カラムの示す情報は下記の通りです。
-
ディレクトリ/ファイル: ディレクトリまたはファイルの名前。この列は、
--by-file
オプションが使用されている場合は各個別ファイルをリストし、そうでない場合は各ディレクトリをリストします。 - Lines: ファイルまたはディレクトリ内の総行数。内容に関係なく、すべての行が含まれます。
- LOC: コメントやドキュメンテーションストリングを除いたコード行数 (LOC)。
- Classes: ファイルまたはディレクトリ内で定義されているクラスの数。
- Methods: ファイルまたはディレクトリ内で定義されているメソッドの数。
- M/C: クラスあたりのメソッドの平均数。メソッドの数をクラスの数で割って計算します。クラスがない場合、この値は0になります。
- LOC/M: メソッドあたりのコード行数の平均。コード行数をメソッドの数で割って計算します。メソッドがない場合、この値は0になります。
これにより、プロジェクト内の異なるディレクトリ(例えば、ソースコードディレクトリ src
、テストコードディレクトリ tests
、ドキュメントディレクトリ docs
)ごとに統計情報を把握しやすくなります。
参考: 他の計測ツールとの比較
cloc
cloc
は多くのプログラミング言語に対応した人気のコードカウントツールです。以下はその出力例です。
$ cloc gcc-5.2.0/gcc/c
16 text files.
15 unique files.
3 files ignored.
https://github.com/AlDanial/cloc v 1.65 T=0.23 s (57.1 files/s, 188914.0 lines/s)
-------------------------------------------------------------------------------
Language files blank comment code
-------------------------------------------------------------------------------
C 10 4680 6621 30812
C/C++ Header 3 99 286 496
-------------------------------------------------------------------------------
SUM: 13 4779 6907 31308
-------------------------------------------------------------------------------
cloc
はさまざまな言語に対応しており、PythonのDocstringもうまく対処しますが、ファイル毎のコード統計情報の表示が難しいです。
pygount
pygount
は pip
でインストールできるもう一つの計測ツールです。以下はその出力例です。
$ pygount .
┏━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━┳━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━┓
┃ Language ┃ Files ┃ % ┃ Code ┃ % ┃ Comment ┃ % ┃
┡━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━╇━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━┩
│ Python │ 18 │ 47.4 │ 2132 │ 63.6 │ 418 │ 12.5 │
│ TOML │ 2 │ 5.3 │ 1204 │ 82.7 │ 1 │ 0.1 │
│ reStructuredText │ 9 │ 23.7 │ 566 │ 64.8 │ 1 │ 0.1 │
│ Markdown │ 3 │ 7.9 │ 53 │ 49.1 │ 0 │ 0.0 │
│ Batchfile │ 1 │ 2.6 │ 24 │ 68.6 │ 1 │ 2.9 │
│ Text only │ 2 │ 5.3 │ 24 │ 82.8 │ 0 │ 0.0 │
│ Bash │ 2 │ 5.3 │ 12 │ 80.0 │ 3 │ 20.0 │
│ Makefile │ 1 │ 2.6 │ 9 │ 45.0 │ 7 │ 35.0 │
├──────────────────┼───────┼───────┼──────┼──────┼─────────┼──────┤
│ Sum │ 38 │ 100.0 │ 4024 │ 68.4 │ 431 │ 7.3 │
└──────────────────┴───────┴───────┴──────┴──────┴─────────┴──────┘
pygount
はコード行数やコメント行数を表示します。cloc同様Docstringもうまく対処しますが、ファイル毎のコード統計情報の表示が難しいです。