Pythonでコードを書いていると、「このインデントおかしくない?」 「importの順番これでいいんだっけ?」みたいな細かいところが気になります。
最近は、エディタの機能でほぼなんとかなるのですが、たまにコピー&ペーストをVimなどに行うとズレてひどい目に合うこともあります。
そんなときに活躍するのがリンター(コードのチェックツール)やフォーマッター(コードの整形ツール)です。
従来はflake8でチェックしてblackで整形してisortでimportを並べ替えて……と、複数のツールを組み合わせる必要があり正直ちょっと面倒でした🥲
そこで、Ruffという、これらの機能を1つのツールに統合した、Rust製の高速リンター&フォーマッターとなります。しかも圧倒的に速い。従来のツールと比べて10〜100倍速いと言われています。
この記事では、Ruffをグローバルインストールして、どのプロジェクトでもすぐに使えるようにしたいと思います。
Ruffとは
RuffはAstral社が開発しているPython用のリンター&フォーマッターです。同社はuvというパッケージマネージャーも開発しており、Python界隈では注目度の高い企業です。
astral.sh
astral.sh
Ruffの主な特徴をまとめると以下のようになります。
- Rust製で超高速(従来ツールの10〜100倍速)
- リンターとフォーマッターを1つのツールで提供
- flake8、isort、pyupgradeなど多くのルールに対応
- 設定は
pyproject.tomlで一元管理可能
先程は速度10倍から100倍と言いましたが、実際に使ってみると体感明らかに速いことがわかるでしょう。大きなプロジェクトでも一瞬で終わるので、ストレスがありません。
Ruffのインストール方法
Ruffはプロジェクトごとにインストールすることもできますが、リンターやフォーマッターは複数のプロジェクトで横断的に使うことが多いので、グローバルインストールがおすすめです。
uvを使う場合(おすすめ)
最近は、uvを使っている方も多いと思います。uvにはツールをグローバルにインストールする機能があるので、これを使うのが手軽ではないでしょうか。
$ uv tool install ruff

これだけでruffコマンドがPATHに追加され、どこからでも使えるようになります。
その他の方法
uvを使っていない場合は、以下の方法でもインストールできます。
# pipxを使う場合
$ pipx install ruff
# スタンドアロンインストーラー(macOS/Linux)
$ curl -LsSf https://astral.sh/ruff/install.sh | sh
基本的な使い方
インストールが完了すれば、すぐに使い始められます。
# リンター(コードのチェック)
$ ruff check .
# フォーマッター(コードの整形)
$ ruff format .
# リンターで自動修正可能なものを修正
$ ruff check --fix .

ruff check .コマンドを実行すると、カレントディレクトリ以下のPythonファイルをチェックして、問題があれば表示してくれます。ruff format .コマンドはコードを自動的に整形してくれます。
問題のあるソースコードをチェックするといかのようなメッセージが表示されます。

コマンドが見つからない場合
uv tool installでインストールしたのにコマンドが見つからない場合は、PATHが通っていない可能性があります。シェルの設定ファイル(.bashrcや.zshrc)に以下を追加してください。
export PATH="$HOME/.local/bin:$PATH"
追加したら、ターミナルを再起動するかsource ~/.bashrcやsource ~/.zshrcなどで設定を反映させてください。
(おまけ)uvのツール管理コマンド
uvでインストールを行った場合は、以下のコマンドで管理できます。
# インストール済みツール一覧
$ uv tool list
# アップグレード
$ uv tool upgrade ruff
# アンインストール
$ uv tool uninstall ruff

一時的に試したい場合
「まだインストールするか決めてないけど、ちょっと試してみたい」という場合はuvxコマンドが便利です。
$ uvx ruff check .
uvxは一時的な環境でツールを実行してくれるので、試しに使ってみたいときに重宝します。
pyproject.tomlでの設定
プロジェクトのルートにpyproject.tomlを置くことで、Ruffの挙動をカスタマイズが可能です(設定がない場合はデフォルト値が使われます)。
[tool.ruff]
line-length = 120
[tool.ruff.lint]
select = [
"E",
"F",
"I",
"W",
]
[tool.ruff.format]
quote-style = "double"
上記の設定の概要は以下の通り
| セクション |
設定項目 |
説明 |
[tool.ruff] |
line-length |
1行の最大文字数。デフォルトは88文字ですが、120文字程度に広げておくと改行が減って読みやすくなります |
[tool.ruff.lint] |
select |
有効にするリンタールールを指定します。Eはpycodestyleのエラー、FはPyflakes、Iはisort(import順)、Wはpycodestyleの警告に対応しています |
[tool.ruff.format] |
quote-style |
文字列のクォートスタイルを指定します。"double"でダブルクォート、"single"でシングルクォートに統一されます |
selectで指定できるルールは他にも多数あります。たとえば"B"(flake8-bugbear)や"UP"(pyupgrade)などを追加すると、より厳密なチェックが可能です。
また、line-lengthはデフォルトだと88文字ですが、個人的には120文字くらいにしておくといい感じでしょうか😊
VisualStudio Codeとの連携
VSCodeを使っている場合は、Ruff公式の拡張機能をインストールすると、エディタ上でリアルタイムにチェックに動作可能です。さらに保存時に自動フォーマットも可能です。
VSCodeの拡張機能で検索を行うと以下が見つかります。

拡張機能をインストールしたら、.vscode/settings.jsonに以下の設定を追加します。
{
"[python]": {
"editor.formatOnSave": true,
"editor.defaultFormatter": "charliermarsh.ruff",
"editor.codeActionsOnSave": {
"source.fixAll": "explicit",
"source.organizeImports": "explicit"
}
}
}```
この設定を入れておけば、ファイルを保存するたびに自動でフォーマットされるのでコーディングに集中できます。
# おわりに
今回は**Ruff**をグローバルインストール方法を書いてみました。**uv tool install ruff**を実行するだけで、どのプロジェクトでも**ruff**コマンドが使えるようになります。
設定ファイルを使わなくても十分使えますし、必要に応じて`pyproject.toml`でカスタマイズもできます。
個人的には、**Ruff**の導入で一番嬉しいのは「速さ」ですね。従来のツールだとチェックに数秒かかることもありましたが、**Ruff**なら大規模なプロジェクトでも一瞬です🤩