Python のリンター Ruff について
Rust 製ちょっぱや Python linter
適用ルール
Black と一緒に使うように設計されてる
As a project, Ruff is designed to be used alongside Black and, as such, will defer implementing stylistic lint rules that are obviated by autoformatting.
Note that Ruff and Black treat line-length enforcement a little differently. Black makes a best-effort attempt to adhere to the line-length, but avoids automatic line-wrapping in some cases (e.g., within comments). Ruff, on the other hand, will flag rule E501 for any line that exceeds the line-length setting. As such, if E501 is enabled, Ruff can still trigger line-length violations even when Black is enabled.
日本語訳
Ruffは、Blackと併用することを想定して設計されており、自動フォーマットによって明らかにされるスタイルのリントルールの実装を延期します。
なお、RuffとBlackは行の長さの制限について少し異なるアプローチを取ります。Blackは行の長さに準拠するための最善の努力をしますが、一部の場合(例:コメント内)では自動的な改行を避けます。一方、Ruffは、行の長さ設定を超えるすべての行に対してルールE501を警告します。そのため、E501が有効になっている場合、Blackが有効でもRuffは行の長さの違反を検出することがあります。
Ruff はどのツールを置き換えるか?
基本的には flake8 を置き換える。ただし isort も置き換えることができる(リンターだから正直持たないで欲しかった。どういう意図で入れたんだろう?)。
Ruff の import sorting は isort と比べてどうか?
isort の profile = "black"
設定時の動作とほぼ同等の import sorting を提供する。isort と同様に、black との互換性もある。
Ruff と isort はほぼ同等の機能をもたせようとしているが、一部違いもある。例えば、Ruff は同じモジュールからの non-aliased import をグループ化する。
from numpy import cos, int8, int16, int32, int64, tan, uint8, uint16, uint32, uint64
from numpy import sin as np_sin
一方、isort は alias の境界(おそらくアルファベット順で境界が決まる?下の例だと import sin ...
の後ろの import は s → t, u と続いている。)で non-aliased import を分ける。
from numpy import cos, int8, int16, int32, int64
from numpy import sin as np_sin
from numpy import tan, uint8, uint16, uint32, uint64
isort の多くの設定オプションをサポートしているが、まだできていないものもある。
Ruff は Mypy, Pyright, Pyre と比べてどうか?
Ruff は linter であり、type checker ではない。type checker と同じ問題を検出できるが、全てではない。逆も然りで、Ruff は type chekcker が検出できないある種のエラーを catch できる。
詳細は以下。
今までと比べてどういう使い方ができそうか?
CI 周りのツールで flake8 とそのプラグインを使っていたところを丸々 Ruff で置き換えることができる。
今まで
- black
- flake8 + プラグイン
- mypy
- pytest
これから
- black
- ruff
- mypy
- pytest