概要
Pythonを使ったプロジェクトでコーディングスタイルや規約の属人化を抑制するためのツール群について解説します。 VSCodeの拡張機能として使うことを前提とします。
※ 私が株式会社愛宕 Advent Calendar 2023に書く記事は主に社内向けに共有しておきたいけど勉強会をするまでもないちょっとしたTipsにしたいと思います。
やりたいこと
- コーディングスタイルの統一
- 空白の入れ方や改行の位置や一行の行数などを全てのソースコードで統一して読みやすくすること
- コーディング規約の順守
- ソースコードレビューでコーディング規約違反を指摘するのは面倒なので規約が守られているかどうかを機械的にチェックすること
- コーディング規約は最も費用対効果の高い品質向上施策と言われています
- 静的解析
- Pythonにはコンパイルがないため実行時にならないとバグが発見できません。しかし、一部のバグは想定している型の違いに起因することが多いため、コードに型ヒントを記述しそれが矛盾がないかどうかをチェックすること
- セキュリティ的に脆弱性になりやすいコードの書き方を解析し問題を早期発見すること
やりかた
コーディングスタイルの統一
一般的にコーディングスタイルを統一するにはフォーマッター(formatter)を使用します。フォーマッターは決められた形式になるようにソースコードを整形します。
Pythonのフォーマッターで有名なものでVSCodeから利用できるのは次の3つです。 全てpipでインストールしなければ使用できません。
- autopep8: PEP8準拠のスタイルに整形してくれる
- yapf: Google謹製。PEP8準拠じゃなく良くも悪くもGoogleスタイル
- black: 細かい設定が一切できない。その代わり設定を考える必要がない
コーディングスタイルは好みが出る部分でこだわるプログラマなら一家言あるところですが、スタイルが統一されているならどんなものでも効果はあるので細かい設定ができないblackを選択するのが無駄な議論をする必要がなく最も費用対効果が高いと考えられます。
ファイルを保存したタイミングで自動で整形するようにVSCodeを設定すると捗ります。
設定例
blackの設定はコマンドライン引数でおこないます。
--line-length=99
この例では一行の文字数が99文字になります。
インポート順の正規化
モジュールのインポート順は最適な順序が存在します。どんな言語でも通常は言語処理系に標準添付されているような基本的なモジュールを最初にインポートし、フレームワーク、プロジェクト内、ローカルディレクトリ内モジュールの順になります。
これをプログラマが判断しながら並び替えるのは無駄な労力なので自動で並び替えるツールが存在します。
Pythonではisortを利用します。VSCodeには標準添付されているので追加でインストールする必要はありません。 ただし、ファイル保存時に自動で並び変えるにはVSCodeの設定画面で「settings.json
で編集」ボタンを押して編集する必要があります。
"editor.codeActionsOnSave": { "source.organizeImports": true }
静的解析
一般的にコーディング規約をチェックするにはリンター(linter)を使用します。また、型チェックや脆弱性チェックなどの静的解析もリンターが行います。 リンターは規約に違反した箇所をerror, warning, infoなどのレベル別に指摘することができます。
なお、VSCodeのPython言語サーバー(標準PythonまたはPylance)も補完のために解析を行っているため問題が通知されることがあります。
Pythonのリンターとして有名なものの中でVSCodeから利用できるのは以下の通りです。 全てpipでインストールしなければ使用できません。
- Pylint: VSCodeの標準のリンター
- Flake8: 関数の複雑さなども解析してくれる
- Bandit: パスワードの直書きなどのセキュリティ問題を検出してくれる
- Mypy: 型ヒントに従って型の整合性をチェックしてくれる
- Pycodestyle: スタイルがPEP8に従っているかどうかをチェックしてくれる
- Pydocstyle: ドキュメントのスタイルがPEP257に従っている稼働がをチェックしてくれる
- Pylama: Flake8のようなもの?未使用のため不明
- Prospector: Flake8のようなもの?未使用のため不明
総合的にはFlake8を利用するのが最適で加えてBanditでセキュリティ関連の解析とMypyで型のチェックを補助的に行うのがいいと思います。
ファイルを保存したタイミングで静的解析がかかるようにすると捗ります。
設定例
flake8の設定はコマンドライン引数でおこないます。
--max-line-length=99
--ignore=E203,W503,W504
この例では一行の文字数が99文字になります。blackで整形するスタイルが静的解析にかからないようにしています。 また、E203, W503, W504の問題を無視することにしています。
無視設定
静的解析は完璧ではないので全く問題のない箇所であっても指摘されることがあります。その場合は、リンターに無視させるための記述方法がそれぞれのリンターに存在します。
Flake8
コメントにnoqa
と書いた行は無視されます。
Bandit
コメントにnosec
と書いた行は無視されます。