最近、Pythonの静的解析ツール Ruff を知ったので、社内ツールの annofab-cli に導入してみました。

この記事では、Ruffの特徴、導入した感想、おすすめのルール設定を紹介します。

Ruffの特徴

  • Rustで書かれている
  • 他のリンターよりも10~100倍高速
  • 500以上のチェック項目がある
  • Flake8やそのプラグインが再実装されている

annofab-cliでは、フォーマッターとして「black」「isort」「autoflake」、リンターとして「mypy」「flake8」「pylint」を利用していました。
Ruffを導入し、「isort」「flake8」「autoflake」の利用をやめ、Ruffで管理できるようになりました。

使った感想

Ruffを導入して、

  • 動作がすごく速く、快適に開発できる
  • チェックだけでなく、修正もできる
  • –statisticsや–add-noqaなどのオプションが使いやすい
  • チェック項目が増えたことにより、Pythonの良い書き方や機能を知ることができる
    • zip関数にはstrict=Trueを指定した方がよい(B905)
    • str.startswithにタプルを指定すると、OR条件で判定できる(PIE810)
    • pandasでinplace=Trueはバグの元で、パフォーマンス上の利点はない(PD002)
    • などなど

を感じました。

Ruffを導入したことで、コードの静的解析時間がわずかに短縮されました。
(ただし、ボトルネックであるPylintは今回置き換えられなかったため、大幅な短縮には至りませんでした)
また、チェック項目が増えたことにより、以前よりもコードの品質が確保されるようになりました。

おすすめのルール

個人的におすすめしたいルールのカテゴリを引用して紹介します。 Ruffを導入する際は、以下の順番でルールを適用することが良いと考えています。

  1. 基本的なルール。Ruffを使うなら是非適用したい。
    • F: Pyflakes
    • E: pycodestyle error
    • W: pycodestyle warning
    • I: isort
  2. コードの品質をより向上させるルール
    • B: flake8-bugbear: バグになりそうな部分を教えてくれる
    • PL: Pylint
  3. ライブラリ/フレームワークに特化したルール
    • PD: pandas-vet
    • NPY: NumPy-specific rules
    • DJ: flake8-django
  4. その他
    • RUF: Ruff-specific rules: Ruff独自のルール
    • UP: pyupgrade: 新しいPythonバージョンでの書き方を教えてくれる
    • D: pydocstyle: docstringのスタイルをチェック

まとめ

とても便利なツールであるため、annofab-cliだけでなく、他の社内のPythonプロジェクトにも積極的にRuffを導入していきたいと考えています。

Ruffの導入方法やハマったことや気になったことなどは、Qiitaブログの「Pythonの静的解析ツール”Ruff”を導入した話とおすすめの導入方法」もご参照ください。

カテゴリー: ブログ