Open7

Python のリンター Ruff について

nukopynukopy

Black と一緒に使うように設計されてる

https://beta.ruff.rs/docs/faq/#is-ruff-compatible-with-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は行の長さの違反を検出することがあります。

nukopynukopy

Ruff はどのツールを置き換えるか?

基本的には flake8 を置き換える。ただし isort も置き換えることができる(リンターだから正直持たないで欲しかった。どういう意図で入れたんだろう?)。

https://beta.ruff.rs/docs/faq/#which-tools-does-ruff-replace

Ruff の import sorting は isort と比べてどうか?

isort の profile = "black" 設定時の動作とほぼ同等の import sorting を提供する。isort と同様に、black との互換性もある。

https://beta.ruff.rs/docs/faq/#how-does-ruffs-import-sorting-compare-to-isort

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 の多くの設定オプションをサポートしているが、まだできていないものもある。

nukopynukopy

今までと比べてどういう使い方ができそうか?

CI 周りのツールで flake8 とそのプラグインを使っていたところを丸々 Ruff で置き換えることができる。

今まで

  • black
  • flake8 + プラグイン
  • mypy
  • pytest

これから

  • black
  • ruff
  • mypy
  • pytest