VSCodeの開発設定2023(Python)

Tips

前置き

VSCodeの設定・拡張機能紹介の記事です。今回はPythonです。

Pythonはつい最近(2023年7月頃)VSCodeでの在り方を変えたばかりなので情報があまり見つからなくて苦しいです。

拡張機能

基本系

VSCodeでPythonを扱うにあたってほぼ確実に入れる拡張機能になります。

code\
 --install-extension ms-python.python\
 --install-extension ms-python.vscode-pylance

Python

VSCodeでPythonを扱えるようにするための拡張機能。現在、Python 3.7以上のバージョンをサポートしている。

入力補完などの他、VSCode利用するPythonのインタプリタを設定することでデバッグやテストなども管理可能になる。というかこの拡張機能が無いとVSCodeでPythonを動かすことができない。

Pylance

Pythonコードの様々な解析機能を持つ。簡易的なLinterやFormatterとしての機能も併せ持つ。

Linter, Formatter系

Microsoft製の拡張機能を入れて静的解析や自動フォーマットを行うのが現在推奨されているので、それに従ったインストールになります。

従来の設定方法では基本使ってませんでした(というかmypyとかはかなり最近のリリースです)が、isortのみは当時から拡張機能で連携してあげる必要がありました。

基本的にこれらは2023年現在のPythonにおけるLinter, Formatterのデファクトスタンダードと言えるライブラリ達を拡張機能化したものになる。インストールするだけでバンドルされたツールを使える他、設定により、ローカルのライブラリパッケージを利用してVSCodeと連携もできる。

code\
 --install-extension ms-python.black-formatter\
 --install-extension ms-python.isort\
 --install-extension ms-python.flake8\
 --install-extension ms-python.mypy-type-checker

Black Formatter

大部分の自動フォーマットを受け持つ拡張機能。PEP8に準拠したフォーマットを行う。

isort

Blackが対応していないimport周りの自動フォーマットを行う。単体でも使用できるが、Blackと連携する設定がある。

Flake8

静的解析を行う拡張機能。

Mypy Type Checker

型ヒント(タイプアノテーション)を静的解析する拡張機能。Pythonは通常、型ヒントを書かなくてもまったく問題無いが、この拡張機能で型ヒントをある程度強制することも可能となる。

効率向上系

その他の拡張機能になります。TOMLファイルに関するものはFormatterの役割も持ちますが、Pythonの記述において必須ではないので(TOMLを使わないConfigも存在)こちらに入れました。

code\
 --install-extension kevinrose.vsc-python-indent\
 --install-extension njpwerner.autodocstring\
 --install-extension tamasfe.even-better-toml

Python Indent

タイピング中に行う改行時に適切なインデントで開業してくれる拡張機能。

autoDocstring

Pythonのドキュメンテーションであるdocstringを生成してくれる拡張機能。その特性から、引数や戻り値を書き終わってから生成するとよい。

Even Better TOML

最近のPythonにおける設定ファイルの記述方式であるtomlファイルのハイライトやフォーマットを行える拡張機能。

settings.json

Pythonに関連するsettings.jsonを抜き出しました。全般編で紹介した設定は入っている前提になります。

ユーザー設定

Pylanceに関する設定が多いですが、ここに書かれているのは規定値から変更したもののみで、書かれていないものでも規定値で有用な機能が多いので公式に一度目を通しておくのもおすすめします。

{
  /* Python */
  "[python]": {
    "editor.tabSize": 4,
    "editor.defaultFormatter": "ms-python.black-formatter", // Extension: Black
    "editor.codeActionsOnSave": {
      "source.fixAll": true, // Extension: Pylance
      "source.organizeImports": true // Extension: isort
    }
  },
  // Extension: Python
  "python.languageServer": "Pylance",
  "python.terminal.activateEnvironment": false,
  // Extension: Pylance
  "python.analysis.autoImportCompletions": true,
  "python.analysis.completeFunctionParens": true,
  "python.analysis.inlayHints.variableTypes": true,
  "python.analysis.inlayHints.functionReturnTypes": true,
  "python.analysis.autoFormatStrings": true,
  "python.analysis.fixAll": [
    "source.convertImportFormat",
    "source.unusedImports"
  ],
  // Extension: Black
  "black-formatter.args": [
    "--line-length=119"
  ],
  // Extension: flake8
  "flake8.args": [
    "--ignore=E203",
    "--max-line-length=119",
  ],
  // Extension: isort
  "isort.args": [
    "--profile=black",
    "--line-length=119",
    "--trailing-comma",
  ],
  // Extension: mypy
  "mypy-type-checker.args": [
    "--show-error-context",
    "--show-column-numbers",
    "--ignore-missing-imports",
    "--warn-return-any",
    "--warn-unused-ignores",
    "--warn-redundant-casts",
  ],
  /* TOML */
  "[toml]": {
    "editor.defaultFormatter": "tamasfe.even-better-toml"
  },
}

