DjangoBrothers BLOG

2019/07/31

このエントリーをはてなブックマークに追加
Python Django Flake8

【Python】Flake8を使ってコーディングスタイルを自動でチェックする

Pythonのコーディングスタイル規約「PEP 8」とは?

Pythonには、Pythonのコーディングスタイルのベストプラクティスを定義しているPEP 8という規約があります。

こちらの規約を守らなくてもPythonのコードは通常通り動作しますが、Pythonコミュニティ全体で広く浸透している規約に沿ったコードを書くことで、コード全体の見通しが良くなり、複数人での開発などがやりやすくなります。

PEP 8自体はそれほど長いドキュメントでもないので、サラッと読むことができます。Python初心者の方も何度か立ち返って読んでみることで少しずつ身につけることができます。

規約自体はシンプルですが、自分が参画しているプロジェクト内のコードがPEP 8に沿ったスタイルになっているかを目視で確認するのは大変な作業になります。

この作業を自動化してくれるライブラリがFlake8です。

Flake8を利用する

Flake8の使い方はシンプルです。

pipを使ったインストール

$ pip install flake8

基本的な使い方は、flake8のコマンドに続いてファイル名かディレクトリ名を指定するだけです。 sample.pyという適当なファイルを作って試してみます。(内容にあまり意味はありません)

sample.py

1 import sys, math
2
3 a= 2
4 b = 10;
5 [1, 2,3]
6

consoleからflake8を使う

$ flake8 sample.py

sample.py:1:1: F401 'sys' imported but unused
sample.py:1:1: F401 'math' imported but unused
sample.py:1:11: E401 multiple imports on one line
sample.py:3:2: E225 missing whitespace around operator
sample.py:4:7: E703 statement ends with a semicolon
sample.py:5:6: E231 missing whitespace after ','
sample.py:6:1: W391 blank line at end of file

ファイルの行ごとに、いくつかエラーが表示されました。 ここでは以下の内容のエラーになっています。

  • importしたモジュールが使われていない
  • ひとつのラインで複数のモジュールをimportしている
  • オペレータ(=オペレータ)の前後でスペースを入れていない
  • セミコロンを行末に入れている
  • カンマの後にスペースを入れていない
  • ファイルの最後に空行が入っている

このように、PEP 8に従っていない書き方を自動で検知することができます。 ちなみにエラーコードの一覧は以下のページにまとまっています。

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

Flake8の設定

Flake8による検知は便利ですが、プロジェクトによっては検知する対象や、エラーとして表示する内容を変更したい場合があります。

Flake8では、setup.cfgというファイルを作成することでこの設定をすることができます。

サンプルとして、DjangoのプロジェクトでFlake8を利用する場合を想定します。

プロジェクトのルートディレクトリ(flake8コマンドを利用するディレクトリ)に、setup.cfgというファイルを作りましょう。

setup.cfg

[flake8]
exclude = .git,*migrations*,venv
max-line-length = 119

こちらの設定では、GitのファイルやDjangoプロジェクトのマイグレーションファイル、仮想環境の設定ファイルなどをflake8の検知対象から外しています。

また、1行に含める文字数をデフォルトの79文字から119文字に変更しています。

PEP 8では1行当たりに79文字という規約が設定されていますが、Djangoのコーディングスタイルには「1行あたり119文字」まで許容すると書いてあります。

そのため、Djangoのプロジェクトで開発する場合にはこちらの設定をしておくと良いでしょう。

Djangoのコーディングスタイル

参考

SHARE ! Tweet