flake8とは?
flake8はpythonの以下の3つのエラーチェックをしてくれるモジュールのラッパーです。
- pep8:コードスタイルがPEP8に準拠しているかをチェック
- pyflakes:コードの論理的エラーをチェック(スタイルのチェックは除く)
- mccabe:コードの循環的複雑度のチェック(分岐やループを定義式で数値化するみたいです)
要はお勧めのエラーチェックの抱き合わせで、これを入れておけば安心・・・みたいに思っておけばいいのかもしれません・・・(汗
因みにパッケージモジュールのpep8は、最近pycodestyleという名前に変わったらしいので、flake8をインストールするとpep8の代わりにpycodestyleが関連モジュールとしてインストールされます。
VSCodeへの導入方法は?
結論から書くと、VSCode上のコードをflake8によりエラーチェックと書式整形を適用するには、VSCodeのSettingsで次の設定を行い、pythonの実行環境(または仮想環境)に必要なモジュールをインストールすることで実現できます。
VSCodeのSettings
設定名 | 機能 | 設定値 |
---|---|---|
python.linting.enabled | Lint機能を有効にするかどうか | true |
python.linting.pylintEnabled | Linterにpylintを使用するかどうか | false |
python.linting.flake8Enabled | Linterにflake8を使用するかどうか | true |
python.linting.lintOnSave | ファイル保存時にLintを実行するか | true |
python.formatting.provider | Pythonコードの整形に何を使用するか | autopep8 |
editor.formatOnSave | ファイル保存時に自動整形するかどうか | true |
インストールモジュール
次のコマンドにより、必要なモジュールをインストールします。
pip install flake8
pip install autopep8
それでは、導入手順を具体的に記載してゆきます。
pylintを無効化する
VSCodeではpylintがデフォルトで有効になっているので、まずは無効化します。
まず、VSCodeの左下のギアアイコンからメニューを開き、設定をクリックしてSettingsを開きます。(VSCode1.28.xからは、settings.jsonファイルを直接編集する仕様から変わったようです)
検索バーにpython.linting.pylintEnabledを入力してフィルタリングするとPylintのEnabled設定が表示されるので、図のようにチェックをはずします。
因みに、チェックを外すことで、settings.jsonの以下と同義となります。
"python.linting.pylintEnabled": false
設定後、表示されているトースト通知を閉じると、以降は表示されなくなります。
ついでにpythonのlintingを有効化("python.linting.enabled": true)します(デフォルトでtrueになっている場合は変更の必要はありません)。
flake8を導入する
python.linting.flake8Enabledを検索して、有効化(true)します。
"python.linting.flake8Enabled": true
変更するとトースト通知で「flake8がないよ」というメッセージが英語で表示さるので、そのままInstallするか、環境下で次のコマンドによりpep8をインストールします。
pip install flake8
ファイル保存時にlintingをチェックする設定にする
検索バーにpython.linting.lintOnSaveをフィルタリング表示し有効化することで、ファイルの保存時にエラーチェックが働きます。
"python.linting.lintOnSave": true
自動整形するフォーマットを設定する
右クリックメニューの
pep8(pycodestyle)で自動整形するよう設定します。
自動整形のフォーマットをpep8に指定する
PEP8に準拠した自動整形を、検索バーによりpython.formatting.providerを探しautopep8を選ぶことで、自動整形するフォーマットをpep8に指定します。
(flake8によるコードスタイルはpep8(厳密にはpycodestyle)なので、pep8に準拠した整形を行うモジュールautopep8をフォーマッタとして指定します。)
"python.formatting.provider": autopep8
設定と同時に、Python環境にもautopep8をインストールします。
pip install autopep8
# Collecting autopep8
# Collecting pycodestyle>=2.4.0 (from autopep8)
# Using cached https://files.pythonhosted.org/packages/e5/c6/ce130213489969aa58610042dff1d908c25c731c9575af6935c2dfad03aa/pycodestyle-2.4.0-py2.py3-none-any.whl
# flake8 3.5.0 has requirement pycodestyle<2.4.0,>=2.0.0, but you'll have pycodestyle 2.4.0 which is incompatible.
# Installing collected packages: pycodestyle, autopep8
# Found existing installation: pycodestyle 2.3.1
# Uninstalling pycodestyle-2.3.1:
# Successfully uninstalled pycodestyle-2.3.1
# Successfully installed autopep8-1.4.2 pycodestyle-2.4.0
autopep8はフォーマットの参照先として、関連モジュールとしてインストールされるpycodestyleを参照します。
右クリックメニューの「ドキュメントのファーマット」を選択することでpep8(pycodestyle)で自動整形できます。
保存時に自動整形する設定にする
検索バーよりeditor.formatOnSaveを探し有効(true)にすることで、自動整形されるよう設定します。
"editor.formatOnSave" : true
以上により、ファイルを保存すると自動整形が行われます。
うまく自動整形が行われない場合、(flake8とautopep8)それぞれのモジュールが必要とするpycodestyleのバージョンが異なると、lintや自動整形がうまくいかない場合があります。その場合は、依存関係をチェックするモジュールpipdeptreeでパッケージの依存関係を調べることによりバージョンのコンフリクトも調べられるので、どちらの条件も満たすpycodestyleのバージョンに変更するか、どちらも満たせない場合は優先する機能に合わせて、pycodestyleのバージョンを変更してください。
pip install pipdeptree
インストールしたpipdeptreモジュールを実行してパッケージの依存関係を調べると、autopep8が必要とするpycodestyleのバージョンが2.4.0以上なのに対し、インストールされているバージョンが2.3.1なので、整合性がとれません。
pipdeptree
# autopep8==1.4.2
# - pycodestyle [required: >=2.4.0, installed: 2.3.1]
# flake8==3.5.0
# - mccabe [required: >=0.6.0,<0.7.0, installed: 0.6.1]
# - pycodestyle [required: >=2.0.0,<2.4.0, installed: 2.3.1]
# - pyflakes [required: >=1.5.0,<1.7.0, installed: 1.6.0]
調べてみると、flake8が3.6.0にアップデートされていましたので、最新バージョンにアップデートを試みます。
pip install flake8 -U
改めてバージョンと依存関係を確認すると、flake8のバージョンが3.6.0にアップデートされたことに合わせてpycodestyleのバージョンも2.4.0以上にアップデートされ、autopep8と整合性がとれました。
pipdeptree
# autopep8==1.4.2
# - pycodestyle [required: >=2.4.0, installed: 2.4.0]
# flake8==3.6.0
# - mccabe [required: >=0.6.0,<0.7.0, installed: 0.6.1]
# - pycodestyle [required: >=2.4.0,<2.5.0, installed: 2.4.0]
# - pyflakes [required: >=2.0.0,<2.1.0, installed: 2.0.0]
# - setuptools [required: >=30, installed: 40.4.3]
# pipdeptree==0.13.1
# - pip [required: >=6.0.0, installed: 18.1]
# wheel==0.32.1
最新版のflake8をインストールしても、autopep8の要求pycodestyleと整合性がとれない場合は、暫くしてからflake8またはautopep8の最新版が更新されるまで待ってからアップデートするとよいかもしれません。
モジュールのインストール時にpycodestyleの整合性が取れない場合や、PEP8を覚えようとする場合は敢えて保存時の自動整形の機能を切り、PEP8が分かって来た頃に改めてpycodestyleの整合性を整え、自動整形をONにして効率化を図るのも一つ方法でしょう・・・。
flake8のエラーチェックでpycodestyle(pep8)の1行文字数制限を外す
標準コーディング規約PEP8の一行あたりの文字数制限は79文字のため、制限が少し厳しいです。(本来はあまりよろしくないのかもしれませんが)80文字以上でエラーが出るのは流石に避けたいのでこのエラーチェックを外します。
具体的には、ラッパーであるflake8の実行時の引数に、エラー(E501 line too long)を無視する値を指定します。
Settingsの検索バーにflake8argsを入力して項目をフィルタリングし、項目の「settings.jsonで編集」をクリックして開きます。
開かれたsettings.jsonのpython.linting.flake8Argsにマウスカーソルを合わせると左端にペンの様な編集アイコンが表示されるのでクリックし、表示される「設定にコピー」によりユーザー設定に項目をコピーし、コピーされたpython.linting.flake8Argsのカッコ内に"--ignore=E501"を入力して保存します。
以上で、文字数制限のエラーチェックを外せるはずです。