「綺麗なコードを書きたい」という気持ちは、すべてのエンジニアの心に宿る願いです。
しかしながら、「納期が…」「まずは動くものを…」という現代社会におけるとめどない流れの中でままならないことも多いでしょう。
そんな悩みを解決する一助となるコードフォーマッター。
今回はPythonのコードフォーマッターの中で、昨今最も注目を浴びているRuff
について紹介します。
Ruff
はRust製のPythonコードフォーマッターです。Rust製ですが、Python向けツールとなります。
ここ最近、Rustはその汎用性と高速さを武器に、さまざまなソフトウェアのサポートツールが続々と生まれてきています。そのような流れにおける傑作の1つなのがRuff
です。
とにかく速い、という特徴がありますが、その他の特徴も下記に列挙します。
Flake8
のような)既存linterや(Black
のような)既存フォーマッターより10~100倍高速pip
でインストール可能pyproject.toml
サポートFlake8
、isort
、Black
と共存可能import
の削除など)自動エラー修正ruff-lsp
によるもの)とにかく全部盛りで、しかも高速というのが売りです。
FastAPI開発者など、Python界隈の名だたるビッグネームがその高速さを称賛しています。
ここまででRuffの魅力は伝わったはずなので早速インストールしましょう。
先述した通り、pip
でインストールできます。
動作を確認するために、修正点のあるコードを書いてみましょう。
もちろんこのコードは正常に動作します。ただ、美しくはありません。
このコードをRuffで修正してみましょう。
ruff check ファイル名
でコードの検査ができます。ファイル名
を.
にすることで、カレントディレクトリを起点に検査可能です。
これによって、以下のように出力されます。
使われていないdatetime
モジュールがあることを報告しています。
--fix
オプションをつけることで、このコードを自動修正してくれます。
すると、コードから使っていないdatetime
モジュールが取り除かれました。
このように、必要ではないコードが除去されたことでよりクリーンなコードへと生まれ変わるのです。
開発チームでコード規約を作る際、共通の設定にしたくなるケースは多々あります。
Ruff
はpyproject.toml
、ruff.toml
、または.ruff.toml
を親ディレクトリに設置することによってコード規約を設定可能です。
例として、pyproject.toml
をルートディレクトリに作ってみましょう。
以下は一行が長すぎる場合にNGを出すパターンです。(Flake8でデフォルトの79文字)
以下のコードを検査してみましょう。
これは下記のような出力をします。
ついでに曖昧な変数名についても注意されました。一旦、本筋とは違うのでfood_list
に修正します。
これで一行の長さだけ報告されるようになります。
ここで、フォーマッター機能を試しましょう。format
コマンドによって、コードの整形が可能です。
この実行によって、以下のようにコードが整形されます。
一行の長さを正当にし、配列を読みやすくしてくれました。
Ruff
は高速でありつつ、多くの機能が含まれているので主要なコマンドとオプションを覚えておきましょう。
コマンド | 説明 |
---|---|
コードの分析を行う | |
コード規約ルールの説明を表示 | |
キャッシュクリア | |
コード整形を行う |
オプション | 説明 |
---|---|
ruff check --fix | 修正を適用 |
ruff check --watch | 監視モードでリアルタイム検査 |
ruff check --config [設定ファイルパス] | 設定ファイルを指定 |
ruff format --diff | 整形対象を表示 |
まずはこのあたりを覚えておくことをおすすめします。
その他のコマンドやオプションを知りたい方はこちらから参照してみてください。
今回は小さなコードスニペットの検査だけだったので、高速にチェックが終わってしまいましたが、これが大きなプロジェクトになればなるほどRuff
の高速さが顕著になっていきます。
すでにBlack
やFlake8
、isort
を取り入れているプロジェクトでも、Ruff
の導入は比較的安全なので、ぜひ検討してみてください。
GitHub Actionsやpre-commitと組み合わせることも多いlinterですが、開発者体験を底上げしてくれる高速なlinter兼フォーマッターのRuffは導入必須な素晴らしいツールです。
pre-commitでPythonプロジェクトをblack/flake8/isort/mypy/banditで管理する