最近、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を導入する際は、以下の順番でルールを適用することが良いと考えています。
- 基本的なルール。Ruffを使うなら是非適用したい。
- F: Pyflakes
- E: pycodestyle error
- W: pycodestyle warning
- I: isort
- コードの品質をより向上させるルール
- B: flake8-bugbear: バグになりそうな部分を教えてくれる
- PL: Pylint
- ライブラリ/フレームワークに特化したルール
- PD: pandas-vet
- NPY: NumPy-specific rules
- DJ: flake8-django
- その他
- RUF: Ruff-specific rules: Ruff独自のルール
- UP: pyupgrade: 新しいPythonバージョンでの書き方を教えてくれる
- D: pydocstyle: docstringのスタイルをチェック
まとめ
とても便利なツールであるため、annofab-cliだけでなく、他の社内のPythonプロジェクトにも積極的にRuffを導入していきたいと考えています。
Ruffの導入方法やハマったことや気になったことなどは、Qiitaブログの「Pythonの静的解析ツール”Ruff”を導入した話とおすすめの導入方法」もご参照ください。