こんにちは、ロジカル・アーツの笹原です。
今回は、前回に引き続き Python の VS Code の開発環境の設定についてお伝えしたいと思います。
はじめに
第一弾は VS Code での Python の仮想環境の設定方法についてでしたが、第二弾は Python のリンターおよびフォーマッターを設定する手順を紹介したいと思います。
以下の手順で扱う環境は次の通りです:
- OS は Windows 10
- Python のバージョンは 3.7.4
- VS Code のバージョンは 1.62.3
- Python の拡張機能
リンターとフォーマッター
一般に、リンターは文法やスタイルの問題をチェックし、フォーマッターは(定義したスタイルに基づいて)コードを整形します。ただし、役割が完全に分離されているわけではなく、フォーマッターとしての機能を持ったリンターもあります。
今回はリンターに Pylint
を、フォーマッターに Black
を使用してみます。
Pylint
カスタマイズ性の高いツールです。設定可能な項目が非常に多いので、pylint --generate-rcfile > ~/.pylintrc
のようにして設定ファイルを生成し、必要な項目を個別に設定する方法がよく取られるようです。
Black
Pylint とは反対にカスタマイズ性がほとんどないツールです。制限の強い PEP8 といった感じのようですが、このスタイルを受け入れられるなら細かいコーディングスタイルに悩まされる必要はなくなります。ベータ版という位置づけですが、支持されています。
設定方法
この記事では、以後の作業をすべて linter-formatter
ディレクトリ下で行います。
記事中では仮想環境下で作業してますが、これについては任意です。設定方法は前回の記事で扱っているので、よろしければ参考にしてください。
ライブラリのインストール
VS Code のターミナルで(仮想環境を有効化した状態で)以下のコマンドを実行します:
pip install pylint black
VS Code での設定
VS Code の設定ファイルにリンターやフォーマッターの詳細な設定を記述します。設定ファイルはユーザまたはワークスペースレベルで設定できますが、今回はワークスペースレベルで設定します。
まずは、設定項目を見ていきましょう。
リンターに関する設定
リンター全般に対する設定と、リンター個別の設定があります。詳細は以下のリンクを参照してください。
- https://code.visualstudio.com/docs/python/linting#_general-linting-settings
- https://code.visualstudio.com/docs/python/linting#_specific-linters
一般
キー | 説明 | 備考 |
---|---|---|
python.linting.enabled | リントを有効化するかどうか | デフォルトは true |
python.linting.lintOnSave | ファイル保存時にリントするかどうか | デフォルトは true |
python.linting.maxNumberOfProblems | リントメッセージの最大数 | デフォルトは 100 |
python.linting.ignorePatterns | リントしないファイルやフォルダのパターン | デフォルトは [".vscode/*.py", "**/site-packages/**/*.py"] |
リンターごと
ここでは各リンターに共通の設定項目のみ述べます。リンターに固有の設定については以下のリンクの該当箇所を参照してください。
https://code.visualstudio.com/docs/python/settings-reference#_linting-settings
キー | 説明 | 備考 |
---|---|---|
python.linting.<linter>Enabled | 当該リンターによるリントを有効化するかどうか | true または false |
python.linting.<linter>Args | 当該リンターの実行引数 | リスト形式 |
python.linting.<linter>Path | 当該リンターのパス |
<linter> は使用するリンターに対応するものに置き換えます。対応表は次の通りです:
リンター | <linter> の値 |
---|---|
Pylint | pylint |
Flake8 | flake8 |
mypy | mypy |
pycodestyle | pycodestyle |
prospector | prospector |
pylama | pylama |
bandit | bandit |
フォーマッターに関する設定
フォーマッターの設定項目は次の通りです。詳細は以下のリンクを参照してください。
- https://code.visualstudio.com/docs/python/editing#_formatting
- https://code.visualstudio.com/docs/python/settings-reference#_formatting-settings
キー | 説明 | 備考 |
---|---|---|
python.formatting.provider | どのフォーマッターを使用するか | autopep8 、yapf 、black のいずれか。デフォルトは autopep8 |
キー | 説明 | 備考 |
---|---|---|
python.formatting.<formatter>Args | 当該フォーマッターの実行引数 | リスト形式 |
python.formatting.<formatter>Path | 当該フォーマッターのパス |
<formatter> は上記の provider で指定した値のいずれか。
ワークスペースの設定
Ctrl + Shifh + P
でコマンドパレットを開き、「Preferences: Open Workspace Settings (JSON)」を選択します。
settings.json
ファイルが開かれるので、以下の内容を記述します。これで Pylint が有効になり、コードフォーマッターとして Black が使用されます*1。
{ "python.linting.pylintEnabled": true, "python.formatting.provider": "black", }
実践
Pylint のチュートリアルのサンプルコードを対象に検証してみましょう。
以下の内容を simplecaesar.py
として保存します。
#!/usr/bin/env python3 import string; shift = 3 choice = input("would you like to encode or decode?") word = input("Please enter text") letters = string.ascii_letters + string.punctuation + string.digits encoded = '' if choice == "encode": for letter in word: if letter == ' ': encoded = encoded + ' ' else: x = letters.index(letter) + shift encoded = encoded + letters[x] if choice == "decode": for letter in word: if letter == ' ': encoded = encoded + ' ' else: x = letters.index(letter) - shift encoded = encoded + letters[x] print(encoded)
このとき、「PROBLEMS」タブにリントメッセージが表示されていると思います。
上から 2 番目のメッセージ「Missing module docstring」に対応してみましょう。 また、保存時にフォーマッターが適用されるよう VS Code の設定ファイルに以下を追記します。これにより、ファイル保存時に一番上のメッセージ「Unnecessary semicolon」と一番下のメッセージ「Final newline missing」も消えるはずです。
"[python]": { "editor.formatOnSave": true },
キーを [python]
とすることで、Python ファイルに対してのみ、保存時にフォーマッターの適用をすることができます。
なお、Black はデフォルトではクオートは全てダブルクオート "
になります。これを回避する場合は --skip-string-normalization
オプションを使用します。VS Code では設定ファイルに
"python.formatting.blackArgs": ["--skip-string-normalization"]
を追記すれば毎回適用してくれますが、今回は省略します。これまでの設定を記述すると、設定ファイルは以下のようになっているはずです。
{ "python.linting.pylintEnabled": true, "python.formatting.provider": "black", "[python]": { "editor.formatOnSave": true }, // "python.formatting.blackArgs": ["--skip-string-normalization"], }
この状態で、simplecaesar.py
の 2 行目に以下のドキュメントを追加し、保存しましょう。
"""This script prompts a user to enter a message to encode or decode using a classic Caesar shift substitution (3 letter shift)"""
「PROBLEMS」タブを確認すると上述のメッセージが消えていると思います。また、ぱっと見では分かりづらいですが、シングルクオートがダブルクオートに変わっていると思います。
おわりに
今回は VS Code で Python のリンターとフォーマッターを設定する手順を扱いました。あまり細かいところまで立ち入りませんでしたが、設定をチーム間で共有*2し、ファイル保存時などに自動で適用されるようにすれば、開発者ごとのスタイルのブレを小さくしたり、コードレビュー時のレビュー・修正の手間を小さくできると思います。