こんにちは、吉政創成 菱沼です。
今回もPythonエンジニア育成推進協会のPython 3 エンジニア認定実践試験の主教材「Python実践レシピ/技術評論社」を使って学習中です。
前回PEP8の命名規則に関するルールを学びました。
今回は2.2に入って静的コード解析ツールFlake8(P.25)について学んでいきます。
Flake8とは何者か
さて、2章に入ってからPythonのコーディング規約であるPEP8の内、コードのレイアウトに関するルール、コメントに関するルール、命名規約に関するルールを学びました。
今回学習する静的コード解析ツールFlake8は、ソースコードの中を解析するもので、PEP8に準拠しているか、不具合の元になるところがないかを確認してくれるツールです。
このFlake8には既存のツールを3つまとめたものなんだそうです。含まれているのはこちら。
引用:Flake8に含まれている静的コード解析ツール
名称 | 観点 | URL |
pycodestyle | PEP8に準拠しているかチェック | https://pycodestyle.pycqa.org/ |
Pyflakes | 不具合の元になりそうな箇所はないかチェック | https://github.com/PyCQA/pyflakes |
McCabe | コードの複雑さをチェック | https://github.com/PyCQA/mccabe |
Flake8をインストールしてみる
では早速Flake8をインストールしてみます。
なお私はWindows内にvenvで作った仮想環境内にインストールします。
<インストールのコマンド>
pip install flake8 |
上記を実行すると次のコマンドが実行できるようになります。Flake8のバージョンを確認するものです。
flake8 –version |
実行結果はこちら。
7.1.2 (mccabe: 0.7.0, pycodestyle: 2.12.1, pyflakes: 3.2.0) CPython 3.11.6 on Windows |
おお。上で出した表に書かれているツールの名前が出てますね。それぞれのバージョンもわかるようになっているようです。ちなみにこうした既存のツール(コード)を集めてひとつの機能にしたものをラッパーというらしいです。
テキストでは紹介されていません(試験範囲ではない)が、Flake8はVSCodeで拡張機能としても使えるそうです。そちらでも使いたいという方は以下の記事をご参考にどうぞ。
【入門】Visual Studio CodeにBlackとFlake8をインストールする方法|Flake8のインストール方法
Flake8で静的コードチェックをしてみる
入れたとあれば実際にどんなメッセージが出てくるか確認せねばなりません。
まずは短いコード[print(1,2)]を書いたファイルを作ります。テキストではもうちょっと長い名前ですがちょっと面倒なので変えてます(test202502.py)。
コマンドは[flake8 (ファイル名)]ということなので、次のように書きます。
flake8 test202502.py |
実行結果は次の順番で表示されるそうです。
「ファイル名:行番号:行内の位置:エラーコード エラー詳細」
実際の実行結果がこちらです。
test202502.py:1:8: E231 missing whitespace after ‘,’ |
test202502.pyの1行目の8文字目の「,」の後ろにスペースがないよ、と。確かにチェックされてます。
普通のエラーメッセージよりわかりやすい…。
次に正常に実行できるものの…というファイルを用意します。次のコードもテキストからの引用です。
(test202502-2.py)
import os, sys, io def greeting_path(msg,name ): print(sys.argv) path = os.get_exec_path() print(f”{msg}, {name}”) |
これを実行すると、
test202502-2.py:1:1: F401 ‘io’ imported but unused test202502-2.py:1:10: E401 multiple imports on one line test202502-2.py:3:1: E302 expected 2 blank lines, found 1 test202502-2.py:3:22: E231 missing whitespace after ‘,’ test202502-2.py:3:27: E202 whitespace before ‘)’ test202502-2.py:5:5: F841 local variable ‘path’ is assigned to but never used |
という結果が出ます。
それぞれの結果の意味はこちら。上から順番です。
エラーコード | 問題点 |
F401 | importしたのに使ってないモジュールがある |
E401 | 1つの行で複数のimportをしている |
E302 | 空行が2行ない |
E231 | カンマの後に空白がない |
E202 | 丸括弧の前に空白がある |
F841 | 利用してない変数がある |
ところでエラーコードの頭文字何かしらと思えば、エラーが発生したツールの頭文字だそうです。
E/Wはpycodestyle、FはPyflakes、CはMcCabeとのこと。上ではEとFだけ出ているので、pycodestyleとPyflakesで確認されたということですね。
指摘された箇所を修正すると、エラー表示はなくなって空白が表示されます。
<修正版>
import os import sys def greeting_path(msg, name): print(sys.argv) path = os.get_exec_path() print(f”{msg}, {name}, {path}”) |
Flake8で問題のないコードに
PEP8に準拠しているかの確認もそうですが、何より不具合の元になる/不具合が出た場所を見つけることも、とても大変な作業なので、解析ツールが素敵すぎるという印象でした。
最後にP.27 からちょっとだけ引用します。
—————————
なぜFlake8で静的コード解析をするのか
Flake8を利用することで、PEP8の準拠だけでなくコードの不備、複雑度もチェックできます。検出された問題点を解決することでバグの発生を未然に防ぎ、読みやすいコードになります。
—————————
自分も含め、誰もが読みやすいコードにするために大切なツールですね。
それではきりが良いので、今回はこちらで終了です。お付き合いいただきありがとうございました。
お時間がある方は、ぜひ無料のPEP試験も受験してみてくださいね。
https://pythonzen-pep8-exam.jp
実践試験について知りたい方は以下をご覧ください。
●Python3エンジニア認定実践試験
https://www.pythonic-exam.com/exam/jissen