VisasQ Dev Blog

ビザスク開発ブログ

Flake8をRuffで置き換えると爆速で感動した

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を試してみるといいと思います!