Rust製のPythonリンターであるRuffがあまりに爆速で感動したのでご紹介します。
Ruffとは
https://github.com/charliermarsh/ruff
RuffはRust製のPythonリンターでFlake8、isort、pydocstyle等のリンターを代替する互換性を持ちます。 Flake8等の既存のリンターをRuffで置き換えると以下のメリットがあります。
- 既存のリンターと比較して爆速
- 自動修正が可能
FastAPIやPandasといった人気のOSSでも利用が広がっています。
Ruff導入の経緯
ビザスクのサーバーサイドではDjangoを利用しており、Flake8等のリンターで静的解析をしていました。 ローカルで実行する静的解析にかなり時間がかかっており開発のテンポが悪くなっていました。
そこでリンターを高速化するためにRuffを利用できないかという話になりました。
導入方法
静的解析にはpre-commit
を利用していたので、.pre-commit-config.yaml
に以下を追加してRuffを利用することができました。
- repo: https://github.com/charliermarsh/ruff-pre-commit rev: "v0.0.257" hooks: - id: ruff args: [--fix]
Flake8はpyproject.toml
で設定していましたが、Ruffもpyproject.toml
で同じように設定できました。
今回は利用しませんでしたが、flake8-to-ruff
というFlake8の設定からRuffの設定を生成するツールも提供されています。
[tool.ruff] # チェックするルール select = ["E", "F", "RET502", "RET503", "T20"] # 無視するエラー ignore = ["E501", "E722"]
VSCodeの拡張も用意されているのでコーディング中にリアルタイムで静的解析のエラーを確認できます。 https://github.com/charliermarsh/ruff-vscode
注意点
Ruffはpycodestyleの一部ルールはチェック対象にしていません。Black等のフォーマッターが自動で修正する内容についてはチェックしない方針のようです。詳細は公式ドキュメントを確認してください。
今回導入したプロジェクトでは元からBlackを使っていたので問題ありませんでしたが、フォーマッターを使っていない場合には注意が必要です。
導入結果
Flake8をRuffで置き換えた結果、実行時間を30秒以上短縮することができました! あまりに爆速で逆に不安になるくらいでしたw
$ time pre-commit run --all-files flake8...................................................................Passed make lint 37.39s user 1.00s system 96% cpu 39.808 total $ time pre-commit run --all-files ruff.....................................................................Passed make lint 1.05s user 0.43s system 119% cpu 1.235 total
導入してしばらくはローカルではRuffのみでチェックし、CIではFlake8とRuffでダブルチェックしていましたがチェック漏れなども発生しませんでした。Flake8の代替として問題なく動作しています。
自動修正を有効にしているので、よくあるunused-import
エラーが起きても未使用のimport文を自動で削除してくれたりして助かってます。
以上です。Pythonのリンターを爆速にしたい方はRuffを試してみるといいと思います!