VSCodeでblackとflake8の設定をしてみた

Pythonのblackとflake8を導入して、VSCodeのファイル保存時に適用する設定内容について記載しました。
2023.03.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

DA事業本部の横山です。

プロジェクトでPython用にFormatterとLinterを導入することとなり、blackとflake8を採用しました。 ファイル保存時に両者を適用するためのVSCodeの設定内容について記載します。

black

PythonのFormatterで、PEP8に準拠した形でコードを整形してくれます。 PythonのFormatterとしては、他にautopep8やyapf等が存在します。

blackの特徴としては、カスタマイズがほとんどできず1行あたりの最大文字数程度しか設定できません。 今回は、formatterにプロジェクト固有のルールを付与する必要がないためblackを利用することとしました。

pip install black

上記コマンドで実行環境にインストールしておきます。

flake8

PythonのLinterで、PEP8に準拠しているか、シンタックスチェック、循環的複雑度のチェックが行えます。 PythonのLinterとしては、他にpylintやProspector等が存在します。 今回は、主観ですがもっともよく見かけるものであるflake8を利用することとしました。

pip install flake8

上記コマンドで実行環境にインストールしておきます。

VSCodeによる設定

VSCodeでコーディングする際に、ファイル保存時にFormatter, Linterが適用されるように設定します。

設定内容の概要としては以下になります。

  • ファイル保存時のFormatter, Linterの適用
  • black, flake8の有効化
  • pylintの無効化(VSCodeのPython拡張機能で有効化されていなければ不要)
  • flake8の設定ファイルのパス指定

実際の設定内容は以下のようになりました。

  "[Python]": { // ブログの都合でpを大文字としていますが正しくは小文字です。
    "editor.formatOnSave": true,
  },
  "python.linting.enabled": true,
  "python.linting.lintOnSave": true,
  "python.linting.pylintEnabled": false,
  "python.linting.flake8Enabled": true,
  "python.linting.flake8Args": [
    "--config=${workspaceFolder}/.flake8"
  ],
  "python.formatting.provider": "black",

flake8の設定ファイルは以下になります。

[flake8]
max-line-length = 88
extend-ignore = E203

blackを適用するとどうしてもflake8で問題として摘出されてしまう項目が存在するため、flake8の設定ファイルでmax-line-lengthE203について変更しています。

flake8のE203とは、コロンの前にスペースが不要というエラーです。

例えば以下のようなコードであればf :ではなくf:とすべきという指摘になります。

with open('file.dat') as f :
    contents = f.read()

しかし、black適用後の以下のコードについても同様に指摘してしまうため無視する必要があります。

def test():
    a = list(range(10))
    p = 2
    a[p : p + 4]

詳細については、以下のドキュメントをご参照ください。

これらの設定をおこなうことで、pythonファイルの保存時にblackとflake8が適用されるようになりました。 これで開発者のコーディングスタイルの統一とPEP8に準拠していないコードの発見を行いやすくなりました。

おわりに

Pythonのblackとflake8を導入して、VSCodeのファイル保存時に適用する設定内容について記載しました。 開発効率の向上とコードレビュー時の労力削減等に効果があると期待しています。

以上になります。この記事がどなたかの助けになれば幸いです。