Closed13

Python Rye+Black+Flake8+pytest+Mypy+Pylance+GitHub ActionsによるVS Codeの開発環境構築

3w36zj63w36zj6

Black (Formatter)

https://github.com/psf/black

rye add --dev black

Blackのフォーマットの設定をpyproject.tomlに追加する。以下はデフォルトの行の長さが短いので120に変更している。

pyproject.toml
[tool.black]
line-length = 120

実行は以下のコマンド。

black ./src/

VS Codeでは.vscode/settings.jsonに以下を追加することで保存時にフォーマットされる。

.vscode/settings.json
{
  "editor.formatOnSave": true,
  "python.formatting.blackArgs": [],
  "python.formatting.provider": "black",
}
3w36zj63w36zj6

isort (Formatter)

importのソート用。

https://github.com/PyCQA/isort

rye add --dev isort

isortのフォーマットの設定をpyproject.tomlに追加する。Blackに設定を合わせる。

pyproject.toml
[tool.isort]
line_length = 120
multi_line_output = 3
include_trailing_comma = true
use_parentheses = true

実行は以下のコマンド。

isort ./src/

VS Codeでは.vscode/settings.jsonに以下を追加することで保存時にソートされる。

.vscode/settings.json
{
  "editor.codeActionsOnSave": {
    // isort
    "source.organizeImports": true
  },
}
3w36zj63w36zj6

Flake8 (Linter)

https://github.com/PyCQA/flake8

rye add --dev flake8

プロジェクトのルートに.flake8を作成する。以下のignoremax-line-lengthはBlackとの共存のために必須。他は好みで設定。

pyproject-flake8を使うことでpyproject.tomlに設定を書けるが今回は使用しない。

https://github.com/csachs/pyproject-flake8

.flake8
[flake8]
ignore = ["E203", "E501", "W503", "W504"]
max-line-length = 120

https://qiita.com/KuruwiC/items/8e12704e338e532eb34a

実行は以下のコマンド。

flake8 ./src/

VS Codeでは.vscode/settings.jsonに以下を追加することでFlake8が有効化される。

.vscode/settings.json
{
  "python.linting.enabled": true,
  "python.linting.flake8Enabled": true,
  "python.linting.flake8Args": [],
  "python.linting.lintOnSave": true,
  "python.linting.pylintEnabled": false,
}

flake8-annotations

関数の型アノテーションの確認用。

https://github.com/sco1/flake8-annotations

rye add --dev flake8-annotations

pep8-naming

命名規則の確認用。

https://github.com/PyCQA/pep8-naming

rye add --dev pep8-naming
3w36zj63w36zj6

Mypy (Type Checker)

型チェック用。Pylanceで使われているPyrightはこれだけnpmから入れる必要があり管理が煩わしいので、CLIではPyPIで入るこちらを使う。

https://github.com/python/mypy

rye add --dev mypy

実行は以下のコマンド。

mypy ./src/
3w36zj63w36zj6

pytest (Testing Framework)

テスト用。

https://github.com/pytest-dev/pytest

rye add --dev pytest

実行は以下のコマンド。

pytest ./tests/

VS Codeでは.vscode/settings.jsonに以下を追加することでテストを実行できる。

.vscode/settings.json
{
  "python.testing.pytestArgs": ["tests"], // ./tests/にテストファイルを入れる
  "python.testing.unittestEnabled": false,
  "python.testing.pytestEnabled": true,
}
3w36zj63w36zj6

VS Code

以下の拡張機能を入れる。

.vscode/extensions.json
{
  "recommendations": [
    "ms-python.python",
    "ms-python.vscode-pylance",
    "njpwerner.autodocstring"
  ]
}

Python

https://marketplace.visualstudio.com/items?itemName=ms-python.python

Pylance

https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance

autoDocstring - Python Docstring Generator

Docstringの生成用。

https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring

3w36zj63w36zj6

Python Project

フォーマットやリントやテストを簡単に行えるようにpyproject.tomlにスクリプトを追加する。

testpython -m pytestなのはimport src.xxxをできるようにするため。

pyproject.toml
[tool.rye.scripts]
format = { chain = ["black src", "isort src"] }
lint = { chain = ["black --check src", "isort -c -v src", "flake8 src", "mypy src"] }
test = { chain = ["python -m pytest tests"] }

実行にはrye runを使用する。

3w36zj63w36zj6

GitHub Actions

Pull Requestを開いた際にLintとTestを行うため、以下の.github/workflows/check-pull-request.ymlを作成する。

初回のみcargo installに時間がかかるが2回目からは高速に動く。

.github/workflows/check-pull-request.yml
name: Check Pull Request

on:
  pull_request:
    types: [opened, synchronize, reopened]

jobs:
  check-pull-request:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3
        with:
          ref: ${{ github.head_ref }}
      - name: Install Rye
        uses: baptiste0928/cargo-install@v2
        with:
          crate: rye
          git: https://github.com/mitsuhiko/rye
          branch: main
      - name: Install Dependencies
        run: rye sync
      - name: Lint
        run: rye run lint
      - name: Test
        run: rye run test
このスクラップは2023/09/10にクローズされました