editor.tabSize

Pythonはインデントを4にするのが良いので、その値を指定しています。ちなみにtomlはデフォルトの2のままで良いです。

editor.defaultFormatter

フォーマッターを指定しています。PythonはBlack FormatterをtomlはEven Better TOMLを指定しています。

editor.codeActionsOnSave

ファイルが保存された際に行う動作を記述する項目です。Pythonではフォーマッターに指定したBlack以外にもフォーマットを行う拡張機能が存在しているので、ここで指定します。

source.fixAll

Pylanceのフォーマット設定です。後述するfixAllに書かれた動作を実行します。

source.organizeImports

isortのフォーマット設定です。isortによるimportのフォーマットを実行します。

python.languageServer

Pythonに使う言語サーバーを選択します。デフォルトでは「ある場合にPylanceを選び、無い場合はJediを使う」という設定になっています。これをPylanceに固定化します。(Jediを使わせない)

python.terminal.activateEnvironment

Pythonを全てのターミナルでアクティベートするかどうかの設定です。Pythonと関係ないプロジェクトでアクティベートしても旨みが少ない割に起動リソースを奪って遅くなるのでOFFにします。

python.analysis.autoImportCompletions

Pylanceによる入力補完でimportの必要なツールを挿入した場合、対応するimportを自動で書くかどうかの設定です。便利なのでtrueにしておきます。

python.analysis.completeFunctionParens

関数を宣言した際に、カッコ書き()を自動挿入する設定です。便利なのでtrueに。

python.analysis.inlayHints.variableTypes

変数宣言時に対応する型ヒントを半透明でヒントとして表示する設定です。半透明状態では実際に書かれているわけではない点にちゅういですが、型ヒントを書く前提でプログラムを組むのであれば便利なのでtrueにします。

後述のワークスペース設定には書いていませんが、どうしてもOFFにしたいリポジトリがあった場合はワークスペースの個別で明示的にfalseにするとよいでしょう。

python.analysis.inlayHints.functionReturnTypes

こちらは関数の返り値を半透明ヒントにする設定です。これら2つ以外にもcallArgumentNames(引数)とpytestParameters(テスト値)に関連するinlayHintsの設定がありますが、個人的に使いづらかったのでfalseのままにしています。使いたい方はtrueにしてみても良いでしょう。

python.analysis.autoFormatStrings

文字列内に{}を挿入した際に、f文字列として判断してfを自動挿入してくれる機能。便利なのでtrueにします。

python.analysis.fixAll, source.convertImportFormat, source.unusedImports

前述のcodeActionsOnSaveで動作するPylanceのフォーマット機能です。

convertImportFormatは「python.analysis.importFormat」という設定値(ワークスペースの項で説明)に沿ってimportの形式を変更するフォーマットです。これはisortとは異なる概念(isortは並び替え)なので両立します。

unusedImportsは、未使用のimportを削除するフォーマットです。

xxx.args

Linter, Formatter系の拡張機能を実行する際に利用されるargsです。グローバルスコープでは設定ファイルが無いので、argsにベストプラクティスの設定値を記入しています。

ワークスペース設定

ユーザー設定と重複する部分もあるのでそれ以外を紹介します。

