初めてのPython実践試験学習 第十回「Flake8にオプションを追加してみよう」

こんにちは、吉政創成 菱沼です。

今回もPythonエンジニア育成推進協会のPython 3 エンジニア認定実践試験の主教材「Python実践レシピ/技術評論社」を使って学習中です。

前回、静的コード解析ツールFlake8(P.25)の基本的な部分について学びました。

今回はFlake8で使えるオプションについて学びたいと思います。

 

Pythonで書いたコードの問題点を教えてくれるFlake8。

PEP8の準拠やコードの不備などをチェックしてくれるわけですが、オプションを設定することで、チェックする内容をカスタマイズすることができるそうです。

設定する方法は、コマンドラインでパラメータを渡す方法と、設定ファイルに定義する方法があるとのこと。テキストでは主要なオプションの内、4つ確認するようです。

Flake8で利用できるオプションの一覧は以下からご確認いただけます。

https://flake8.pycqa.org/en/latest/user/options.html

—————————

P.28

表:Flake8の主要なオプション

オプション概要
ignore特定のエラーを無視する
excludeチェックの対象からディレクトリやファイルを除外する
max-line-length1行の最大文字数を変更する
max-complexity複雑度を設定しチェックする

—————————

コマンドラインでオプションを指定してみよう

Flake8を動かす場合、[flake8 (ファイル名)]をコマンドラインに入力しますが、オプションをつける場合には[flake8  –オプション名 (ファイル名)]と入力します。

では順番に確認をしていきます。

特定のエラーを無視する[ignore]

書式としては[flake8  –ignore=(無視したいエラーコード) file.py]です。

無視したいエラーコードは以下のページにある一覧からどうぞ。

Flake8:https://flake8.pycqa.org/en/latest/user/error-codes.html

pycodestyle:https://pycodestyle.pycqa.org/en/latest/intro.html#error-codes

この中から除外したいエラーコードを見つけて以下のように記述します。

—————————

P.28

複数のエラーコードを無視する場合は、カンマ区切りで指定します。前方一致するエラーコードを無視するため、例えばWを指定すると、Wで始まるすべてのエラーコードが検出されなくなります。

flake8 –ignore=E203, E501, W503

—————————

ではここで、実際に使ってみたのがこちら。前回のコラムで使用したエラーがたくさん出るファイルでチェックしてみます。

確かに指定したエラーコードの分が表示されなくなりました。

次に、あまり使わない方が良い手段だそうですが、使い方としてはこういった方法もあるそうです。

—————————

P.28

また、ソースコードのインラインコメントに「# noqa: エラーコード」と書くと、コメントを書いた行でそのエラーコードが検出されなくなります。根本の問題解決にはならないため、頻繁に使うべきではありませんが、覚えておくとよいでしょう。次のような書き方をします。

noqa_sample = x: 2 + x  #noqa: E731

—————————

試しにやってみたのがこちら。

importのところで出るはずだったF401のエラーコードが表示されないようにしました。

確かに検出されなくなりました。

チェックの対象から除外する[exclude]

では次にチェックの対象から除外する方法です。

書式は[flake8 –excluede=(ファイル名、ディレクトリ名)]だそうです。

—————————

P.28

excludeオプションは、チェックから除外するファイル名やディレクトリ名のパターンをカンマ区切りで指定します。

flake8 –exclude=.env,doc/_build

なお、デフォルトでは次のファイル、ディレクトリが除外されます。

デフォルトで除外されるファイル

.svn, CVS, .bzr, .hg, .git, __pycache__, .tox, .eggs, *.egg

—————————

実行してみたのがこちら。

問題なくチェックできました。

1行の最大文字数を変更する[max-line-length]

では次に、1行の長さを設定するものです。

—————————

P.29

max-line-lengthオプションは、任意の最大文字数を指定します。デフォルトはPEP8で定義されている79文字ですが、この値を変更したい場合に指定します。

flake8 — max-line-length=88

—————————

そんな1行が長いサンプルなんてすぐに見つからないので、40文字で設定してみました。

その結果がこちら。

40文字より多い行で、何文字なのかも一緒に教えてくれるようです。便利。

許容される複雑度を設定する[max-complexity]

では次に複雑度を設定するためのオプションです。

—————————

P.29

max-complexityオプションは、Flake8に含まれているツール、McCabeを有効にするオプションです。McCabeはデフォルトで無効になっていますが、このオプションを設定することで有効になりまっす。

McCabeは循環的複雑度というソフトウェア測定法によって、複雑度をチェックします。分岐やループがあればあるほど、複雑度が高くなります。max-complexityオプションでは、許容される最大複雑度を数値で指定できます。一般的には循環的複雑度が10を超える場合は複雑すぎるとされています。

flake8 –max-complexity=10

—————————

McCabeを使うと、コードの複雑具合をチェックしてくれるそうで、保守性が悪くないかとかのチェックに使うと便利な模様。

チェックするほどのコード…が思い当たらなかったので、以前学習した際に利用したサンプルコードで試してみたのですが、やはり複雑だよというような文言が見当たらなかったので、実際にどんなものが表示されるのかを探してみました。以下のURLをご参照ください。

https://flake8.pycqa.org/en/2.5.5

このページで、max-complexityをページ内検索したところに書かれています。多分こういった文言が表示されます。

coolproject/mod.py:939:1: C901 ‘Checker.check_all’ is too complex (12)

設定ファイルにオプションを定義する

ここまで確認してきたオプションを設定ファイルとしておくこともできるそうです。

—————————

P.29

設定ファイルの記述例は以下のようになります。

[flake8] ignore = E203, E501, W503 exclude = .venv, doc/_build max-line-length = 88 max-complexity =10

設定ファイルとコマンドラインオプションの両方が指定された場合、コマンドラインオプションが優先されます。

設定ファイルは次の場所に配置することで有効になります。

プロジェクトディレクトリ直下にいずれかのファイルを配置

・setup.cfg

・tox.ini

・.flake8

2021年10月にリリースされたバージョン4.0.0以降では、ユーザーディレクトリでの指定ができません。設定ファイルの詳細は次のURLを参考にしてください。

https://flake8.pycqa.org/en/latest/user/configuration.html

—————————

いまいちわからなかったので、より詳しく説明してくれているところを探してみました。ご参考にどうぞ。

https://zenn.dev/nuinui/articles/31fe5ff78339ab

https://woodstock.hateblo.jp/entry/2021/07/11/141532#%E6%A7%8B%E6%88%90%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E4%BD%9C%E6%88%90

それではきりが良いので、今回はこちらで終了です。お付き合いいただきありがとうございました。

実践試験について知りたい方は以下をご覧ください。

●Python3エンジニア認定実践試験

https://www.pythonic-exam.com/exam/jissen

PAGE TOP