TL;DR: Ruff は Rust で書かれた Python コードチェックツール(リンター+フォーマッター)で、Flake8 より 10〜100 倍高速です。30 万行の超大規模プロジェクトでもわずか 0.5 秒でチェックできます。2026 年現在、Ruff は Python エコシステムのデファクトスタンダードなコード品質ツールとして、Instagram、PyTorch、Jupyter、Apache Airflow といった有名プロジェクトで採用されています。この記事では Ruff のインストールから設定、Flake8/Black/isort からの完全移行ガイドまで、ゼロから使い方を解説します。

1. Ruff とは?

Ruff は Astral チーム(uv と同じチーム)によって Rust で開発された、Python エコシステム向けのオールインワン型コードチェックツールです。以下の複数のツールを統合しています。

置き換えられるツール 機能 Ruff ルールプレフィックス
Flake8 コードスタイルチェック F, E, W
Black コードフォーマット -
isort import のソート I
pyupgrade Python バージョンアップ推奨 UP
pylint 高度なコード検査 PL, SIM, C901
autoflake 未使用 import の自動削除 F401, F841

Ruff がこんなに速い理由は?

  1. Rust コンパイル済み:Rust の性能は Python を大幅に上回り、解析速度が桁違いです
  2. 並列処理:複数コアを自動活用してファイルを並列スキャンします
  3. ゼロ依存:Python ランタイム不要。単一バイナリで動作します
  4. 増分キャッシュ:変更されたファイルのみをチェックするので、2 回目の実行はほぼ瞬時に完了します

Ruff の GitHub リポジトリ:https://github.com/astral-sh/ruff ⭐ 2026 年時点で Star 数が 35,000 を突破しています。

2. Ruff のインストール

Ruff はいくつかの方法でインストールできます。pip または公式インストールスクリプトがおすすめです。

BASH
# 方法 1:pip を使用(推奨)
pip install ruff

# 方法 2:uv を使用(より高速)
uv tool install ruff

# 方法 3:macOS Homebrew
brew install ruff

# 方法 4:公式インストールスクリプト
curl -LsSf https://astral.sh/ruff/install.sh | sh

# インストール確認
ruff --version
# 出力:ruff 0.9.x

インストールが完了すると、Ruff には主に 2 つのコマンドが用意されています。

  • ruff check:コードチェック(リンターモード)
  • ruff format:コードフォーマット(フォーマッターモード)

3. クイックスタート:5 分でプロジェクトをチェック

テストファイル hello.py を作成します。

PYTHON
import os
import sys
import json  # unused

def  hello_world():
    x=1+2
    print("hello world")
    return x

if __name__ == "__main__":
    hello_world()

3.1 コードチェックの実行

BASH
ruff check hello.py

出力例:

hello.py:1:8: F401 [*] `os` imported but unused
hello.py:2:8: F401 [*] `sys` imported but unused
hello.py:3:8: F401 [*] `json` imported but unused
hello.py:5:1: W293 [*] Blank line contains whitespace
hello.py:7:6: E225 [*] Missing whitespace around operator
Found 5 errors.
[*] 5 fixable with the `--fix` option.

Ruff は 5 つの問題を正確に検出しました。未使用の import が 3 つ、余分な空白行が 1 つ、演算子の前後にスペースがないのが 1 つです。各エラーには --fix で自動修正可能かどうかの表示が付いています。

3.2 自動修正

BASH
ruff check --fix hello.py

実行後のファイル内容は自動的に修正されます。

PYTHON
def hello_world():
    x = 1 + 2
    print("hello world")
    return x

if __name__ == "__main__":
    hello_world()

3.3 コードフォーマット

BASH
ruff format hello.py

ruff format は Black と似ており、インデント、空行、クォートスタイルなどを自動調整して、プロジェクト全体のコードスタイルを統一します。

4. 設定ファイルの詳細

プロジェクトのルートディレクトリに pyproject.toml を作成して Ruff を設定します。

TOML
[tool.ruff]
# 対象 Python バージョン
target-version = "py312"
# 1 行の文字数制限
line-length = 88
# チェック対象のディレクトリ
src = ["src", "tests"]
# 除外するディレクトリ
exclude = [
    ".git",
    ".venv",
    "__pycache__",
    "build",
    "dist",
]

