Skip to main content

🐍 Pythonの開発環境テンプレート

この記事では、私がよく使うPython開発環境のテンプレートをまとめます。 私がご支援させていただくプロジェクトでは、こちらのページをベースにコーディング規則や開発環境を統一させていただくことが多いです。

🏅 Pythonバージョン

現在(2024/05/11)、Python3.10 or Python3.11 の利用を推奨しております。 Pythonには各バージョンにサポート期間が設定されており、商用ワークロードでは、サポート期間内でStatusがSecurityのバージョンを利用することが望ましいです。 最新のPythonバージョンとサポート状況はこちらのページをご確認ください。 最新のバージョンを利用しておいた方が、サポートが長いためリプレイスコストが削減できるというメリットがある一方、OSSや一部ライブラリが対応していないこともあるので、 これらを総合的に判断して、プロジェクトで利用するPython versionを決定するのが良いかと思います。

✅ コーディング規則と開発環境

コーディング規則やフォーマットの統一を強制するためにlinterやformatterを利用することは重要です。 細かいコーディング規則を頭で覚えて実装するのは手間とストレスがかかるという課題があります。 また、Pythonをよく使う機械学習エンジニアの中には、コード品質に興味のない方も多く、細かいルールを強制するとストレスになる可能性があります。 そこで、私がご支援させていただくプロジェクトでは、以下のツールを利用して、コーディング規則を意識せずとも、自動的に一定以上のコード品質を担保できる開発環境の利用を推奨します。

  • ruff: 高速なPythonのlinter兼formatterです。flake8、isort、blackなどの機能を1つのツールに統合しています。コードスタイル、ロジックエラー、importの順序などを検出し、自動修正する機能も備えています。
  • mypy: Pythonの静的型チェッカーです。型アノテーションを利用して、コードの型の整合性をチェックし、潜在的なバグを早期に発見するのに役立ちます。

また、pre-commitを利用し、これらのツールをgit commitをする際に自動実行する仕組みの導入を推奨します。

🔧 セットアップ

ruff, mypy のインストール

以下のコマンドを実行して、ruff, mypy をインストールします。

pip install ruff mypy

設定値

pyproject.tomlにて、設定値を指定します。

# mypyの設定
[tool.mypy]
python_version = "3.10"
show_error_context = true # エラー時のメッセージを詳細表示
show_column_numbers = true # エラー発生箇所の行数/列数を表示
disallow_untyped_defs = true # 関数定義の引数/戻り値に型アノテーション必須
no_implicit_optional = true # デフォルト引数に None を取る場合型アノテーションに Optional 必須
check_untyped_defs = true # 型注釈がない関数やメソッドに対して型チェックを行う
warn_redundant_casts = true # 冗長なキャストに警告
ignore_missing_imports = true # py.typed がないモジュールを使用する際の警告をスキップ
exclude = [ # 対象外のファイルを指定
]

# ruffの設定
[tool.ruff]
line-length = 108

# チェック対象のルールを指定
lint.select = ["ALL"]

# チェック対象から除外するルールを指定
lint.ignore = [
"D", # Docstringを中途半端にしか書いていないので、除外する
"PLR2004", # コード中のマジックナンバーを許容するため.
"TD002", # TODO の利用を自由にするため(以下2つも同様)
"TD003",
"FIX002",
]

target-version = "py310"

exclude = [ # 対象外のファイルを指定
]

[tool.ruff.lint.per-file-ignores]
"__init__.py" = ["F401"] # __init__.py 内でimportしているけど使われていないという警告を消すため.
"tests/*" = ["S101"] # testsでassertを利用するため.

[tool.ruff.lint.pydocstyle]
# docstring の設定
convention = "google"

🛠️ pre-commit の設定

git commit した際に自動でlinter, formatter, pytestのエラーがないかチェックするように設定します。

  1. pre-commit をインストール

    pip install pre-commit
  2. .pre-commit-config.yaml を作成する revは各linter, formatterのバージョンです。適宜インストールバージョンに揃えてください。

    repos:
    - repo: https://github.com/charliermarsh/ruff-pre-commit
    rev: v0.6.5
    hooks:
    - id: ruff
    args: [--fix, --exit-non-zero-on-fix]
    - repo: https://github.com/pre-commit/mirrors-mypy
    rev: v1.11.2
    hooks:
    - id: mypy
    - repo: local
    hooks:
    - id: pytest
    name: pytest
    entry: pytest
    language: system
    types: [python]
    pass_filenames: false
    always_run: true
  3. pre-commit を設定する

    pre-commit install

💻 Visual Studio Code の設定

Visual Studio Code の拡張機能周りの設定ファイルを作成します。

設定ファイルの作成

.vscode/settings.json を作成し、以下の内容を記述します

{
// mypyの設定
"mypy-type-checker.args": [
"--config=pyproject.toml"
],

// Ruffの設定
"[python]": {
// 保存時にコードを整理
"editor.formatOnSave": true,
// デフォルトのformatterにruffを指定
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.codeActionsOnSave": {
// 保存時にimportを整理
"source.organizeImports": "explicit"
}
},
// Ruffの設定を指定
"ruff.format.args": [
"--config=pyproject.toml"
],
}

推奨拡張機能一覧のファイルを作成

.vscode/extensions.json ファイルを追加し、プロジェクトに必要な拡張機能をエディタ側から推奨するようにします.

{
"recommendations": [
"ms-python.python",
"ms-python.vscode-pylance",
"charliermarsh.ruff",
]
}

参考文献