🚀 ニフティ’s Notion

【Webアプリ2025 #12】Linter / Formatter について

目次

Linter

Linterとは
lint(linter)とは、コンピュータプログラムなどのソースコードを読み込んで内容を分析し、問題点を指摘してくれる静的解析ツール。。また、そのようなツールで解析を行うこと。ツールを指す場合は “linter” (リンター)と呼ぶこともある。
参考: lint とは
  • ソースコードを解析して、潜在的なバグの検出や、規定されたルールに沿ってコードが書かれているかをチェックする静的解析ツールの1つ
    • コンパイラではチェックされないコードの記述に問題点がないかを確認する
      • エラーを検出し、報告してくれる
      • 実行時は問題ないが、潜在的なエラーの原因となる箇所の検出
    • 例 )
      • 変数初期化前に内容を参照
      • 未使用、重複している変数を検出
  • メリット
    • コード品質の向上
      • 潜在的なバグの検出
      • コーディングスタイルをチーム内で統一する
        • コードの書き方の差分が出ない
        • 標準的な書き方に従う
    • 自動化可能
      • CI/CDパイプライン等の開発サイクルの中に組み込み、機械的にチェックできる
      • 開発者が手動でスタイルチェックやバグ検出を行う必要がなくなる
pep8 → pycodestyle
  • Pythonの公式ガイドラインPEPの中の1つである PEP8 に準拠しているかどうかをチェックする専用ツール
  • 昔はツール名も pep8 だったが pycodestyle にリネームされた
flake8
  • pyflakes (構文エラー・未使用変数)+ pycodestyle + mccabe という3つのLinterのラッパー
  • プラグインでルールを増やせる
    • 例: flake8-docstrings , flake8-import-order
ruff
  • Rust 製の超高速 Linter
  • Black、isort、mccabe、pyupgrade など、他のLinterが持っている多くのルールをカバー
    • 約81パターン 600ルール
  • pyproject.toml で設定を管理する
    [tool.ruff.lint]
    select = [
        "E",   # pycodestyle errors
        "W",   # pycodestyle warnings
        "F",   # pyflakes
        "I",   # isort
        "B",   # flake8-bugbear
        "C4",  # flake8-comprehensions
        "DTZ", # flake8-datetimez
        "T20", # flake8-print
        "C90", # mccabe
        "UP",  # pyupgrade
        "PT",  # pytest-style
        "D",   # pydocstyle
    ]
    ignore = [
        "D100", # Missing docstring in public module / Excessive documentation
        "D104", # Missing docstring in public package / Excessive documentation
        "D105", # Missing docstring in magic method / Excessive documentation
        "D400", # First line should end with a period / Not suitable for japanese
        "D415", # First line should end with a period, question mark, or exclamation point / Not suitable for japanese
    ]
使い方
pip install ruff

# linter
ruff check .
ruff check . --fix

Formatter

formatter とは
フォーマッター(formatter)とは、整形や区画付けといった意味を持つ「フォーマット」(format)操作を行うためのソフトウェアや機能などのこと。具体的な処理の内容は分野や対象によって異なる。
参考: フォーマッターとは
  • 規定されたルールに基づいてコードを整形するツール
    • コーディング規約に従って、コードの意味を変えずに構成を調整する
    • プログラムの動作ではなく見た目に関わる内容
    • 例 )
      • スペースの数や挿入位置
      • インデントの調整、改行
      • シングルクォートやダブルクォートの統一
      • 一行あたりの最大文字数
        • など
  • メリット
    • 一貫性のあるコーディング
      • 個人間のスタイルのばらつきが抑えられる
      • 可読性と保守性の向上
      • コードレビューの効率化
    • 自動化
      • CI/CDパイプライン等の開発サイクルの中に組み込み、機械的にチェックできる
      • 開発者が手動でスタイルチェックやバグ検出を行う必要がなくなる
autopep8
  • PEP 8 違反を自動修正するツール
    • pycodestyle で検出されたスタイル違反に対し、修正を行う
  • 一部の違反しか修正できない
Black
  • 「意見の強いフォーマッター」として登場
  • Black が定める厳格なスタイルガイドに従ってコードを一律に整形する
    • 柔軟な設定はあえて捨て、常に同じ整形結果になるのが特徴
    • 「Black に従う or 従わない」の二択で設定オプションが少ない
  • pyproject.toml で設定を管理する
Ruff
  • 元々は高速な linter として開発されたが、フォーマット機能も搭載
    • Black 互換の整形も可能
  • isort 的な import 整形やblack の代替として 、Ruff 一本で完結する構成も増えている
  • pyproject.toml で設定を管理する

使い方
pip install ruff

# linter
ruff format .
ruff format --check .

Mypy

  • Pythonコードに書かれた型アノテーションを見て、それが正しく使われているかを静的にチェックするツール
    • Python自体は型アノテーションを全く見ない(コメント扱い)
  • 実行前に型エラーを検出できるため、「動かしてみないとわからないバグ」を防ぎやすくなる
  • 型情報は PEP 484 に基づいて記述

  • チェック項目
    機能 説明
    関数の引数・戻り値 型アノテーションと実際の使用が一致してるか
    クラスの属性 正しい型が使われているか、未定義の属性を使っていないか
    Union, Optional 型が混ざっているときの取り扱い
    ジェネリクス list[str] , dict[str, int] など
    カスタム型エイリアス UserId = NewType("UserId", int) など
使い方
pip install mypy

mypy .

パッケージ マネージャ

パッケージマネージャとは

おおまかに2つ

  • OSレベルの機能やソフトウェアパッケージを管理するもの
    • apt , yum , dnf , brew など
  • ソフトウェア開発時に使用する機能部品や実行部品を管理するもの
    • npm , pip

    → 今回は後者

参考:

主な機能

  • パッケージのインストールとアンインストール
    • 必要なパッケージのインストール
    • 不要になったパッケージの完全な削除
  • バージョン管理
    • インストール済みパッケージの一覧表示と状態確認
    • 最新版へのアップグレードや、特定バージョンへの切り替えが可能
  • 依存関係の自動解決
    • 必要な関連パッケージを自動的に検出してインストール

poetry
  • Pythonの依存関係管理とパッケージングのためのツール
  • プロジェクトが依存するライブラリ自動的に管理(インストール/アップデート)
  • 社内仕様事例 多
  • pyproject.toml , poetry.lock でパッケージとバージョン、それらの依存関係を管理する
    • 本来欲しいパッケージは pyproject.toml で、依存関係によりインストールされたものの管理は .lock ファイルで管理される
  • 導入方法
    pip install poetry
    brew install poetry
    
    poetry add package-name
uv
  • Rust製で高速
  • 従来の poetry と比較して依存関係の解決やパッケージのインストールが高速
    • .python-version で指定したバージョンの仮想環境を作成する
    • pyproject.toml , uv.lock でパッケージとバージョン、それらの依存関係を管理する
  • 基本はuvを使って欲しい
  • 導入方法
    pip install uv
    brew install uv
    
    uv init
    uv add package-name
    uv run app.py