Ruff vs Black: CIのPythonフォーマッターにはどちらを選ぶ?
RuffのフォーマッターはBlack互換の出力を目指す高速なもので、同じバイナリでlintも行います。
Blackは広く採用されている、主張の強いPythonコードフォーマッターです。Ruff(Astral製)は、Blackとの高い互換性を目指して設計されたフォーマッターを含み、はるかに高速に動作し、Ruffのリンターと1つのツールに統合されています。
| Black | Ruff (format) | |
|---|---|---|
| 実装 | Python | Rust |
| 速度 | 遅い | 非常に速い |
| Black互換性 | 該当なし(基準そのもの) | 設計上高い |
| Linting | なし(フォーマットのみ) | あり(lint + format) |
| 採用状況 | 広く普及 | 急速に拡大中 |
CIでは
format --checkステップはpushのたびに実行されます。Ruffはこれを目に見えて高速化し、Blackに加えてリンターを1つのバイナリで置き換えられます。RuffのフォーマッターはBlack互換の出力を目指すため、ほとんどのコードベースでは切り替え時のフォーマットの差分はわずかです。Blackは依然として基準となるフォーマッターであり、最も幅広いエコシステムの馴染みとエディタサポートを持ちます。
移行の手間
小さな差分を吸収するため、ruff formatをリポジトリ全体に1つのコミットで実行し、その後CIで強制しましょう。出力は設計上Black互換なので、churnは通常低くなります。特定のツールやワークフローが明示的に必要とする場合のみBlackを残しましょう。
結論
Black互換の出力で高速なフォーマット(に加えてlint)を1つのツールで: Ruff。最大のエコシステムの馴染みを持つ基準となるフォーマッターが欲しい: Black。切り替えはchurnが少なく、1つのコミットで再フォーマットできます。
関連ガイド
Ruff vs Flake8: Which Python Linter for CI?Ruff vs Flake8 for Python CI: lint speed, rule coverage, plugins, and consolidation. Which linter keeps your…
mypy vs Pyright: Which Python Type Checker for CI?mypy vs Pyright for Python CI: speed, strictness, editor integration, and inference. Which static type checke…
How to Speed Up GitHub Actions: 9 High-Impact TacticsMake GitHub Actions faster: caching, parallelization, test splitting, Docker layer caching, slimmer images, a…