Pythonで flake8 (Linter,Formatter) を使ってみる

今回は、Linter Formatterについてそろそろ知っときたいなと思い調べたのでメモ
実際の動作に関係するものではないので、後回ししてました、、

f:id:wood__stock:20210711141412p:plain

Lintter, Formatter

Linter ってなに

lintとは、コンピュータプログラムなどのソースコードを読み込んで内容を分析し、問題点を指摘してくれる静的解析ツール。また、そのようなツールで解析を行うこと。ツールを指す場合は “linter” (リンター)と呼ぶこともある。
引用元 : IT用語辞典 e-Words

  • プログラムを実行する前に、問題が発生しそうな箇所を指摘してくれるもの。(変数を宣言してるのに使ってないなど)
  • 解析するプログラムを"リント"、解析ツールを"リンター"と呼ぶ。

Formatter ってなに

定めたルールに従ってコードをチェック・成形するツール。
動作に影響しないコードスタイルについてチームで統一することで、コードを読みやすくするもの。
よくあるルールとしては、空白の入れ方や改行位置などがあるそうです。

flake8

flake8ってなに

Flake8 is a wrapper around these tools: ・ PyFlakes
・ pycodestyle
・ Ned Batchelder’s McCabe script
引用元: flake8 · PyPI

  • PyFlakes : コード規約PEP8に準じ、コードのエラーチェックをするもの。 Lintter
  • pycodestyle : コード規約PEP8に準じ、コードスタイルをチェックするもの。 Formatter
  • Ned Batchelder’s McCabe script : 複雑度チェッカー

個別で存在するのLinter , Formatterをまとめて使えるものまとめて使用できるものだそうです。

インストール

pip install flake8

実行コマンド

$ flake8 [ファイル or ディレクトリ]
$ flake8 ./main.py (ファイル)
$ flake8 ./MyProject (ディレクトリ)

使用例

参考に簡単なコードにflake8を実行してみます。

# == main.py ==

def add(a,b):
    return a+b

if __name__ == "__main__":
    a = 1
    b = 2
    sum = add(a,b)
    print(sum)
# 実行結果

$ python main.py
3
flake8の実行
$ flake8 main.py

main.py:3:10: E231 missing whitespace after ','
main.py:6:1: E305 expected 2 blank lines after class or function definition, found 1
main.py:9:16: E231 missing whitespace after ','
main.py:10:15: W292 no newline at end of file

4つエラーが出ました。
E○○ W○○ とコードが出るのが、チェックしている項目ごとのコードになります。
ErrorCodes

今回出ているエラーとしては以下のようです。

  • E231 : [ , ; : ]の後に空白がありません
  • E305 : 関数またはクラスの終了後に2行の空白行が必要です
  • W292 : ファイルの終わりに改行がありません

特定のエラーのみチェックしたい・省略したい場合はオプションで設定できます。

# 特定のエラーのみチェック
$ flake8 --select E231,E305 main.py

# 特定のエラーを省く
$ flake8--ignore E231,E305 main.pu

構成ファイルの作成

実行時に毎回オプションを設定して、エラー項目を設定するのは大変なので、、、
flake8の構成ファイルを使って読み込めるようにしてみます。

構成ファイルの書き方

flake8コマンドのオプションで設定できる内容を並べていくしていくようです。
参考に、公式ドキュメントで使用されていたものです configuration

# == .flake8 ==

[flake8]
ignore = D203
exclude = .git,__pycache__,docs/source/conf.py,old,build,dist
max-complexity = 10

設定されている内容

  • ignore : チェックしないエラーコード
  • exclude : 除外するファイルまたはディレクト
  • max-complexity : McCabeでチェックする複雑度の閾値

自動生成でチェックの必要がないファイルなどは、事前に設定していてもよいかもしれません。

ユーザごとの設定

構成ファイルを保存しておけば自動的に読み込まれるようです。
OS保存先はOSごとに設定ファイルの保存場所ファイル名が違っています。

Windows : ~\.flake8
Linux : ~/.config/flake8

チーム内で共有

各々が作った構成ファイルを使用すると、コードが統一されず読みづらいです。 なので、事前に構成ファイルをgitプロジェクト内に含め共有し、それを使ってflake8を実行すると良いと思います。

# --config オプションを使って、構成ファイルを指定
$ flake8 --config flake8 main.go

最後に

導入が意外と簡単に出来るので、面倒ですがプロジェクトと開始時にやっておくとコードが統一されて良さそう。