Python Rye+Black+Ruff+pytestによるVS Codeの開発環境構築
Rye (Package Manager)
rye init
でプロジェクトを作成する。Pythonのバージョンはrye pin
で指定しておく。
これ以降、依存関係はrye add --dev
で追加し、rye sync
で環境を同期させる。
Black (Formatter)
rye add --dev black
Blackのフォーマットの設定をpyproject.toml
に追加する。以下はデフォルトの行の長さが短いので120に変更している。
[tool.black]
line-length = 120
実行は以下のコマンド。
black ./src/
VS Codeでは.vscode/settings.json
に以下を追加することで保存時にフォーマットされる。
{
"editor.formatOnSave": true,
"[python]": {
"editor.defaultFormatter": "ms-python.black-formatter"
},
"black-formatter.importStrategy": "fromEnvironment"
}
Ruff (Linter)
Installation
rye add --dev ruff
Usage
check
は省略可。--fix
で修正が入る。
ruff check . # Lint all files in the current directory (and any subdirectories)
ruff check path/to/code/ # Lint all files in `/path/to/code` (and any subdirectories)
ruff check path/to/code/*.py # Lint all `.py` files in `/path/to/code`
ruff check path/to/code/to/file.py # Lint `file.py`
Configuration
pyproject.toml
に対応しているのでそこに書く。
[tool.ruff]
line-length = 120
select = ["ALL"]
ignore = ["EXE", "T20", "E501", "D203", "D212"]
[tool.ruff.pydocstyle]
convention = "google"
ルールは以下から確認。
厳しくしたいのであればselect = ["ALL"]
としておいて不要なものだけignore
で指定するとよい。
VS Codeでは.vscode/settings.json
に以下を追加することで保存時にフォーマットされる。
{
"[python]": {
"editor.codeActionsOnSave": {
"source.fixAll.ruff": true,
"source.organizeImports.ruff": true
}
}
}
pytest (Testing Framework)
テスト用。
rye add --dev pytest
実行は以下のコマンド。
pytest ./tests/
VS Codeでは.vscode/settings.json
に以下を追加することでテストを実行できる。
{
"python.testing.pytestArgs": ["tests"], // ./tests/にテストファイルを入れる
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true,
}
Mypy (Type Checker)
型チェック用。Pylanceで使われているPyrightはこれだけnpmから入れる必要があり管理が煩わしいので、CLIではPyPIで入るこちらを使う。
RuffではMypyを完全に置き換えることはできない。詳細は以下を参照。
rye add --dev mypy
[tool.mypy]
strict = true # 好みで
実行は以下のコマンド。
mypy ./src/
Pylance (Language Server)
補完や型チェックなど用。VS Codeから使う。
VS Codeでは.vscode/settings.json
に以下を追加することでPylanceが有効化される。
{
"python.languageServer": "Pylance",
"python.analysis.typeCheckingMode": "basic" // 厳しくしたい場合はstrict
}
VS Code Extension
以下の拡張機能を入れる。
{
"recommendations": [
"ms-python.python",
"ms-python.black-formatter",
"ms-python.mypy-type-checker",
"ms-python.vscode-pylance",
"charliermarsh.ruff",
"njpwerner.autodocstring"
]
}
Python
Pylance
Black
Mypy
Ruff
autoDocstring - Python Docstring Generator
Docstringの生成用。
Python Project
フォーマットやリントやテストを簡単に行えるようにpyproject.toml
にスクリプトを追加する。
test
がpython -m pytest
なのはimport src.xxx
をできるようにするため。
[tool.rye.scripts]
format = { chain = ["black src", "ruff check --fix src"] }
lint = { chain = ["black --check src", "ruff check src", "mypy src"] }
test = { chain = ["python -m pytest tests"] }
実行にはrye run
を使用する。
pre-commit (Git Hooks)
rye add --dev pre-commit
GitHub Actions (CI/CD)
Pull Requestを開いた際にLintとTestを行うため、以下の.github/workflows/check-pull-request.yml
を作成する。
初回のみcargo install
に時間がかかるが2回目からは高速に動く。
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
MkDocs (Documentation)
EditorConfig
root = true
[*]
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
charset = utf-8
[*.py]
indent_style = space
indent_size = 4