チームでプロジェクトを開発するときに、コミットメッセージがバラバラだったり、ソースコードのフォーマットが統一されなかったりして、困ってますので、それを防ぐために自動リント・フォーマッターツールを利用します。
本記事で使用する各種ツールのバージョンは以下通りです。
ツール名 | バージョン |
---|---|
PyCharm | 2023.3.4 (Professional Edition) |
Python | 3.11.7 |
black | 24.3.0 |
flake8 | 7.0.0 |
isort | 5.13.2 |
mypy | 1.9.0 |
docformatter | 1.7.5 |
pre-commit | 3.6.2 |
プロジェクト作成
PyCharm で適宜に新しいプロジェクトを作成します。下記のはピュアの Python プロジェクトを作成する場合の一例になります。
項目名 | 設定値 |
---|---|
(種類) | pure Python |
名前 | python-dev-env |
場所 | <省略...> |
Git リポジトリの作成 | はい |
main.py ウェルカムスクリプトの作成 | はい |
インタープリターのタイプ | プロジェクト venv |
Python バージョン | Python 3.11.7 |
pip を更新
ターミナルパネルを開き、python -m pip install --upgrade pip
を実行して pip
をアップグレードしておきます。
Black
ターミナルにて、pip install black
を実行し、Black をインストールしてから、ファイルウォッチャーの設定を行います。
メニューから PyCharm
→ Settings...
をクリックし設定画面を開きます。
ツール
→ File Watchers
→ +
(追加) → custom
をクッリクし、開いた画面にて以下の値で設定を完成させます。
項目名 | 設定値 |
---|---|
名前 | black |
ファイルタイプ | Python |
スコープ | 現在のファイル |
プログラム | $PyInterpreterDirectory$/black |
引数 | $FilePath$ |
リフレッシュする出力パス | $FilePath$ |
編集したファイルを自動保存してウォッチャーをトリガーする | いいえ |
外部の変更でウォッチャーをトリガーする | はい |
構文エラーに関係なくウォッチャーをトリガーする | いいえ |
標準出力から出力ファイルを作成 | いいえ |
ルートディレクトリーで、設定ファイル pyproject.toml
を作成し、以下の内容を追記します。
1[tool.black] 2line-length = 88
実は、PyCharm で Black の自動整形方法は2つあります。本文ではファイルウォッチャーを利用する方法を説明しましたが、もう一つは PyCharm 内臓の Black ツール機能を利用する方法もあります。この方法は後ほど紹介する isort の整形と衝突してしまい、動作が不安定になりますので、isort も使う予定の場合は薦めしません。興味がある方はPyCharm で Black によるソースコード自動フォーマットの設定方法へどうぞ。
Flake8
ターミナルにて、pip install flake8
を実行し、Flake8 をインストールしてから、ファイルウォッチャーの設定を行います。
メニューから PyCharm
→ Settings...
をクリックし設定画面を開きます。
ツール
→ File Watchers
→ +
(追加) → custom
をクッリクし、開いた画面にて以下の値で設定を完成させます。
項目名 | 設定値 |
---|---|
名前 | flake8 |
ファイルタイプ | Python |
スコープ | 現在のファイル |
プログラム | $PyInterpreterDirectory$/flake8 |
引数 | $FilePath$ |
リフレッシュする出力パス | $FilePath$ |
編集したファイルを自動保存してウォッチャーをトリガーする | いいえ |
外部の変更でウォッチャーをトリガーする | はい |
構文エラーに関係なくウォッチャーをトリガーする | いいえ |
標準出力から出力ファイルを作成 | いいえ |
Flake8 の設定ファイルは、 pyproject.toml
形式をサポートしていないので、setup.cfg
を使います。ルートディレクトリーで作成し、以下の内容を追記します。
1[flake8] 2max-line-length = 88 3exclude = .venv
isort
ターミナルにて、pip install isort
を実行し、isort をインストールしてから、ファイルウォッチャーの設定を行います。
メニューから PyCharm
→ Settings...
をクリックし設定画面を開きます。
ツール
→ File Watchers
→ +
(追加) → custom
をクッリクし、開いた画面にて以下の値で設定を完成させます。
項目名 | 設定値 |
---|---|
名前 | isort |
ファイルタイプ | Python |
スコープ | 現在のファイル |
プログラム | $PyInterpreterDirectory$/isort |
引数 | $FilePath$ |
リフレッシュする出力パス | $FilePath$ |
編集したファイルを自動保存してウォッチャーをトリガーする | いいえ |
外部の変更でウォッチャーをトリガーする | はい |
構文エラーに関係なくウォッチャーをトリガーする | いいえ |
標準出力から出力ファイルを作成 | いいえ |
設定ファイル pyproject.toml
に以下の内容を追記します。
1[tool.isort] 2profile = "black"
mypy
ターミナルにて、pip install mypy
を実行し、mypy をインストールしてから、ファイルウォッチャーの設定を行います。
メニューから PyCharm
→ Settings...
をクリックし設定画面を開きます。
ツール
→ File Watchers
→ +
(追加) → custom
をクッリクし、開いた画面にて以下の値で設定を完成させます。
項目名 | 設定値 |
---|---|
名前 | mypy |
ファイルタイプ | Python |
スコープ | 現在のファイル |
プログラム | $PyInterpreterDirectory$/mypy |
引数 | --config-file $ContentRoot$/pyproject.toml $FilePath$ |
リフレッシュする出力パス | $FilePath$ |
編集したファイルを自動保存してウォッチャーをトリガーする | いいえ |
外部の変更でウォッチャーをトリガーする | はい |
構文エラーに関係なくウォッチャーをトリガーする | いいえ |
標準出力から出力ファイルを作成 | いいえ |
設定ファイル pyproject.toml
に以下の内容を追記します。
1[tool.mypy] 2python_version = "3.11"
docformatter
ターミナルにて、pip install docformatter
を実行し、docformatter をインストールしてから、ファイルウォッチャーの設定を行います。
メニューから PyCharm
→ Settings...
をクリックし設定画面を開きます。
ツール
→ File Watchers
→ +
(追加) → custom
をクッリクし、開いた画面にて以下の値で設定を完成させます。
項目名 | 設定値 |
---|---|
名前 | docformatter |
ファイルタイプ | Python |
スコープ | 現在のファイル |
プログラム | $PyInterpreterDirectory$/docformatter |
引数 | $FilePath$ |
リフレッシュする出力パス | $FilePath$ |
編集したファイルを自動保存してウォッチャーをトリガーする | いいえ |
外部の変更でウォッチャーをトリガーする | はい |
構文エラーに関係なくウォッチャーをトリガーする | いいえ |
標準出力から出力ファイルを作成 | いいえ |
設定ファイル pyproject.toml
に以下の内容を追記します。
1[tool.docformatter] 2in-place = true 3pre-summary-newline = true
pre-commit
コミット時に、上記で設定した全てのリント・フォーマット処理を自動実行に加えてコミットメッセージのフォーマットまでチェックするようにします。
ターミナルにて、pip install pre-commit
を実行し、pre-commit をインストールします。次にルートディレクトリーで .pre-commit-config.yaml
ファイルを作成し、以下の内容を追記します。
1default_install_hook_types: 2 - pre-commit 3 - commit-msg 4 5repos: 6 - repo: https://github.com/pre-commit/pre-commit-hooks 7 rev: v4.5.0 8 hooks: 9 - id: check-yaml 10 name: Check yaml files 11 - id: check-toml 12 name: Check toml files 13 - id: check-added-large-files 14 name: Check large files 15 - id: requirements-txt-fixer 16 name: Sort entries in requirements files 17 files: requirements.txt$ 18 - id: end-of-file-fixer 19 name: Fix end of files 20 exclude: ^.idea/ 21 - id: trailing-whitespace 22 name: Trim trailing whitespace 23 24 - repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook 25 rev: v9.11.0 26 hooks: 27 - id: commitlint 28 name: Validate commit messages 29 stages: [commit-msg] 30 additional_dependencies: ['@open-turo/commitlint-config-conventional'] 31 32 - repo: https://github.com/pycqa/flake8 33 rev: 7.0.0 34 hooks: 35 - id: flake8 36 name: Linting with Flake8 37 args: ['--config', './setup.cfg'] 38 39 - repo: https://github.com/psf/black 40 rev: 24.2.0 41 hooks: 42 - id: black 43 name: Linting with Black 44 45 - repo: https://github.com/pycqa/isort 46 rev: 5.13.2 47 hooks: 48 - id: isort 49 name: Linting with isort 50 51 - repo: https://github.com/pre-commit/mirrors-mypy 52 rev: v1.8.0 53 hooks: 54 - id: mypy 55 name: Linting with mypy 56 57 - repo: https://github.com/PyCQA/docformatter 58 rev: v1.7.5 59 hooks: 60 - id: docformatter 61 name: Linting with docformatter 62 additional_dependencies: [tomli]
コミットメッセージのフォーマットチェック用の設定ファイル .commitlintrc.yaml
を作成し、以下の内容を追記します。
1extends: 2 - '@open-turo/commitlint-config-conventional' 3 4rules: 5 header-max-length: [2, 'always', 72] 6 body-leading-blank: [2, 'always']
ターミナルにて、pre-commit install
を実行し、プレコミットのフックをインストールします。
GitHub Actions
ルートディレクトリーで .github/workflows/develop.yaml
デレクトリーとファイルを作成し、以下の内容を追記します。
1name: Develop 2 3on: 4 - push 5 6jobs: 7 linter: 8 runs-on: ubuntu-latest 9 strategy: 10 max-parallel: 2 11 matrix: 12 python-version: ['3.10', '3.11', '3.12'] 13 steps: 14 - name: Check out the repo 15 uses: actions/checkout@v4 16 17 - name: Set up Python ${{ matrix.python-version }} 18 uses: actions/setup-python@v5 19 with: 20 python-version: ${{ matrix.python-version }} 21 22 - name: Install dependencies 23 run: | 24 python -m pip install --upgrade pip 25 pip install -r requirements.txt 26 27 - name: Run Flake8 28 run: flake8 --config ./setup.cfg 29 30 - name: Run Black 31 run: black . 32 33 - name: Run isort 34 run: isort . 35 36 - name: Run mypy 37 run: mypy --config-file ./pyproject.toml . 38 39 - name: Run docformatter 40 run: docformatter -r .
最後に
完成版はこちらへ