FAQ#
Is the Ruff linter compatible with Black?#
はい。Rufflinter は、line-length
設定が 2 つの間で一貫している限り、Blackout-of-the-box と互換性があります。
Ruff はフォーマッタ(Ruff 自身のフォーマッタや Black など)と一緒に使用するように設計されているため、自動フォーマットによって回避されるスタイル規則の実装は後回しになります。
Ruff の linter と Black では、行の長さの制約の扱いが少し異なることに注意してください。Black は、Ruff のフォーマッタと同様に、line-length
に従うよう最善の努力をしますが、場合によっては(例えばコメント内で)自動的な行の折り返しを回避します。
一方、Ruff は、line-length
設定を超える行に対して、line-too-long
(E501
)というフラグを立てます。したがって、line-too-long
(E501
)が有効になっている場合、Black またはruff format
が有効になっていても、Ruff は line-lengthviolations を引き起こす可能性があります。
How does Ruff's formatter compare to Black?#
Ruff フォーマッタは、Blackの代用として設計されています。
具体的には、このフォーマッタは、Black でフォーマットされたコードで実行したときに、ほぼ同じ出力を出力することを意図しています。Django や Zulip のような大規模な Black フォーマットのプロジェクトで実行すると、99.9%以上の行が同じようにフォーマットされる。既存のプロジェクトを Black から Ruff に移行する場合、余白にいくつかの違いが見られることを期待する必要があるが、コードの大部分は変更されないはずです。
non-Black フォーマットのコードを実行すると、フォーマッタは Black とは異なる決定を行うため、特に行末コメントの処理に関しては、より多くの逸脱が予想されます。
詳細については、Black compatibilityを参照してください。
How does Ruff's linter compare to Flake8?#
Ruff can be used as a drop-in replacement for Flake8 when used (1) without or with a small number ofplugins, (2) alongside Black, and (3) on Python 3 code.
Ruff は、(1) プラグインの有無にかかわらず、(2) Black と並んで、(3) Python 3 コードで使用する場合、Flake8 の代用として使用できます。
これらの条件下で、Ruff は Flake8 のすべてのルールを実装します。実際には、Ruff は(Pyflakes から派生した)すべてのF
ルールと、(pycodestyle から派生した)E
ルールとW
ルールのサブセットを実装します。
Ruff はまた、最も人気のある Flake8 プラグインと関連するコード品質ツールのいくつかをネイティブに再実装しています。:
- autoflake
- eradicate
- flake8-2020
- flake8-annotations
- flake8-async
- flake8-bandit (#1646)
- flake8-blind-except
- flake8-boolean-trap
- flake8-bugbear
- flake8-builtins
- flake8-commas
- flake8-comprehensions
- flake8-copyright
- flake8-datetimez
- flake8-debugger
- flake8-django
- flake8-docstrings
- flake8-eradicate
- flake8-errmsg
- flake8-executable
- flake8-gettext
- flake8-implicit-str-concat
- flake8-import-conventions
- flake8-logging
- flake8-logging-format
- flake8-no-pep420
- flake8-pie
- flake8-print
- flake8-pyi
- flake8-pytest-style
- flake8-quotes
- flake8-raise
- flake8-return
- flake8-self
- flake8-simplify
- flake8-slots
- flake8-super
- flake8-tidy-imports
- flake8-todos
- flake8-type-checking
- flake8-use-pathlib
- flynt (#2102)
- isort
- mccabe
- pandas-vet
- pep8-naming
- perflint (#4789)
- pydocstyle
- pygrep-hooks
- pyupgrade
- tryceratops
- yesqa
場合によっては、Ruff は元の Flake8 プラグインとは異なるルールコードとプレフィックスを使用することに注意してください。例えば、Ruff はTID252
を使用して、Flake8-tidy-imports からのI252
ルールを表します。これにより、プラグイン間の競合を最小限に抑えることができ、(I001
のような isort ルールとの競合を避けるために)--select I2
ではなく、--select TID
を使用して個々のプラグインのオン/オフを切り替えることができます。
ルールセットを超えて、Flake8 に対する Ruff の主な制限は、customlint ルールをサポートしていないことである(代わりに、人気のある Flake8 プラグインは、Ruff 自体の一部として Rust に再実装されている)。
Ruff と元の Flake8 プラグインとの間には、他にもいくつかの小さな非互換性があります。:
- Ruff は flake8-bugbear の"独断的な"lint ルールをすべて実装しているわけではありません。
- プロジェクトの構造によって、Ruff と isort ではファーストパーティコードの検出が異なる場合があります。(これは、コードが
src
ディレクトリにネストされている場合、src
プロパティを変更することで解決されることがよくあります。例えば、src=["src"]
に変更します。)
How does Ruff's linter compare to Pylint?#
At time of writing, Pylint implements ~409 total rules, while Ruff implements over 800, of which atleast 209 overlap with the Pylint rule set (see: #970).
このドキュメントの記述時点で、Pylint は合計約 409 のルールを実装していますが、Ruff は 800 以上のルールを実装しており、そのうち少なくとも 209 は Pylint のルールセットと重複しています(#970を参照)。
Pylint は、Ruff が実装していない多くのルールを実装しており、その逆も同様です。たとえば、Pylint は Ruff よりも多くの型推論を実行します(たとえば、Pylint は関数呼び出し内の引数の数を検証できます)。そのため、Ruff は Pylint の"純粋な"代用ではありません(逆も同様です)。これは、Ruff が異なるルールセットを適用するためです。
これらの違いにもかかわらず、多くのユーザが Pylint から Ruff への切り替えに成功しており、特にtype checkerと一緒に Ruff を使用しているユーザは、Pylint が提供する機能の一部をカバーすることができます。
Flake8 と同様に、Pylint はプラグイン("チェッカー"と呼ばれる)をサポートしていますが、Ruff はすべてのルールを実装しており、カスタムやサードパーティのルールはサポートしていない。Pylint とは異なり、Ruff は独自のリント違反を自動的に修正することができます。
場合によっては、Ruff のルールは Pylint の対応するルールとわずかに異なる結果をもたらすことがあります。例えば、Ruff のtoo-many-branches
は、Pylint のR0912
とは異なり、try
ブロックを自身のブランチとしてカウントしません。Ruff のPL
ルールグループには、Pylintextensions(magic-value-comparison
のような)からの少数のルールも含まれていますが、これらは Pylint を使用するときに明示的に有効にする必要があります。Ruff のPL
グループを有効にすると、Pylint の設定で有効にされていなかったルールの違反が表示されることがあります。
Pylint パリティは#970で追跡されています。
How does Ruff compare to Mypy, or Pyright, or Pyre?#
Ruff はリンターであり、型チェッカーではありません。Ruff は型チェッカーと同じ問題のいくつかを検出できますが、型チェッカーは Ruff が見逃す特定のエラーを検出します。逆もまた真です。:
Ruff は、型チェッカーが通常無視する特定のエラーをキャッチします。
例えば、型チェッカーとは異なり、Ruff はインポートが使用されていない場合には、ソース・コード内でそのインポートへの参照を調べることによって通知します。; 一方、型チェッカーは、文字列を必要とする関数に整数の引数を渡したことを示すフラグを立てることができますが、Ruff はこれを見逃すことになります。これらのツールは補完的なものです。
Ruff は Mypy、Pyright、Pyre などの型チェッカーと組み合わせて使用することをお勧めします。Ruff は lint 違反に対してより迅速なフィードバックを提供し、型チェッカーは型エラーに対してより詳細なフィードバックを提供します。
Which tools does Ruff replace?#
現在、Ruff は、次のプラグインのいずれかとともに使用することで、Flake8 を置き換えることができます。:
- flake8-2020
- flake8-annotations
- flake8-async
- flake8-bandit (#1646)
- flake8-blind-except
- flake8-boolean-trap
- flake8-bugbear
- flake8-builtins
- flake8-commas
- flake8-comprehensions
- flake8-copyright
- flake8-datetimez
- flake8-debugger
- flake8-django
- flake8-docstrings
- flake8-eradicate
- flake8-errmsg
- flake8-executable
- flake8-gettext
- flake8-implicit-str-concat
- flake8-import-conventions
- flake8-logging
- flake8-logging-format
- flake8-no-pep420
- flake8-pie
- flake8-print
- flake8-pytest-style
- flake8-quotes
- flake8-raise
- flake8-return
- flake8-self
- flake8-simplify
- flake8-slots
- flake8-super
- flake8-tidy-imports
- flake8-todos
- flake8-type-checking
- flake8-use-pathlib
- flynt (#2102)
- mccabe
- pandas-vet
- pep8-naming
- perflint (#4789)
- pydocstyle
- tryceratops
Ruff は、Black、isort、yesqa、extenate、およびpyupgradeで実装されているほとんどのルールを置き換えることもできます。
Ruff を使用したいが、サポートされていない Flake8 プラグインに依存している場合は、issueを自由に提出してください。
Do I have to use Ruff's linter and formatter together?#
いいえ!Ruff のリンターとフォーマッターは、互いに独立して使用することができます。Ruff をフォーマッターとして使用することはできますが、リンターとして使用することはできません。逆もまた同様です。
What versions of Python does Ruff support?#
Ruff は、Python 3.13 を含む 3.7 以降のすべての Python バージョンのコードをリントできます。
Ruff は Python 2 をサポートしていません。Ruff_may_run on pre-Python 3.7 code, but such versionsare not official supported(例えば、Ruff does_not_respect type comments).
Ruff は、3.7 以降の任意の Python バージョンでインストールできます。
Do I need to install Rust to use Ruff?#
Nope!Ruff は PyPI のruff
から入手できます。:
console$ pip install ruff
Ruff はすべての主要なプラットフォーム用のホイールを備えているため、pip
は Rust をまったくインストールせずに Ruff をインストールできます。
Can I write my own linter plugins for Ruff?#
Ruff はまだサードパーティのプラグインをサポートしていませんが、プラグインシステムはプロジェクトのスコープ内にあります。詳細については、#283を参照してください。
How does Ruff's import sorting compare to isort?#
Ruff の import sorting は、isort のprofile="black"
を使用する場合に、isort とほぼ同等になるように意図されています。
There are a few known differences in how Ruff and isort treat aliased imports, and in how Ruff andisort treat inline comments in some cases (see: #1381,#2104).
Ruff と isort がエイリアスされたインポートを処理する方法、および場合によっては Ruff andisort がインラインコメントを処理する方法には、いくつかの既知の違いがあります(#1381、#2104を参照)。
たとえば、Ruff は同じモジュールからのエイリアスのないインポートをグループ化する傾向があります。:
pythonfrom numpy import cos, int8, int16, int32, int64, tan, uint8, uint16, uint32, uint64from numpy import sin as np_sin
一方、isort はエイリアスの境界ごとに別々の import 文に分割します。:
pythonfrom numpy import cos, int8, int16, int32, int64from numpy import sin as np_sinfrom numpy import tan, uint8, uint16, uint32, uint64
Ruff はまた、_string
やidlelib
のように、isort では認識されないモジュールを標準ライブラリとして正しく分類します。
isort と同様に、Ruff のインポートソートは Black と互換性があります。
How does Ruff determine which of my imports are first-party, third-party, etc.?#
Ruff はsrc
オプションを受け入れます。これはpyproject.toml
、ruff.toml
、.ruff.toml
ファイル内で、インポートがファーストパーティであるかどうかを判断するときに Ruff が考慮すべきディレクトリを指定します。
たとえば、次のような構造のプロジェクトがあるとします。:
Ruff はimport foo
のようなインポートを見つけると、src
ディレクトリを繰り返し処理して、対応する Python モジュール(実際にはfoo
という名前のディレクトリかfoo.py
という名前のファイル)を探します。
src
フィールドが省略された場合、Ruff はデフォルトで"project root"と"src"
サブディレクトリをファーストパーティソースとして使用し、フラットなプロジェクトレイアウトとネストされたプロジェクトレイアウトの両方をサポートします。
"プロジェクトのルート"は、通常pyproject.toml
、ruff.toml
、または.ruff.toml
ファイルを含むディレクトリです。ただし、設定ファイルが--config
オプションでコマンドラインに提供されている場合は、現在の作業ディレクトリがプロジェクトのルートとして使用されます。
この場合、Ruff はデフォルトで"src"
ディレクトリをチェックしますが、次のように明示的で排他的なファーストパーティソースとして設定することもできます。:
pyproject.toml
、ruff.toml
、.ruff.toml
が別の設定ファイルを拡張しても、Ruff はpyproject.toml
、ruff.toml
、.ruff.toml
ファイルを含むディレクトリを(extends
オプションで指定されたファイルのディレクトリではなく)プロジェクトのルートとして使用します。
たとえば、上記の例でtests
ディレクトリに設定ファイルを追加する場合、拡張設定ファイルでsrc
オプションを明示的に設定します。:
このsrc
ベースの検出に加えて、Ruff は特定の Python ファイルの現在の Python パッケージを判別し、同じパッケージ内からのインポートをファーストパーティとしてマークしようとします。たとえば、上記のbaz.py
は./my_project/src/foo
で始まる Python パッケージの一部として識別されるため、baz.py
内のfoo
で始まるインポート(import foo.bar
など)は、この same-package ヒューリスティックに基づいてファーストパーティと見なされます。
src
の解像度の詳細な説明については、contributing guideを参照してください。
Ruff は、ファイルシステム上の位置に関係なく、特定のモジュールを(例えば)常にファーストパーティとして扱うように設定することもできます。例えば、known-first-party
を次のように設定できます。:
Ruff はまだ isort の設定オプションのすべてをサポートしているわけではありませんが、その多くはサポートしています。サポートされている設定はAPI referenceにあります。
Does Ruff support Jupyter Notebooks?#
Ruff には、リンティングとフォーマットのサポートが組み込まれていますJupyter Notebooks。詳細については、Jupyter Notebook sectionを参照してください。
Ruff は、Jupyter Notebooks 上で linter とコードフォーマッタを実行するためのツールであるnbQAとも統合されています。
ruff
とnbqa
をインストールした後、次のようにしてノートブック上で Ruff を実行できます。:
console$ nbqa ruff Untitled.ipynb
Untitled.ipynb:cell_1:2:5: F841 Local variable `x` is assigned to but never used
Untitled.ipynb:cell_2:1:1: E402 Module level import not at top of file
Untitled.ipynb:cell_2:1:8: F401 `os` imported but unused
Found 3 errors.
1 potentially fixable with the --fix option.
Does Ruff support NumPy- or Google-style docstrings?#
はい!docstring の規則を適用するには、次の設定ファイルにconvention
設定を追加します。:
例えば、flake8-docstrings から来ていて、元の設定で--docstring-convention=numpy
を使用している場合は、代わりに上記のようにpyproject.toml
でconvention = "numpy"
を設定します。
convention
と並んで、D
ルールはデフォルトで有効になっていないので、D
ルールコードプレフィックスを明示的に有効にする必要があります。:
convention
を有効にすると、指定された規則に含まれていない規則はすべて無効になります。そのため、意図されたワークフローは、規則を有効にしてから、その上の追加の規則を選択的に有効または無効にすることです。:
PEP 257 の規約には、以下を除くすべてのD
エラーが含まれています。:
D203
,
D212
,
D213
,
D214
,
D215
,
D404
,
D405
,
D406
,
D407
,
D408
,
D409
,
D410
,
D411
,
D413
,
D415
,
D416
, and
D417
.
NumPy 規約には、以下を除くすべてのD
エラーが含まれています。:
D107
,
D203
,
D212
,
D213
,
D402
,
D413
,
D415
,
D416
, and
D417
.
Google の規約には、以下を除くすべてのD
エラーが含まれています。:
D203
,
D204
,
D213
,
D215
,
D400
,
D401
,
D404
,
D406
,
D407
,
D408
,
D409
, and
D413
.
デフォルトでは、convention
は設定されていないので、有効なルールはselect
設定のみによって決定されます。
What is "preview"?#
プレビューを使用すると、実験的または不安定と見なされる新しい規則や修正を収集できます。
詳細については、preview documentationを参照してください。また、現在プレビューされているルールについては、rules referenceを参照してください。
How can I tell what settings Ruff is using to check my code?#
指定したファイルの解決された設定を表示するには、ruff check/path/to/code.py--show-settings
を実行します。
I want to use Ruff, but I don't want to use pyproject.toml
. What are my options?#
pyproject.toml
ファイルの代わりに、ruff.toml
ファイルを構成に使用できます。この 2 つのファイルは機能的に同等で、スキーマも同じですが、ruff.toml
ファイルでは[tool.ruff]
セクションヘッダーを省略できます。次に例を示します。:
Ruff は現在setup.cfg
やtox.ini
のような INI ファイルをサポートしていません。
How can I change Ruff's default configuration?#
設定ファイルが見つからない場合、Ruff は最後の手段としてユーザー固有のruff.toml
ファイルを探します。この動作は Flake8 の~/.config/Flake8
と似ています。
macOS と Linux では、Ruff はこのファイルが~/.config/ruff/ruff.toml
にあることを期待し、XDG_CONFIG_HOME
仕様を尊重します。
Windows では、Ruff はこのファイルが~\AppData\Roaming\ruff\ruff.toml
にあることを想定しています。
Note
v0.5.0
より前では、RuffはmacOSの~/Library/Application Support/ruff/ruff.toml
からユーザ固有の設定を読み込みます。Ruffはこのような設定ファイルを尊重しますが、~/Library/Application Support
の使用は推奨されません。
詳細については、etcetera
クレートを参照してください。
Ruff tried to fix something — but it broke my code. What's going on?#
Ruff ラベルは"safe"と"unsafe"に修正されます。デフォルトでは、Ruff は safefix が利用可能なすべての違反を修正しますが、unsafe fix はunsafe-fixes
設定、または--unsafe-fixes
フラグをruff check
に渡すことで有効にできます。詳細については、the fix documentationを参照してください。
それでも、Python の動的な性質を考えると、コードに変更を加えるときに、たとえ些細な修正であっても、完全な確実性を持つことは困難です。"安全な"修正がコードを壊した場合は、[the fix documentation]してください(https://github.com/astral-sh/ruff/issues/new)。
How can I disable/force Ruff's color output?#
Ruff のカラー出力は、出力ストリームがカラーをサポートしているかどうかを自動的に検出しようとするcolored
クレートによって強化されています。ただし、NO_COLOR
環境変数を任意の値(例えばNO_COLOR=1
)に設定することで強制的にカラーをオフにしたり、FORCE_COLOR
を空でない任意の値(例えばFORCE_COLOR=1
)に設定することで強制的にカラーをオンにしたりすることができます。