[tool.ruff.lint]
# 有効にするルールセット
select = [
    "E",      # pycodestyle エラー
    "W",      # pycodestyle 警告
    "F",      # pyflakes
    "I",      # isort(import ソート)
    "UP",     # pyupgrade(バージョンアップ推奨)
    "B",      # flake8-bugbear(一般的なバグパターン)
    "SIM",    # flake8-simplify(コード簡素化)
    "RUF",    # Ruff 独自ルール
]
# 無視するルール
ignore = [
    "E501",   # 行が長すぎる(フォーマッターに任せる)
    "E402",   # import がファイルの先頭にない(一部のスクリプトで必要)
]
# 許容される最大複雑度
mccabe.max-complexity = 10

[tool.ruff.lint.per-file-ignores]
# テストファイルでは一部のルールを無視
"tests/**/*.py" = ["S101", "PLR2004"]
# マイグレーションファイルでは全ルール無視
"**/migrations/*.py" = ["ALL"]

[tool.ruff.format]
# クォートスタイル:シングルクォートまたはダブルクォート
quote-style = "double"
# インデントの種類
indent-style = "space"
# 末尾の改行
skip-magic-trailing-comma = false

4.1 よく使うルールセットの説明

ルールセット 説明 代表的なルール
E/W pycodestyle スタイルチェック E501 行が長すぎる、W292 ファイル末尾に改行がない
F pyflakes エラー検出 F401 未使用 import、F841 未使用変数
I import ソート I001 import の順序が正しくない
UP Python バージョンアップ UP006 typing.List ではなく list を使用
B bugbear 一般的なバグ B006 可変なデフォルト引数、B007 未使用のループ変数
SIM コード簡素化 SIM101 重複する isinstance、SIM108 三項演算子の使用
RUF Ruff 独自ルール RUF001 あいまいな文字、RUF005 結合ではなく展開

5. Black/isort/Flake8 からの完全移行ガイド

それまで Black + isort + Flake8 の組み合わせを使っていたプロジェクトは、Ruff に完全に移行できます。

5.1 旧ツールのアンインストール

BASH
pip uninstall black isort flake8 autoflake pyupgrade -y

5.2 Ruff の動作を互換に設定

pyproject.toml に Black 互換の設定を追加します。

TOML
[tool.ruff]
line-length = 88          # Black のデフォルト行幅
target-version = "py312"

[tool.ruff.format]
quote-style = "double"    # Black のデフォルトはダブルクォート
indent-style = "space"

[tool.ruff.lint]
select = ["E", "W", "F", "I"]

5.3 プロジェクト全体を一括修正

BASH
# ステップ 1:すべての Python ファイルをフォーマット
ruff format .

# ステップ 2:チェックして自動修正
ruff check --fix .

# ステップ 3:残りの問題を確認(自動修正しない)
ruff check .

5.4 pre-commit との統合

.pre-commit-config.yaml を作成します。

YAML
repos:
  - repo: https://github.com/astral-sh/ruff-pre-commit
    rev: v0.9.0
    hooks:
      # フォーマットを先に実行
      - id: ruff-format
      # その後チェック
      - id: ruff
        args: [--fix, --exit-non-zero-on-fix]

pre-commit フックをインストールします。

BASH
pip install pre-commit
pre-commit install

これで git commit のたびに、Ruff がステージングされたファイルのフォーマットとチェックを自動実行します。

6. CI/CD 統合の実践

6.1 GitHub Actions

YAML
name: Ruff Check

on: [push, pull_request]

jobs:
  ruff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.12"

      - name: Install Ruff
        run: pip install ruff

      - name: Run Ruff format check
        run: ruff format --check .

      - name: Run Ruff lint
        run: ruff check --output-format=github .

6.2 GitLab CI

YAML
ruff:
  image: python:3.12-slim
  stage: test
  script:
    - pip install ruff
    - ruff format --check .
    - ruff check .
  allow_failure: true  # 最初は失敗を許可しておくと安心

6.3 大規模プロジェクトでのパフォーマンス最適化

超大規模プロジェクトでは、以下の最適化戦略が使えます。

BASH
# 変更されたファイルのみをチェック(CI 向け)
ruff check --diff .

# SARIF 形式で出力(GitHub Code Scanning 用)
ruff check --output-format=sarif . > results.sarif

# 特定のルールのみチェック
ruff check --select=F,E .

