LoginSignup
127
100

Pythonの Ruff (linter) でコード整形もできるようになりました

Last updated at Posted at 2023-11-05

要約: Flake8 + Black + isort はもうすべて Ruff だけで置き換えられる。


PythonのLinterとして、すでに Ruff を使われている方も多いと思います。Ruffは Rust で実装された高速なPython用Linterで、従来よく使われていた Flake8 に比べて数十倍短い時間で処理が終わるほか、Flake8の主要なプラグインの代替も初めから搭載されています(Lintルール一覧)。

その成功が約束されている(?)ためか、Ruff の知名度がまだ低いころから GitHub Actions公式のPythonチュートリアルは早々に Flake8 を Ruff に置き換えていました。

そして、2023年10月末にリリースされた v0.1.2 あたりから、ついにLintだけでなく、コードフォーマット(コード整形)の機能も正式に搭載されました。公式のブログ記事はこちら:

Pythonのコード整形といえば今までは Black が主流でした。その代替を目指す Ruff のフォーマット機能は Black よりも30倍以上高速で(画像は公式ブログから引用)、Black と 99.9% 以上の互換性があると謳っています。

フォーマット速度の比較

速度の面だけでなく、従来よく使われてきた Flake8, Black, isort という別々のツールがすべて Ruff ひとつだけで済むようになるのも嬉しいポイントでしょう。

  • (Linter) Flake8 → Ruff !!!
  • (Formatter) Black → Ruff !!!
  • (import sorting) isort → Ruff !!!

VS Code の設定

明示的にフォーマッタとして Ruff を使うようにするには、設定ファイルを以下のように書き換えればOKです。Ruff の拡張機能を入れておくことをお忘れなく。

  "[python]": {
    "editor.defaultFormatter": "charliermarsh.ruff",
    "editor.formatOnType": true,
    // ...
  }

Flake8やisort用の拡張機能は、もし入っていたら、できれば削除してしまいましょう。

また、他のエディタをお使いの方には ruff-lsp があります。

コマンドラインで実行

新たに、コードフォーマットのための format コマンドが増えました。

# formatter を実行
ruff format .
# linter を実行
ruff check . --fix

(おまけ) GitHub Actions の設定

これは linter の話ではありますが、 ruff check--output-format=github を付けると、LintエラーをGitHubのインラインアノテーションにしてくれます。

- name: Run Ruff (lint)
  run: ruff check --output-format=github .
- name: Run Ruff (format)
  run: ruff format . --check --diff

pyproject.toml

フォーマット機能に関しては、特に設定なしでBlackと同じ挙動を目指そうとしてくれます。

なお過去のRuffの pyproject.toml での設定は現状そのままでも動作しますが、今後は lint の設定と format の設定を分けて記述するようになっています。詳細は公式ドキュメント (https://docs.astral.sh/ruff/configuration/) を参照してください。

[tool.ruff]
# ...

[tool.ruff.lint]
# ...

[tool.ruff.format]
# ...

[tool.ruff.lint.isort]
# ...
127
100
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
127
100