Ruff の紹介
Databricks Advent Calendar 2022 の 13 日目担当の harupy (GitHub, Twitter) です。普段は MLflow のメインテナーをしてます。本記事では Ruff という Rust で書かれた Python の Linter について紹介します。
Ruff とは?
2022年8月に Charlie Marsh さんによって公開された Rust で書かれた Python の Linter
The Python ecosystem could benefit from a similar mindset shift. Python tooling could be much, much faster. As a proof-of-concept, I’m releasing Ruff, an extremely fast Python linter, written in Rust. Ruff is ~150x faster than Flake8 on macOS (~25x faster if you hack Flake8 to enable multiprocessing), ~75x faster than pycodestyle, ~50x faster than pyflakes and pylint, and so on.
GitHub repository:
Ruff の特徴
-
"An extremely fast Python linter" と謳っているだけあってとてつもなく速い
-
自動修正可能なエラーを修正してくれる。
> cat a.py a = False print(a == True) > ruff a.py Found 1 error(s). a.py:2:12: E712 Comparison to `True` should be `cond is True` 1 potentially fixable with the --fix option. > ruff --fix a.py Found 1 error(s) (1 fixed, 0 remaining). > cat a.py a = False print(a is True)
-
--add-noqa
というオプションを使うことで、noqa
コメント(エラーを無視するためのコメント)> cat a.py a = False print(a == True) > ruff --add-noqa a.py Added 1 noqa directives. > cat a.py a = False print(a == True) # noqa: E712 ^^^^^^^^^^^^
-
色々な linter / formatter のルールをサポートしている。デフォルトでは Pyflakes と pycodestyle のルールのみをチェックするようになっている。
- Pyflakes
- pycodestyle
- mccabe
- isort
- pydocstyle
- pyupgrade
- pep8-naming
- flake8-2020
- flake8-annotations
- flake8-bandit
- flake8-blind-except
- flake8-boolean-trap
- flake8-bugbear
- flake8-builtins
- flake8-comprehensions
- flake8-debugger
- flake8-import-conventions
- flake8-print
- flake8-quotes
- flake8-return
- flake8-tidy-imports
- flake8-unused-arguments
- eradicate
- pygrep-hooks
- Pylint
- Ruff-specific rules
インストール
pip install ruff
実行
ruff <files or dirs>
Editor Integrations
- Visual Studio Code
- PyCharm
- Vim & Neovim
Editor Integrations に関連する Issue:
Ruff を使用しているプロジェクト
FastAPI や Pydantic といった Python 界の大御所が Ruff に乗り換えたことが最近話題になった
- FastAPI
- Bokeh
- Zulip
- Pydantic
- Saleor
- Hatch
- Jupyter Server
FastAPI の開発者 Sebastián さんのツイート:
開発状況
ほぼ毎日、新機能の実装・バグの修正が行われて、新しいバージョンが PyPI 上にリリースされている
Ruff が依存しているプロジェクト
- https://github.com/RustPython/RustPython: Python のコードを AST に変換する際に使われている
- https://github.com/Instagram/LibCST: コードを自動修正する際に使われている
余談
-
Rust の練習がてら自分も Lint ルールを実装したり、バグを修正したりしていた。Rust の開発体験が良すぎて「もう Python 書きたくない」と思ってしまった笑
Discussion