PyCharm + Black + Flake8 + isort + mypy + docformatter + pre-commit + GitHub Actions 開発環境作成

本文で使用する各種ツールのバージョンは以下通りです。

ツール名バージョン
PyCharm2023.3.4 (Professional Edition)
Python3.11.7
black24.3.0
flake87.0.0
isort5.13.2
mypy1.9.0
docformatter1.7.5
pre-commit3.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 を作成し、以下の内容を追記します。

1#file: noinspection YAMLIncompatibleTypes 2 3extends: 4 - '@open-turo/commitlint-config-conventional' 5 6rules: 7 header-max-length: [2, 'always', 72] 8 body-leading-blank: [2, 'always']

ターミナルにて、pre-commit install を実行し、プレコミットのフックをインストールします。

GitHub Actions

ルートディレクトリーで .github/workflows/develop.yaml デレクトリーとファイルを作成し、以下の内容を追記します。

name: Develop

on:
  - push

jobs:
  linter:
    runs-on: ubuntu-latest
    strategy:
      max-parallel: 2
      matrix:
        python-version: ['3.10', '3.11', '3.12']
    steps:
      - name: Check out the repo
        uses: actions/checkout@v4

      - name: Set up Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install -r requirements.txt

      - name: Run Flake8
        run: flake8 --config ./setup.cfg

      - name: Run Black
        run: black .

      - name: Run isort
        run: isort .

      - name: Run mypy
        run: mypy --config-file ./pyproject.toml .

      - name: Run docformatter
        run: docformatter -r .

完成版

完成版は こちら