Blogical

AWS/Salesforceを中心に様々な情報を配信していきます(/・ω・)/

VS Code で Python の開発環境を用意する【リンター・フォーマッター編】

こんにちは、ロジカル・アーツの笹原です。

今回は、前回に引き続き PythonVS Code の開発環境の設定についてお伝えしたいと思います。

はじめに

第一弾は VS Code での Python の仮想環境の設定方法についてでしたが、第二弾は Python のリンターおよびフォーマッターを設定する手順を紹介したいと思います。

以下の手順で扱う環境は次の通りです:

リンターとフォーマッター

一般に、リンターは文法やスタイルの問題をチェックし、フォーマッターは(定義したスタイルに基づいて)コードを整形します。ただし、役割が完全に分離されているわけではなく、フォーマッターとしての機能を持ったリンターもあります。

今回はリンターに Pylint を、フォーマッターに Black を使用してみます。

Pylint

カスタマイズ性の高いツールです。設定可能な項目が非常に多いので、pylint --generate-rcfile > ~/.pylintrc のようにして設定ファイルを生成し、必要な項目を個別に設定する方法がよく取られるようです。

Black

Pylint とは反対にカスタマイズ性がほとんどないツールです。制限の強い PEP8 といった感じのようですが、このスタイルを受け入れられるなら細かいコーディングスタイルに悩まされる必要はなくなります。ベータ版という位置づけですが、支持されています。

設定方法

この記事では、以後の作業をすべて linter-formatter ディレクトリ下で行います。
記事中では仮想環境下で作業してますが、これについては任意です。設定方法は前回の記事で扱っているので、よろしければ参考にしてください。

ライブラリのインストール

VS Code のターミナルで(仮想環境を有効化した状態で)以下のコマンドを実行します:

pip install pylint black

f:id:logicalarts:20211201101458p:plain

VS Code での設定

VS Code の設定ファイルにリンターやフォーマッターの詳細な設定を記述します。設定ファイルはユーザまたはワークスペースレベルで設定できますが、今回はワークスペースレベルで設定します。

まずは、設定項目を見ていきましょう。

リンターに関する設定

リンター全般に対する設定と、リンター個別の設定があります。詳細は以下のリンクを参照してください。

一般
キー 説明 備考
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

フォーマッターに関する設定

フォーマッターの設定項目は次の通りです。詳細は以下のリンクを参照してください。

キー 説明 備考
python.formatting.provider どのフォーマッターを使用するか autopep8yapfblack のいずれか。デフォルトは 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",
}

f:id:logicalarts:20211201101454p:plain

実践

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」タブにリントメッセージが表示されていると思います。

f:id:logicalarts:20211201101502p:plain

上から 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」タブを確認すると上述のメッセージが消えていると思います。また、ぱっと見では分かりづらいですが、シングルクオートがダブルクオートに変わっていると思います。

f:id:logicalarts:20211201101507p:plain

おわりに

今回は VS CodePython のリンターとフォーマッターを設定する手順を扱いました。あまり細かいところまで立ち入りませんでしたが、設定をチーム間で共有*2し、ファイル保存時などに自動で適用されるようにすれば、開発者ごとのスタイルのブレを小さくしたり、コードレビュー時のレビュー・修正の手間を小さくできると思います。

*1:リント自体はデフォルトで有効になっているので、その前提です。無効化されている場合は python.linting.enabled を true にしてください。

*2:VS Code は設定ファイル(settings.json)を共有すれば、設定内容が簡単に共有できます。