{
  /* Python */
  "[python]": {
    "editor.tabSize": 4,
    "editor.defaultFormatter": "ms-python.black-formatter", // Extension: Black
    "editor.codeActionsOnSave": {
      "source.fixAll": true, // Extension: Pylance
      "source.organizeImports": true // Extension: isort
    }
  },
  // Extension: Python
  "python.defaultInterpreterPath": "${workspaceFolder}/.venv/Scripts/python.exe",
  "python.languageServer": "Pylance",
  "python.testing.pytestEnabled": true,
  // Extension: Pylance
  "python.analysis.addImport.exactMatchOnly": false,
  "python.analysis.typeCheckingMode": "off",
  "python.analysis.diagnosticMode": "openFilesOnly",
  "python.analysis.indexing": true,
  "python.analysis.userFileIndexingLimit": 2000,
  "python.analysis.importFormat": "absolute",
  "python.analysis.enablePytestSupport": true,
  "python.analysis.fixAll": [
    "source.convertImportFormat",
    "source.unusedImports"
  ],
  // Extension: Black
  "black-formatter.importStrategy": "fromEnvironment",
  "black-formatter.args": [],
  // Extension: flake8
  "flake8.importStrategy": "fromEnvironment",
  "flake8.args": [],
  // Extension: isort
  "isort.importStrategy": "fromEnvironment",
  "isort.args": [],
  // Extension: mypy
  "mypy-type-checker.importStrategy": "fromEnvironment",
  "mypy-type-checker.args": [],
  // "mypy-type-checker.preferDaemon": false,
  /* TOML */
  "[toml]": {
    "editor.defaultFormatter": "tamasfe.even-better-toml"
  },
}

python.defaultInterpreterPath

PythonのGitリポジトリでインタプリタが設定されていない場合は、エディタからインタプリタを選択する必要がありますが、この設定はインタプリタが未選択の場合にデフォルトでインタプリタとするPythonのPathを入力します。

pipenvやpoetryで環境を整備して、且つProject内に.venvを作る設定にしている場合は上記のようなPath設定で仮想環境のPythonを使うようにします。

※ 上記はWindowsの場合のPathで、Linuxの場合は「${workspaceFolder}/.venv/bin/python」になります。環境変数を上手く使うことでWindowsとLinuxを両立させることも可能ですが、チーム開発向きではないのであまりおすすめしません。

python.testing.pytestEnabled

Pytestを有効化します。これにより、Python拡張機能と連携したpytest(サイドバーからの実行管理など)が利用可能となります。

python.analysis.addImport.exactMatchOnly

完全一致のimportのみをPylanceの機能で追加します。これもそうですが、ワークスペースのPylance設定のいくつかは、ユーザー設定による変更を受け付けないようにするために規定値でも明示的に記載しています。

python.analysis.typeCheckingMode

Pylanceによる型チェックを行うかの設定です。mypyとは違う設定になるので、offにしておきます。

python.analysis.diagnosticMode

Pylanceの解析範囲を決める設定です。アクティブなファイルのみに適用するようにしています。

python.analysis.indexing

Pylanceの解析に用いる為にindexを内部的に保持しておくかどうかの設定です。有効化しています。

python.analysis.userFileIndexingLimit

indexを作成する限界値です。デフォルトのまま2000を設定しています。1ファイル2000行を超える書き方をする人は悔い改めましょう。

python.analysis.importFormat

Pylanceのいくつかの機能で提供されるimportをどの方式で追加するかの設定です。デフォルトのabsoluteを明示的にしています。本記事で扱っている設定だと、ユーザー設定に書いてある「autoImportCompletions」と「fixAll, convertImportFormat」に関係しています。

python.analysis.enablePytestSupport

pytestのfixtureに関連するPylanceの解析サポートを有効にします。

xxx.importStrategy

Linter, Formatter系の拡張機能を実行するライブラリをどう探すかの設定です。

デフォルトはuseBundledで、これは拡張機能に搭載されたライブラリを使う設定です。

Pythonプロジェクト内では.venvにインストールされたライブラリを利用したいのでfromEnvironmentで環境内を探す設定にしています。fromEnvironmentで見つからない場合はバンドル版で動作もしないです。

xxx.args

ユーザー設定で引数が利用されていると良くないので、ワークスペースでは全て空にします。

mypy-type-checker.preferDaemon

この設定項目は2023年10月現在、実験的設定項目ですが、いくつかの環境ではこれをfalseにしないとfromEnvironmentのmypyが動かないことがありました。

最後に

各種LinterやFormatterの設定値は別記事でまた書きます。

タイトルとURLをコピーしました