🦀

Ruff の紹介

2022/12/13に公開約3,500字

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.

https://notes.crmarsh.com/python-tooling-could-be-much-much-faster

GitHub repository:
https://github.com/charliermarsh/ruff

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

https://pypi.org/project/ruff/

実行

ruff <files or dirs>

Editor Integrations

Editor Integrations に関連する Issue:
https://github.com/charliermarsh/ruff/issues/271

Ruff を使用しているプロジェクト

FastAPI や Pydantic といった Python 界の大御所が Ruff に乗り換えたことが最近話題になった

  • FastAPI
  • Bokeh
  • Zulip
  • Pydantic
  • Saleor
  • Hatch
  • Jupyter Server

FastAPI の開発者 Sebastián さんのツイート:
https://twitter.com/tiangolo/status/1591912354882764802

開発状況

ほぼ毎日、新機能の実装・バグの修正が行われて、新しいバージョンが PyPI 上にリリースされている

https://pypi.org/project/ruff/#history

Ruff が依存しているプロジェクト

余談

Discussion

ログインするとコメントできます