# Ruff の設定とキャッシュ状態を確認
ruff check --show-settings .

7. Ruff と競合ツールの比較

特徴 Ruff Flake8 Black + isort
言語 Rust Python Python
速度 ⚡ 極高速(ミリ秒単位) 低速(秒単位) 中程度
機能範囲 リンター+フォーマッター リンターのみ フォーマッターのみ
プラグインエコシステム 組み込みルール 豊富なプラグイン プラグイン拡張
自動修正 ✅ 対応 ❌ 非対応 ✅ 対応
設定方法 pyproject.toml .flake8/.cfg pyproject.toml
Python 依存 Python 不要 必要 必要

パフォーマンス実測

50 万行のプロジェクトでの計測結果:

  • Ruff check:0.3 秒
  • Flake8:45 秒
  • pylint:120 秒

Ruff は Flake8 より約 150 倍、pylint より約 400 倍 高速です。

8. 上級者の使い方

8.1 カスタムルール

Ruff は pyproject.toml でルールの重要度をカスタマイズできます。

TOML
[tool.ruff.lint]
select = ["E", "F", "W"]

# 一部のルールをエラーではなく警告に設定
[tool.ruff.lint.flake8-errmsg]
max-string-length = 20

[tool.ruff.lint.pydocstyle]
convention = "google"  # または "numpy", "pep257"

8.2 IDE との統合

VS Code:公式の Ruff 拡張機能 をインストールすると以下の機能が使えます。 - リアルタイムの lint チェック - 保存時に自動フォーマット - ワンクリックで修正案を適用

JSON
// .vscode/settings.json
{
  "[python]": {
    "editor.defaultFormatter": "charliermarsh.ruff",
    "editor.codeActionsOnSave": {
      "source.fixAll.ruff": "explicit"
    }
  }
}

PyCharm:External Tools で設定します。 - Settings → Tools → External Tools を開く - Ruff を追加:Program は ruff、Arguments は check --fix $FilePath$

8.3 増分チェック(Watch モード)

BASH
# ファイルの変更を監視して自動再チェック
ruff check --watch .

8.4 HTML レポートの生成

BASH
# JSON 形式で出力。jq で処理可能
ruff check --output-format=json . | jq '.'

# または sarif 形式で GitHub Code Scanning と連携
ruff check --output-format=sarif . > ruff-results.sarif

9. よくある質問

Q1:Ruff は Flake8 を完全に置き換えられますか?

ほとんどの場合、はい。 Ruff は Flake8 の大部分のルール(E、W、F シリーズ)と、一般的なプラグインのルール(bugbear、eradicate など)を内蔵しています。ただし、非常にニッチな Flake8 プラグインを使っている場合は、Ruff に同等の実装があるか確認する必要があります。

Q2:Ruff は pylint の代わりになりますか?

完全に置き換えることはできません。 Ruff はコードスタイルと一般的なバグ検出に重点を置いていますが、pylint はより深いコード品質分析(複雑度スコアリング、重複コード検出など)を提供します。日常の開発には Ruff で十分ですが、厳格な品質監査には Ruff と pylint の併用がおすすめです。

Q3:Ruff の --fix は安全ですか?

非常に安全です。 Ruff の自動修正は明確な修正戦略があるルールにのみ適用され、セマンティックな変更は行いません。修正前には ruff check --diff . で変更内容を確認することをおすすめします。

Q4:Ruff はどの Python バージョンに対応していますか?

Ruff 自体は Python 3.7 〜 3.13 のコードチェックに対応しています。target-version で対象の Python バージョンを指定すれば、適切なアップグレード推奨も受けられます。

10. まとめ

Ruff は Python エコシステムのコード品質インフラとして定着しつつあります。Rust がもたらす圧倒的なパフォーマンス、豊富な内蔵ルール、そしてリンター+フォーマッターの一体化体験により、Python プロジェクトのコード品質管理がこれまでにないほどシンプルで効率的になりました。

アクションプラン:

  1. pip install ruff でインストール
  2. プロジェクトで ruff check --fix . + ruff format . を実行
  3. pyproject.toml でルールをカスタマイズ
  4. pre-commit と CI/CD パイプラインに統合

これだけで、プロジェクトのコード品質は劇的に向上します。しかも、すべて数分で完了します。


関連リンク: