ruff - Rustで書かれた非常に高速なPythonリンター。

(An extremely fast Python linter, written in Rust.)

Created at: 2022-08-10 01:17:44
Language: Rust
License: MIT

エリマキシギ

エリマキシギ 画像 画像 画像 アクションのステータス

Rustで書かれた非常に高速なPythonリンター。

ベンチマーク結果を含む棒グラフを表示します。

CPythonコードベースを最初からリントします。

  • ⚡️ 既存のリンターよりも10〜100倍高速
  • 🐍経由でインストール可能
    pip
  • 🤝Python 3.11 との互換性
  • 🛠️ 支える
    pyproject.toml
  • 📦変更されていないファイルの再分析を回避するための組み込みキャッシュ
  • 🔧自動エラー修正のためのAutofixのサポート(未使用のインポートの自動削除など)
  • ⚖️ 組み込みのFlake8ルールセットとほぼ同等
  • 🔌flake8-bugbearのような数十のFlake8プラグインのネイティブ再実装
  • ⌨️VS Code などのファーストパーティ エディターの統合
  • 🌎モノレポフレンドリー、階層構成とカスケード構成

Ruffは、より多くのツールを統合しながら、代替ツールよりも桁違いに高速になることを目指しています 単一の共通インターフェイスの背後にある機能。

ラフは、Flake8(およびさまざまなプラグイン)、isortpydocstyleyesqa根絶pyupgradeオートフレーク、すべて数十または数百を実行しながら 個々のツールよりも何倍も高速です。

ラフは伝統的なリンターの責任を超え、代わりに高度なものとして機能します 型注釈のアップグレード、クラス定義の書き換え、並べ替えが可能なコード変換ツール インポートなど。

Ruffは非常に活発に開発され、次のような主要なオープンソースプロジェクトで使用されています。

ローンチのブログ記事をお読みください。

セバスチャン・ラミレス、クリエイター ファストAPIの数:

Ruffは非常に高速であるため、実際にコードであることを確認するためだけにコードに意図的なバグを追加することがあります コードの実行とチェック。

Elementlの創設者であるNick Schrockは、 GraphQLの共同作成者:

ラフがゲームチェンジャーなのはなぜですか?主な理由は、ほぼ1000倍高速だからです。文字通り。タイプミスではありません。オン 私たちの最大のモジュール(ダグスター自体、250k LOC)のpylintは約2.5分かかり、4つにまたがって並列化されます 私のM1のコア。コードベース全体に対してruffを実行するには、.4秒かかります。

ブライアン・ヴァン・デ・ヴェン、共同制作者 ボケの、原作者 コンダの:

ラフは私のマシンのflake150よりも~200-8倍速く、リポジトリ全体のスキャンには~0.2秒かかります。 ~20代。これは、ローカル開発者にとって非常に生活の質の向上です。それは私が追加したのに十分速いです それは実際のコミットフックとして、それは素晴らしいです。

ティモシークロスリーisortの作成者:

最初のプロジェクトをRuffに切り替えました。これまでのところ唯一の欠点:それは非常に速いので、意図的にいくつかのエラーを導入するまで、それが機能しているとは信じられませんでした。

ティム・アボット、リード ズリップの開発者:

これは途方もなく速いです... すごいです。

ruff

目次

  1. インストールと使用方法
  2. 構成
  3. サポートされているルール
    1. ピフレーク(F)
    2. パイコードスタイル (E, W)
    3. マッケイブ (C90)
    4. イソート (I)
    5. pep8-ネーミング (N)
    6. pydocstyle (D)
    7. パイアップグレード (UP)
    8. フレーク8-2020 (YTT)
    9. フレーク8-アノテーション (ANN)
    10. フレーク8-バンディット (S)
    11. フレーク8-ブラインド-除く(BLE)
    12. フレーク8ブールトラップ(FBT)
    13. フレーク8-バグベア (B)
    14. フレーク8-ビルトイン(A)
    15. フレーク8-コンマ (COM)
    16. フレーク8-内包表記 (C4)
    17. flake8-datetimez (DTZ)
    18. フレーク8デバッガ(T10)
    19. flake8-errmsg (EM)
    20. flake8-executable (EXE)
    21. flake8-implicit-str-concat (ISC)
    22. flake8-import-conventions (ICN)
    23. フレーク8ロギングフォーマット(G)
    24. フレーク8-いいえ-PEP420 (INP)
    25. フレーク8パイ(パイ)
    26. フレーク8プリント(T20)
    27. フレーク8-pytestスタイル(PT)
    28. フレーク8引用符 (Q)
    29. フレーク8リターン (RET)
    30. フレーク8-単純化 (SIM)
    31. フレーク8-整頓輸入品 (TID)
    32. フレーク8タイプチェック(TCH)
    33. flake8-unused-arguments (ARG)
    34. フレーク8-use-pathlib (PTH)
    35. 根絶(時代)
    36. パンダ獣医(PD)
    37. ピグレップフック(PGH)
    38. パイリント(PL)
    39. トリケラトプス(TRY)
    40. ラフ固有のルール (RUF)
  4. エディターの統合
  5. FAQ
  6. 貢献
  7. リリース
  8. ベンチマーク
  9. 参考
  10. ライセンス

インストールと使用方法

取り付け

ラフはPyPIのラフとして利用できます:

pip install ruff

macOS Homebrew および Linuxbrew ユーザーの場合、Ruff は Homebrewruff としても利用できます。

brew install ruff

Condaユーザーの場合、ラフはラフとしても利用できます。

conda-forge

conda install -c conda-forge ruff

Arch Linuxユーザーの場合、Ruffは公式リポジトリでruffとしても利用できます。

pacman -S ruff

アルパインユーザーの場合、Ruffはテストリポジトリでラフとしても利用できます。

apk add ruff

梱包状況

使い

Ruffを実行するには、次のいずれかを試してください。

ruff .                        # Lint all files in the current directory (and any subdirectories)
ruff path/to/code/            # Lint all files in `/path/to/code` (and any subdirectories)
ruff path/to/code/*.py        # Lint all `.py` files in `/path/to/code`
ruff path/to/code/to/file.py  # Lint `file.py`

Ruffをモードで実行して、変更時に自動的に再実行できます。

--watch

ruff path/to/code/ --watch

Ruffは事前コミットでも機能します。

- repo: https://github.com/charliermarsh/ruff-pre-commit
  # Ruff version.
  rev: 'v0.0.237'
  hooks:
    - id: ruff

構成

Ruffは、コマンドラインとコマンドラインの両方で構成できます。構成可能な完全なリストについては、 オプションについては、API リファレンスを参照してください。

pyproject.toml

指定しない場合、既定の構成は次のようになります。

[tool.ruff]
# Enable Pyflakes `E` and `F` codes by default.
select = ["E", "F"]
ignore = []

# Allow autofix for all enabled rules (when `--fix`) is provided.
fixable = ["A", "B", "C", "D", "E", "F", "..."]
unfixable = []

# Exclude a variety of commonly ignored directories.
exclude = [
    ".bzr",
    ".direnv",
    ".eggs",
    ".git",
    ".hg",
    ".mypy_cache",
    ".nox",
    ".pants.d",
    ".ruff_cache",
    ".svn",
    ".tox",
    ".venv",
    "__pypackages__",
    "_build",
    "buck-out",
    "build",
    "dist",
    "node_modules",
    "venv",
]
per-file-ignores = {}

# Same as Black.
line-length = 88

# Allow unused variables when underscore-prefixed.
dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

# Assume Python 3.10.
target-version = "py310"

[tool.ruff.mccabe]
# Unlike Flake8, default to a complexity level of 10.
max-complexity = 10

例として、次のようにRuffを構成します:(1)さらにflake8-bugbearルールを適用します デフォルトに。(2)行長違反の強制を避ける();(3)修正しようとしないでください フレーク8-バグベア()違反;(3)ファイルの先頭でのインポート違反を無視する()。

E501
B
E402
__init__.py

[tool.ruff]
# Enable flake8-bugbear (`B`) rules.
select = ["E", "F", "B"]

# Never enforce `E501` (line length violations).
ignore = ["E501"]

# Avoid trying to fix flake8-bugbear (`B`) violations.
unfixable = ["B"]

# Ignore `E402` (import violations) in all `__init__.py` files, and in `path/to/file.py`.
[tool.ruff.per-file-ignores]
"__init__.py" = ["E402"]
"path/to/file.py" = ["E402"]

プラグインの設定は、次のようにサブセクションとして表す必要があります。

[tool.ruff]
# Add "Q" to the list of enabled codes.
select = ["E", "F", "Q"]

[tool.ruff.flake8-quotes]
docstring-quotes = "double"

RuffはFlake8のルールコードシステムを反映しており、各ルールコードは<>〜<>文字で構成されています。 プレフィックスの後に <> 桁の数字が続きます (例: )。プレフィックスは、ルールの「ソース」を示します (例えば、ピフレークの場合、 のために 、 のために )。有効なセット ルールは、完全なコード (例: ) とプレフィックス (例: ) の両方をサポートする and オプションによって決定されます。

F401
F
E
pycodestyle
ANN
flake8-annotations
select
ignore
F401
F

特殊なケースとして、Ruffはすべてのルールを有効にするコードもサポートしています。一部のルールは、代替ドキュメント文字列を表すため、競合することに注意してください(例:および)。 形式。追加の構成なしで有効にすると、特に最適ではない動作が発生する可能性があります。 プラグイン用。

ALL
pydocstyle
D203
D211
ALL
pydocstyle

Ruffの設定方法がわからない場合は、次の推奨ガイドラインをご覧ください。

  • 優先し、 、 、ルールセットを作成します 暁。
    select
    ignore
    extend-select
    extend-ignore
  • 慎重に使用してください。有効にすると、アップグレードするたびに新しいルールが暗黙的に有効になります。
    ALL
    ALL
  • 少数のルールセット () から始めて、一度にカテゴリを追加します。例えば 人気のある拡張機能を有効にするために拡張することを検討できます。
    select = ["E", "F"]
    select = ["E", "F", "B"]
    flake8-bugbear
  • デフォルトでは、Ruffのオートフィックスはアグレッシブです。好みに対して攻撃的すぎることがわかった場合は、 特定のルールまたはカテゴリの自動修正をオフにすることを検討してください(FAQを参照)。

の代わりに、Ruffはファイルも尊重します。 同等のスキーマ (ただし、階層は省略できます)。たとえば、上記の説明は次のように表されます。

pyproject.toml
ruff.toml
[tool.ruff]
pyproject.toml
ruff.toml

# Enable Pyflakes and pycodestyle rules.
select = ["E", "F"]

# Never enforce `E501` (line length violations).
ignore = ["E501"]

# Always autofix, but never try to fix `F401` (unused imports).
fix = true
unfixable = ["F401"]

# Ignore `E402` (import violations) in all `__init__.py` files, and in `path/to/file.py`.
[per-file-ignores]
"__init__.py" = ["E402"]
"path/to/file.py" = ["E402"]

構成可能なオプションの完全な一覧については、API リファレンスを参照してください。

いくつかの一般的な構成設定は、コマンドラインから指定できます。

ruff path/to/code/ --select F401 --select F403

詳細については、以下を参照してください。

ruff --help

Ruff: An extremely fast Python linter.

Usage: ruff [OPTIONS] <COMMAND>

Commands:
  check  Run Ruff on the given files or directories (default)
  rule   Explain a rule
  clean  Clear any caches in the current directory and any subdirectories
  help   Print this message or the help of the given subcommand(s)

Options:
  -h, --help     Print help
  -V, --version  Print version

Log levels:
  -v, --verbose  Enable verbose logging
  -q, --quiet    Print lint violations, but nothing else
  -s, --silent   Disable all logging (but still exit with status code "1" upon detecting lint violations)

For help with a specific command, see: `ruff help <command>`.

pyproject.toml
発見

ESLintと同様に、 Ruffは階層構成をサポートしており、 ディレクトリ階層は、ファイル内のすべてのパスとともに、個々のファイルすべてに使用されます (例:globs、パス)は、ファイルを含むディレクトリに対して相対的に解決されます。

pyproject.toml
pyproject.toml
exclude
src
pyproject.toml

これらの規則にはいくつかの例外があります。

  1. 特定のパスの「最も近い」ファイルを見つける際に、Ruffはセクションのないファイルを無視します。
    pyproject.toml
    pyproject.toml
    [tool.ruff]
  2. 構成ファイルが を介して直接渡される場合、これらの設定は ファイル。その構成ファイル内の相対パス (glob やパスなど) は、 現在の作業ディレクトリを基準にして解決されます。
    --config
    exclude
    src
  3. ファイルシステム階層にファイルが見つからない場合、Ruffはフォールバックして 既定の構成。ユーザー固有の構成ファイルが存在する場合 で、そのファイルがデフォルトの代わりに使用されます 構成は、ディレクトリクレートを介して決定され、すべての相対パスは現在の作業ディレクトリに対して再び解決されます。
    pyproject.toml
    ${config_dir}/ruff/pyproject.toml
    ${config_dir}
  4. コマンドラインで提供されるサポートされている設定( など)は、解決されたすべての構成ファイルの設定を上書きします。
    pyproject.toml
    --select

ESLintとは異なり、 Ruff は、構成ファイル間で設定をマージしません。代わりに、「最も近い」構成ファイル が使用され、親構成ファイルは無視されます。この暗黙のカスケードの代わりに、ラフは は拡張フィールドをサポートしており、次のように別のファイルから設定を継承できます。

pyproject.toml

# Extend the `pyproject.toml` file in the parent directory.
extend = "../pyproject.toml"
# But use a different line length.
line-length = 100

上記のすべてのルールは、ファイルに等しく適用されます。Ruffがaとファイルの両方を検出すると、.

ruff.toml
ruff.toml
pyproject.toml
ruff.toml

Python ファイル検出

コマンドラインでパスが渡されると、Ruffはその中のすべてのPythonファイルを自動的に検出します パス、除外設定と拡張除外設定を考慮に入れる 各ディレクトリのファイルで。

pyproject.toml

デフォルトでは、Ruffは、およびグローバルファイルを介して省略されたファイルもスキップします(参照:respect-gitignore)。

.ignore
.gitignore
.git/info/exclude
gitignore

直接渡されるファイルは、上記の基準に関係なく、常にリントされます。 たとえば、常にリントします。

ruff
ruff /path/to/excluded/file.py
file.py

エラーを無視する

lint ルールを完全に省略するには、コマンドラインまたはファイルで ignore または extend-ignore を使用して "ignore" リストに追加します。

pyproject.toml

違反をインラインで無視するために、ラフはFlake8と同様のシステムを使用します。 個々の違反を無視するには、次のように行の末尾に追加します。

noqa
# noqa: {code}

# Ignore F841.
x = 1  # noqa: F841

# Ignore E741 and F841.
i = 1  # noqa: E741, F841

# Ignore _all_ violations.
x = 1  # noqa

複数行の文字列の場合、ディレクティブは文字列の末尾に来る必要があり、 は、次のように文字列全体に適用されます。

noqa

"""Lorem ipsum dolor sit amet.

Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
"""  # noqa: E501

ファイル全体のすべての違反を無視するために、RuffはFlake8のディレクティブをサポートしています (または、同等に)。これらのディレクティブのいずれかをファイルの任意の部分に追加すると、 ファイル全体に対する強制を無効にします。

# flake8: noqa
# ruff: noqa

ファイル全体を対象とした除外 (例: "の F841 違反をすべて無視する") については、ファイルごとの ignores 構成設定を参照してください。

/path/to/file.py

「アクションコメント」

ラフはの「アクションコメント」(、および)を尊重します。 コードブロックやその他のインラインのインポートソートを選択的に有効または無効にできるようにする 構成。

isort
# isort: skip_file
# isort: on
# isort: off
# isort: skip
# isort: split

詳細については、isort のドキュメントを参照してください。

ディレクティブの自動化
noqa

Ruffは、管理を支援するためにいくつかのワークフローをサポートしています。

noqa

まず、Ruffは特別なルールコードを提供して、ディレクティブが 「有効」とは、無視していると言っている違反が実際にその行でトリガーされているという点で(および したがって抑制された)。実行して、未使用のディレクティブにフラグを付けることができます。

RUF100
noqa
ruff /path/to/file.py --extend-select RUF100
noqa

次に、Ruffは自動修正機能を使用して未使用のディレクティブを自動的に削除できます。 実行して、未使用のディレクティブを自動的に削除できます。

noqa
ruff /path/to/file.py --extend-select RUF100 --fix
noqa

第三に、Ruffはすべての障害行にディレクティブを自動的に追加できます。これは、次の場合に便利です。 新しいコードベースを Ruff に移行します。あなたは自動的に実行することができます 障害のあるすべての行に、適切なルール・コードを使用してディレクティブを追加します。

noqa
ruff /path/to/file.py --add-noqa
noqa

サポートされているルール

ルールの出所に関係なく、RuffはRustのすべてのルールをファーストパーティ機能として再実装します。

デフォルトでは、ラフはFlake8とルールを有効にします。Ruffは、カテゴリのすべてのルールをサポートしています。 カテゴリのサブセットであり、によって廃止された文体規則を省略しています。 ブラックのようなオートフォーマッタの使用。

E
F
F
E

絵文字は🛠、ルールがコマンドラインオプションで自動的に修正可能であることを示します。

--fix

ピフレーク(F)

詳細については、PyPI の Pyflakes を参照してください。

コード 名前 メッセージ 修理する
F401 会場 未使用-インポート
{name}
インポートされたが使用されていない。冗長エイリアスの追加または使用を検討する
__all__
🛠
F402 会場 インポート-シャドウバイループ-var ループ変数で影を落とした行{行}からインポート
{name}
F403 会場 インポートスター使用
from {name} import *
中古;未定義の名前を検出できません
F404 会場 後期輸入
from __future__
インポートはファイルの先頭で行う必要があります
F405 会場 インポート-スター-使用法
{name}
未定義であるか、スターインポートから定義されている可能性があります: {ソース}
F406 会場 インポートスター-許可されていません
from {name} import *
モジュールレベルでのみ許可
F407 会場 将来の機能未定義 将来の機能は定義されていません
{name}
F501 会場 パーセント形式無効な形式
%
-フォーマット文字列に無効なフォーマット文字列があります: {メッセージ}
F502 会場 パーセント形式の予期マッピング
%
-フォーマット文字列はマッピングを期待していましたが、シーケンスを取得しました
F503 会場 パーセント形式の予期されるシーケンス
%
-フォーマット文字列はシーケンスを予期していましたが、マッピングを取得しました
F504 会場 パーセント形式-余分な名前の引数
%
-フォーマット文字列に未使用の名前付き引数があります: {メッセージ}
🛠
F505 会場 パーセント形式の欠落引数
%
-フォーマット文字列にプレースホルダーの引数がありません:{メッセージ}
F506 会場 パーセント形式混合位置と名前付き
%
-format 文字列に位置指定プレースホルダーと名前付きプレースホルダーが混在しています
F507 会場 パーセント形式-位置-カウント-不一致
%
-フォーマット文字列には{必要な}プレースホルダーがありますが、{取得}置換があります
F508 会場 パーセントフォーマットスター要求シーケンス
%
-フォーマット文字列指定子にはシーケンスが必要です
*
F509 会場 パーセント形式 - サポートされていない形式文字
%
-フォーマット文字列にサポートされていないフォーマット文字 '{char}' が含まれています
F521 会場 文字列ドット形式無効な形式
.format
呼び出しに無効なフォーマット文字列があります: {メッセージ}
F522 会場 文字列ドット形式 - 余分な名前の引数
.format
呼び出しに未使用の名前付き引数があります: {メッセージ}
🛠
F523 会場 文字列ドット形式 - 余分な位置引数
.format
呼び出しの位置には未使用の引数があります: {メッセージ}
F524 会場 文字列ドット形式の欠落引数
.format
呼び出しにはプレースホルダーの引数がありません: {メッセージ}
F525 会場 文字列ドットフォーマットミキシング自動
.format
文字列は自動番号付けと手動番号付けを混在させます
F541 会場 F 文字列の欠落したプレースホルダー プレースホルダーのない f 文字列 🛠
F601 会場 複数値繰り返しキーリテラル ディクショナリ キー リテラルの繰り返し
{name}
🛠
F602 会場 複数値繰り返しキー変数 辞書キーの繰り返し
{name}
🛠
F621 会場 スター代入式 星の開梱代入の式が多すぎます
F622 会場 2つ星の式 割り当ての 2 つのスター付き式
F631 会場 アサートタプル アサートテストは空でないタプルであり、常に
True
F632 会場 is-literal 定数リテラルの比較に使用
==
🛠
F633 会場 無効な印刷構文 の使用は関数で無効です
>>
print
F634 会場 if-タプル テストがタプルの場合、常に
True
F701 会場 ブレークアウトサイドループ
break
アウトサイドループ
F702 会場 アウトサイドループの継続
continue
ループが正しくない
F704 会場 関数外降伏
{keyword}
関数外のステートメント
F706 会場 関数外に戻る
return
関数/メソッドの外部にあるステートメント
F707 会場 デフォルト-最後ではない例外 最後の例外ハンドラーではないブロック
except
F722 会場 前方アノテーション構文エラー 前方注釈の構文エラー:
{body}
F811 会場 未使用時の再定義 行 {行} からの未使用の再定義
{name}
F821 会場 未定義名 未定義の名前
{name}
F822 会場 未定義のエクスポート 未定義の名前
{name}
__all__
F823 会場 未定義ローカル 代入前に参照されるローカル変数
{name}
F841 会場 未使用変数 ローカル変数は代入されているが、使用されていない
{name}
🛠
F842 会場 未使用アノテーション ローカル変数には注釈が付けられていますが、使用されることはありません
{name}
F901 会場 レイズ・アン・インプリメンテーション
raise NotImplemented
あるべき
raise NotImplementedError
🛠

パイコードスタイル (E, W)

詳細については、PyPIのパイコードスタイルを参照してください。

エラー (E)

コード 名前 メッセージ 修理する
E101 スペースとタブの混在 インデントにスペースとタブが混在している
E401 1 行に複数インポート 1 行に複数のインポート
E402 モジュール・インポートがファイルの先頭にない モジュールレベルのインポートがファイルの先頭にない
E501 行が長すぎる 行が長すぎます ({長さ} > {制限} 文字)
E711 なし比較 との比較は
None
cond is None
🛠
E712 真偽比較 との比較は
True
cond is True
🛠
E713 非テスト中 メンバーシップのテストは
not in
🛠
E714 テストされていません オブジェクトIDのテストは、
is not
🛠
E721 型比較 型を比較しないで、
isinstance()
E722 使用しない裸を除く 裸で使用しないでください
except
E731 割り当てないラムダ 式を代入せず、
lambda
def
🛠
E741 あいまいな変数名 あいまいな変数名:
{name}
E742 あいまいなクラス名 あいまいなクラス名:
{name}
E743 あいまいな関数名 あいまいな関数名:
{name}
E902 IOエラー {メッセージ}
E999 構文エラー 構文エラー: {メッセージ}

警告 (W)

コード 名前 メッセージ 修理する
W292 ファイルの終わりに改行がない ファイルの末尾に改行がない 🛠
W505 ドキュメント行が長すぎます ドキュメント行が長すぎます ({長さ} > {制限} 文字)
W605 無効なエスケープシーケンス 無効なエスケープ シーケンス: '{char}' 🛠

マッケイブ (C90)

詳細については、PyPIのマッケイブを参照してください。

コード 名前 メッセージ 修理する
C901 機能が複雑すぎる
{name}
複雑すぎる ({複雑さ})

イソート (I)

詳細については、PyPI の isort を参照してください。

コード 名前 メッセージ 修理する
I001 ソートされていないインポート インポートブロックがソートされていないか、フォーマットされていない 🛠
I002 欠落している必須のインポート 必要なインポートがありません:
{name}
🛠

pep8-ネーミング (N)

詳細については、PyPI での pep8-命名 を参照してください。

コード 名前 メッセージ 修理する
N801 無効なクラス名 クラス名には CapWords 規則を使用する必要があります
{name}
N802 無効な関数名 関数名は小文字にする必要があります
{name}
N803 無効な引数名 引数名は小文字にする必要があります
{name}
N804 クラスメソッドの最初の引数名が無効です クラスメソッドの最初の引数には名前を付ける必要があります
cls
N805 メソッドの最初の引数名が無効です メソッドの最初の引数には名前を付ける必要があります
self
N806 非小文字変数インファンクション 関数内の変数は小文字にする必要があります
{name}
N807 ダンダー関数名 関数名の先頭と末尾が
__
N811 定数-非定数としてインポート 非定数としてインポートされた定数
{name}
{asname}
N812 小文字-非小文字としてインポート 小文字以外としてインポートされた小文字
{name}
{asname}
N813 キャメルケース-小文字としてインポート 小文字としてインポートされたキャメルケース
{name}
{asname}
N814 キャメルケース-定数としてインポート キャメルケースは定数としてインポートされます
{name}
{asname}
N815 クラススコープ内の大文字と小文字が混在する変数 クラススコープ内の変数は混合しないでくださいケース
{name}
N816 大/小文字混合変数イングローバルスコープ グローバルスコープ内の変数は混合しないでくださいケース
{name}
N817 キャメルケース-頭字語としてインポート 頭字語としてインポートされたキャメルケース
{name}
{asname}
N818 例外名のエラーサフィックス 例外名には、エラー サフィックスを付ける必要があります。
{name}

pydocstyle (D)

詳細については、PyPI の pydocstyle を参照してください。

コード 名前 メッセージ 修理する
D100 パブリックモジュール パブリックモジュールにドキュメント文字列がありません
D101 パブリッククラス パブリッククラスにドキュメント文字列がありません
D102 パブリックメソッド パブリックメソッドにドキュメント文字列がありません
D103 公共機能 パブリック関数にドキュメント文字列がありません
D104 パブリックパッケージ パブリックパッケージにドキュメント文字列がありません
D105 マジックメソッド マジックメソッドでドキュメント文字列がありません
D106 パブリックネストクラス パブリックネストされたクラスにドキュメント文字列がありません
D107 パブリック初期化 にドキュメント文字列がありません
__init__
D200 1行に収まる 1 行のドキュメント文字列は 1 行に収まる必要があります 🛠
D201 機能前の空白行なし 関数のドキュメント文字列の前に空白行は許可されていません({num_lines}が見つかりました) 🛠
D202 機能後の空白行なし 関数のドキュメント文字列の後に空白行は許可されていません({num_lines}が見つかりました) 🛠
D203 クラスの前の 1 行の空白行 クラスのドキュメント文字列の前に 1 行の空白行が必要 🛠
D204 クラスの後の 1 行の空白行 クラスのドキュメント文字列の後に1行の空白行が必要 🛠
D205 要約後のブランク行 要約行と説明の間に空白行が 1 行必要 🛠
D206 スペース付きインデント Docstringは、タブではなくスペースでインデントする必要があります
D207 インデントなし ドキュメント文字列のインデント不足 🛠
D208 オーバーインデントなし ドキュメント文字列が過剰にインデントされている 🛠
D209 最後の段落の後の改行 複数行のドキュメント文字列の終了引用符は別の行にする必要があります 🛠
D210 周囲なしの空白 ドキュメント文字列テキストを囲む空白は許可されません 🛠
D211 クラスの前に空白行がない クラスのドキュメント文字列の前に空白行は許可されません 🛠
D212 複数行-要約-最初の行 複数行のドキュメント文字列の概要は、最初の行から開始する必要があります 🛠
D213 複数行-要約-2行目 複数行のドキュメント文字列の概要は、2 行目から開始する必要があります 🛠
D214 セクションが過度にインデントされていない セクションが過剰にインデントされています ("{名前}") 🛠
D215 セクション下線-オーバーインデントなし セクションの下線が過剰にインデントされている ("{名前}") 🛠
D300 使用-三重引用符 """トリプル二重引用符"""
D301 バックスラッシュされたコンテンツの r-プレフィックスを使用します ドキュメント文字列にバックスラッシュがある場合はr"""を使用します
D400 期間終了 最初の行はピリオドで終わる必要があります 🛠
D401 非命令的な気分 ドキュメント文字列の最初の行は命令的な気分でなければなりません: "{first_line}"
D402 署名なし 最初の行は関数のシグネチャであってはなりません
D403 先頭行大文字 最初の行の最初の単語は適切に大文字にする必要があります
D404 このプレフィックスなし ドキュメント文字列の最初の単語は "This" であってはなりません
D405 セクション名を大文字にする セクション名は適切に大文字にする必要があります ("{name}") 🛠
D406 セクション名の後の改行 セクション名は改行 ("{name}") で終わる必要があります。 🛠
D407 セクションの後に破線の下線 セクション ("{name}") の後に破線の下線がない 🛠
D408 セクション下線後の名前 セクションの下線は、セクション名 ("{name}") の次の行にする必要があります。 🛠
D409 セクション-下線-一致-セクションの長さ セクションの下線は、その名前 ("{name}") の長さと一致する必要があります。 🛠
D410 セクション後の空白行 セクション ("{名前}") の後に空白行がありません 🛠
D411 セクション前の空白行 セクション ("{名前}") の前に空白行がありません 🛠
D412 ヘッダーとコンテンツの間に空白行がない セクション ヘッダーとそのコンテンツ ("{name}") の間に空白行を含めることはできません。 🛠
D413 最後のセクションの後の空白行 最後のセクション ("{name}") の後に空白行がありません 🛠
D414 非空セクション セクションにコンテンツがありません ("{名前}")
D415 句読点の終わり 最初の行は、ピリオド、疑問符、または感嘆符で終わる必要があります 🛠
D416 セクション名コロンで終わる セクション名はコロン ("{name}") で終わる必要があります。 🛠
D417 すべての引数のドキュメント ドキュメント文字列に引数の説明がありません:
{name}
D418 スキップドキュメント文字列 で装飾された関数には、ドキュメント文字列を含めることはできません
@overload
D419 空でない ドキュメント文字列が空です

パイアップグレード (UP)

詳細については、PyPI での pyupgrade を参照してください。

コード 名前 メッセージ 修理する
UP001 役に立たないメタクラス型
__metaclass__ = type
が暗示される
🛠
UP003 プリミティブ型 代わりに使用
{}
type(...)
🛠
UP004 役に立たないオブジェクトの継承 クラス継承元
{name}
object
🛠
UP005 非推奨のユニットテストエイリアス
{alias}
は非推奨です。使用
{target}
🛠
UP006 使用-PEP585-アノテーション 型注釈の代わりに使用
{}
{}
🛠
UP007 使用-PEP604-アノテーション 型注釈に使用
X | Y
🛠
UP008 パラメータ付きスーパーコール 代わりに使用
super()
super(__class__, self)
🛠
UP009 PEP3120-不要なコーディング-コメント UTF-8エンコーディング宣言は不要です 🛠
UP010 不要な将来のインポート ターゲット Python バージョンの不要なインポート
__future__
{import}
🛠
UP011 パラメータなしの lru-キャッシュ 不要なパラメータ
functools.lru_cache
🛠
UP012 不要エンコード - UTF8 UTF-8 としての不要な呼び出し
encode
🛠
UP013 型付き辞書関数をクラスに変換する 関数構文からクラス構文への変換
{name}
TypedDict
🛠
UP014 名前付きタプル関数型からクラスへの変換 関数構文からクラス構文への変換
{name}
NamedTuple
🛠
UP015 冗長オープンモード 不要なオープン モード パラメーター 🛠
UP016 削除-6-互換性 不要な互換性の使用
six
🛠
UP017 日時-タイムゾーン-UTC エイリアスを使用
datetime.UTC
🛠
UP018 ネイティブリテラル への不要な呼び出し
{literal_type}
🛠
UP019 タイピング-テキスト-str-エイリアス
typing.Text
は非推奨です。使用
str
🛠
UP020 オープンエイリアス 組み込みを使用する
open
🛠
UP021 置換-ユニバーサル-改行
universal_newlines
は非推奨です。使用
text
🛠
UP022 replace-stdout-stderr stdout と stderr をパイプに送信することは非推奨です。
capture_output
🛠
UP023 書き換え-c-要素ツリー
cElementTree
は非推奨です。使用
ElementTree
🛠
UP024 os-error-alias エイリアスされたエラーを次のように置き換えます。
OSError
🛠
UP025 書き換え-ユニコード-リテラル 文字列からユニコードリテラルを削除する 🛠
UP026 書き換え-モック-インポート
mock
は非推奨です。使用
unittest.mock
🛠
UP027 書き換え-リスト-内包表記 アンパックされたリスト内包表記をジェネレータ式に置き換える 🛠
UP028 書き換え-降伏元 オーバーループを次のように置き換えます。
yield
for
yield from
🛠
UP029 不要組み込みインポート 不要な組み込みインポート:
{import}
🛠
UP030 フォーマットリテラル 定位置形式フィールドに暗黙的な参照を使用する 🛠
UP031 printf-string-format パーセント形式の代わりに書式指定子を使用する 🛠
UP032 Fストリング 呼び出しの代わりに f 文字列を使用する
format
🛠
UP033 機能ツール-キャッシュ 代わりに使用
@functools.cache
@functools.lru_cache(maxsize=None)
🛠
UP034 無関係括弧 無関係な括弧を避ける 🛠

フレーク8-2020 (YTT)

詳細については、PyPIのflake8-2020を参照してください。

コード 名前 メッセージ 修理する
YTT101 sys-version-slice3-reference
sys.version[:3]
参照 (python3.10)、使用
sys.version_info
YTT102 システム バージョン 2 参照
sys.version[2]
参照 (python3.10)、使用
sys.version_info
YTT103 sys-version-cmp-str3
sys.version
文字列(python3.10)と比較して、
sys.version_info
YTT201 sys-version-info0-eq3-reference
sys.version_info[0] == 3
参照 (python4)、使用
>=
YTT202 3 つの PY<> 参照
six.PY3
参照 (python4)、使用
not six.PY2
YTT203 sys-version-info1-cmp-int
sys.version_info[1]
整数(python4)と比較し、タプルと比較する
sys.version_info
YTT204 sys-version-info-minor-cmp-int
sys.version_info.minor
整数(python4)と比較し、タプルと比較する
sys.version_info
YTT301 システム バージョン 0 参照
sys.version[0]
参照 (python10)、使用
sys.version_info
YTT302 sys-version-cmp-str10
sys.version
文字列(Python10)と比較して、
sys.version_info
YTT303 sys-version-slice1-reference
sys.version[:1]
参照 (python10)、使用
sys.version_info

フレーク8-アノテーション (ANN)

詳細については、PyPI の flake8-annotations を参照してください。

コード 名前 メッセージ 修理する
ANN001 型関数引数がありません 関数引数の型注釈がありません
{name}
ANN002 欠落している型引数 の型注釈がありません
*{name}
ANN003 欠落タイプ-kwargs の型注釈がありません
**{name}
ANN101 欠落タイプ自己 in メソッドの型注釈がありません
{name}
ANN102 欠落タイプ CL クラスメソッド内の型注釈がありません
{name}
ANN201 欠落戻り型パブリック関数 パブリック関数の戻り値の型注釈がありません
{name}
ANN202 欠落戻り型プライベート関数 プライベート関数の戻り値の型注釈がありません
{name}
ANN204 欠落戻り型特殊メソッド 特別なメソッドの戻り値の型注釈がありません
{name}
🛠
ANN205 欠落リターン型静的メソッド 静的メソッドの戻り値の型注釈がありません
{name}
ANN206 戻り値の型クラスメソッドがありません クラスメソッドの戻り値の型注釈がありません
{name}
ANN401 動的型付け式 動的に型指定された式 (型指定。任意)は許可されていません
{name}

フレーク8-バンディット (S)

詳細については、PyPI の flake8-bandit を参照してください。

コード 名前 メッセージ 修理する
S101 アサート使用 検出されたの使用
assert
S102 実行使用済み 検出されたの使用
exec
S103 不正なファイル権限
os.chmod
ファイルまたはディレクトリへの許容マスクの設定
{mask:#o}
S104 ハードコードされたバインドされたすべてのインターフェイス すべてのインターフェイスへのバインドが可能
S105 ハードコードされたパスワード文字列 ハードコードされたパスワードの可能性: "{}"
S106 ハードコードされたパスワード機能引数 ハードコードされたパスワードの可能性: "{}"
S107 ハードコードされたパスワードデフォルト ハードコードされたパスワードの可能性: "{}"
S108 ハードコードされた一時ファイル 一時ファイルまたはディレクトリの安全でない使用の可能性: "{}"
S110 試行例外パス
try
-
except
-
pass
検出された場合は、例外をログに記録することを検討してください
S113 タイムアウトなしの要求 タイムアウトがに設定された要求呼び出しの使用の可能性
{value}
S324 hashlib-insecure-hash-function : "{}" での安全でないハッシュ関数の使用の可能性
hashlib
S501 証明書検証なしの要求 SSL 証明書チェックを無効にした呼び出しの使用の可能性
{string}
verify=False
S506 安全でない - yaml-load 安全でないローダーが .任意のオブジェクトのインスタンス化を許可します。考える。
{name}
yaml.load
yaml.safe_load
S508 SNMP 非セキュア バージョン SNMPv1 および SNMPv2 の使用は安全ではありません。可能であれば、SNMPv3 を使用します。
S509 SNMP 弱暗号 暗号化なしで SNMPv3 を使用しないでください。 &は安全ではありません。
noAuthNoPriv
authNoPriv
S612 ロギング-構成-非セキュア-リッスン 安全でない使用が検出されました
logging.config.listen
S701 ジンジャ2-オートエスケープ-偽 jinja2テンプレートを使用することは危険であり、XSSにつながる可能性があります。この機能を確認または使用してください。
autoescape=False
autoescape=True
select_autoescape

フレーク8-ブラインド-除く(BLE)

詳細については、PyPI の flake8-blind-except を参照してください。

コード 名前 メッセージ 修理する
BLE001 ブラインドを除く ブラインド例外をキャッチしないでください:
{name}

フレーク8ブールトラップ(FBT)

詳細については、PyPI の flake8-boolean-trap を参照してください。

コード 名前 メッセージ 修理する
FBT001 ブール位置引数イン関数定義 関数定義のブール位置引数
FBT002 関数定義内のブール値デフォルト値 関数定義のブール値のデフォルト値
FBT003 関数呼び出しのブール値位置値 関数呼び出しのブール値の位置値

フレーク8-バグベア (B)

詳細については、PyPI の flake8-bugbear を参照してください。

コード 名前 メッセージ 修理する
B002 単項プレフィックス増分 Python は単項プレフィックスの増分をサポートしていません
B003 OS-環境への割り当て 割り当て先で環境がクリアされない
os.environ
B004 信頼性の低い呼び出し可能チェック xが呼び出し可能かどうかをテストするために使用することは信頼できません。一貫した結果を得るために使用します。
hasattr(x, '__call__')
callable(x)
B005 複数文字のストリップ 複数文字の文字列で使用すると、読者が誤解を招く可能性があります
.strip()
B006 変更可能な引数-デフォルト 引数のデフォルトに可変データ構造を使用しない
B007 未使用ループ制御変数 ループ制御変数がループ本体内で使用されない
{name}
🛠
B008 関数呼び出し引数デフォルト 引数のデフォルトで関数呼び出しを実行しない
{name}
B009 定数付き取得 定数属性値を指定して呼び出さないでください。通常のプロパティアクセスよりも安全ではありません。
getattr
🛠
B010 定数付きセット 定数属性値を指定して呼び出さないでください。通常のプロパティアクセスよりも安全ではありません。
setattr
🛠
B011 偽を主張しない しない(これらの呼び出しを削除する)、上げる
assert False
python -O
AssertionError()
🛠
B012 ジャンプステートメントインラスト
{name}
内部ブロックが原因で例外が消音される
finally
B013 例外ハンドラ内の冗長タプル 長さ 1 タプル リテラルは冗長です。の代わりに書く。
except {name}
except ({name},)
🛠
B014 重複ハンドラ例外 重複する例外を持つ例外ハンドラ:
{name}
🛠
B015 役に立たない比較 無意味な比較。この比較は、CPU命令を無駄にするだけです。先頭に追加するか、削除します。
assert
B016 リテラルを上げることはできません リテラルを上げることはできません。返品するつもりでしたか、それとも例外を発生させるつもりでしたか?
B017 アサートなし発生例外
assertRaises(Exception)
悪と見なされるべきです
B018 役に立たない表現 役に立たない表現が見つかりました。変数に割り当てるか、削除します。
B019 キャッシュされたインスタンスメソッド メソッドまたは on メソッドを使用すると、メモリリークが発生する可能性があります
functools.lru_cache
functools.cache
B020 ループ変数オーバーライドイテレータ ループ制御変数は反復可能なオーバーライドをオーバーライドします
{name}
B021 f-文字列-ドキュメント文字列 ドキュメント文字列として使用される f 文字列。これは、Pythonによってドキュメント文字列ではなく結合された文字列として解釈されます。
B022 役に立たないコンテキストライブラリ抑制 に渡される引数はありません。例外は抑制されないため、このコンテキストマネージャは冗長です。
contextlib.suppress
B023 関数使用ループ変数 関数定義がループ変数をバインドしない
{name}
B024 抽象基本クラス - 抽象メソッドなし
{name}
は抽象基本クラスですが、抽象メソッドはありません
B025 重複試行ブロック例外 重複する例外を含む try-except ブロック
{name}
B026 スター-引数-キーワード後の解凍-引数 キーワード引数の後の star-arg の展開は強く推奨されません
B027 抽象デコレータなしの空のメソッド
{name}
は抽象基本クラスの空のメソッドですが、抽象デコレータはありません
B904 内側から出さずに上げる except 句内で、例外処理のエラーと区別するために、または で例外を発生させます。
raise ... from err
raise ... from None
B905 zip-without-explicit-strict
zip()
明示的なパラメーターなし
strict=

フレーク8-ビルトイン(A)

詳細については、PyPI の flake8-builtins を参照してください。

コード 名前 メッセージ 修理する
A001 組み込み変数シャドウイング 変数はPython組み込みのシャドウイングです
{name}
A002 組み込み引数シャドウイング 引数はPythonの組み込みをシャドウイングしています
{name}
A003 組み込み属性シャドウイング クラス属性はPython組み込みのシャドウイングです
{name}

フレーク8-コンマ (COM)

詳細については、PyPI の flake8 コンマを参照してください。

コード 名前 メッセージ 修理する
COM812 末尾のコンマがありません 末尾のコンマがありません 🛠
COM818 末尾のコンマオンベアタプル禁止 裸のタプルの末尾のコンマは禁止されています
COM819 末尾のコンマ禁止 末尾のコンマは禁止されています 🛠

フレーク8-内包表記 (C4)

詳細については、PyPI の flake8 内包表記を参照してください。

コード 名前 メッセージ 修理する
C400 不要な発電機リスト 不要なジェネレータ(理解として書き換え)
list
🛠
C401 不要な発電機セット 不要なジェネレータ(理解として書き換え)
set
🛠
C402 不要なジェネレータディクショナ 不要なジェネレータ(理解として書き換え)
dict
🛠
C403 不要リスト内包表記セット 不必要な理解(理解として書き直す)
list
set
🛠
C404 不必要なリスト理解口述 不必要な理解(理解として書き直す)
list
dict
🛠
C405 不要なリテラルセット 不要なリテラル (リテラルとして書き換える)
{obj_type}
set
🛠
C406 不要なリテラル辞書 不要なリテラル (リテラルとして書き換える)
{obj_type}
dict
🛠
C408 不要な収集呼び出し 不要な呼び出し (リテラルとして書き換える)
{obj_type}
🛠
C409 不要なリテラル内タプル呼び出し 渡された不要なリテラル (リテラルとして書き換える)
{literal}
tuple()
tuple
🛠
C410 リスト内の不要なリテラル呼び出し 渡された不要なリテラル ( への外部呼び出しを削除します
{literal}
list()
list()
)
🛠
C411 不要リスト呼び出し 不要な呼び出し (外部呼び出しを削除します。
list
list()
)
🛠
C413 不要なコールアラウンドソート 不要な通話
{func}
sorted()
🛠
C414 不要なダブルキャストまたはプロセス 内の不要な呼び出し
{inner}
{outer}()
C415 不要な添え字の反転 反復可能な内部の不要な添え字の反転
{func}()
C416 不必要な理解 不要な理解(を使用して書き換える
{obj_type}
{obj_type}()
)
🛠
C417 不要マップ 不要な使用(ジェネレータ式を使用した書き換え)
map

flake8-datetimez (DTZ)

詳細については、PyPI の flake8-datetimez を参照してください。

コード 名前 メッセージ 修理する
DTZ001 呼び出し日時なし-tzinfo 引数なしでの使用は許可されていません
datetime.datetime()
tzinfo
DTZ002 コール日付時刻-今日 の使用は許可されていません、代わりに使用してください
datetime.datetime.today()
datetime.datetime.now(tz=)
DTZ003 call-datetime-utcnow の使用は許可されていません、代わりに使用してください
datetime.datetime.utcnow()
datetime.datetime.now(tz=)
DTZ004 call-datetime-utcfromtimestamp の使用は許可されていません、代わりに使用してください
datetime.datetime.utcfromtimestamp()
datetime.datetime.fromtimestamp(ts, tz=)
DTZ005 呼び出し日時-今-なし-tzinfo 引数なしでの使用は許可されていません
datetime.datetime.now()
tz
DTZ006 呼び出し日時からタイムスタンプ 引数なしでの使用は許可されていません
datetime.datetime.fromtimestamp()
tz
DTZ007 呼び出し日時 - strp時間なしゾーン %z なしでの使用の後には、または
datetime.datetime.strptime()
.replace(tzinfo=)
.astimezone()
DTZ011 コール日付-今日 の使用は許可されていません、代わりに使用してください
datetime.date.today()
datetime.datetime.now(tz=).date()
DTZ012 コール日付-送信元タイムスタンプ の使用は許可されていません、代わりに使用してください
datetime.date.fromtimestamp()
datetime.datetime.fromtimestamp(ts, tz=).date()

フレーク8デバッガ(T10)

詳細については、PyPI の flake8-デバッガーを参照してください。

コード 名前 メッセージ 修理する
T100 デバッガ トレースが見つかりました: 使用済み
{name}

flake8-errmsg (EM)

詳細については、PyPI の flake8-errmsg を参照してください。

コード 名前 メッセージ 修理する
EM101 例外の生文字列 例外は文字列リテラルを使用してはならず、最初に変数に割り当てます
EM102 例外の F 文字列 例外はf文字列リテラルを使用すべきではなく、最初に変数に代入します
EM103 例外のドット形式 例外は文字列を直接使用してはならず、最初に変数に割り当てます
.format()

flake8-executable (EXE)

詳細については、PyPI の flake8 実行可能ファイルを参照してください。

コード 名前 メッセージ 修理する
EXE001 シバン-実行不可 シバンは存在しますが、ファイルは実行可能ではありません
EXE002 シバン-欠落-実行可能ファイル ファイルは実行可能ですが、シバンは存在しません
EXE003 シバンパイソン シバンには「パイソン」が含まれている必要があります
EXE004 シバン-空白 シバンの前に空白を避ける 🛠
EXE005 シバン改行 シバンはファイルの先頭にある必要があります

flake8-implicit-str-concat (ISC)

詳細については、PyPI の flake8-implicit-str-concat を参照してください。

コード 名前 メッセージ 修理する
ISC001 単一行暗黙の文字列連結 暗黙的に連結された文字列リテラルを 1 行に
ISC002 複数行暗黙の文字列連結 継続行に暗黙的に連結された文字列リテラル
ISC003 明示的な文字列連結 明示的に連結された文字列は暗黙的に連結する必要があります

flake8-import-conventions (ICN)

詳細については、GitHub の flake8-import-conventions を参照してください。

コード 名前 メッセージ 修理する
ICN001 インポート・エイリアスは従来型ではない
{name}
としてインポートする必要があります
{asname}

フレーク8ロギングフォーマット(G)

詳細については、PyPI の flake8-logging-format を参照してください。

コード 名前 メッセージ 修理する
G001 ロギング文字列形式 ロギング・ステートメントの使用例
string.format()
G002 ロギングパーセント形式 ロギング・ステートメントの使用例
%
G003 ロギング文字列連結 ロギング・ステートメントの使用例
+
G004 ロギング-F-文字列 ロギングステートメントはf文字列を使用します
G010 ロギング警告 ロギング・ステートメントは、
warn
warning
🛠
G101 ロギング-エクストラアトル-クラッシュ ロギングステートメントは、LogRecordフィールドと競合する追加のフィールドを使用します。
{key}
G201 ロギング-exc-info 代わりにロギングを使用する必要があります
.exception(...)
.error(..., exc_info=True)
G202 ロギング冗長-exc-info ロギングステートメントに冗長があります
exc_info

フレーク8-いいえ-PEP420 (INP)

詳細については、PyPI の flake8-no-pep420 を参照してください。

コード 名前 メッセージ 修理する
INP001 暗黙的な名前空間パッケージ ファイルは暗黙的な名前空間パッケージの一部です。を追加します。
{filename}
__init__.py

フレーク8パイ(パイ)

詳細については、PyPI の flake8-pie を参照してください。

コード 名前 メッセージ 修理する
パイ790 不要パスなし 不要なステートメント
pass
🛠
パイ794 重複クラス・フィールド定義 クラス フィールドが複数回定義されている
{name}
🛠
パイ796 優先-一意-列挙型 列挙型に重複する値が含まれています:
{value}
パイ800 不要なスプレッドなし 不要なスプレッド
**
パイ804 不要ではない辞書kwargs 不要なクワーグ
dict
パイ807 優先リスト-組み込み 役に立たないラムダよりも優先する
list
🛠

フレーク8プリント(T20)

詳細については、PyPI の flake8-print を参照してください。

コード 名前 メッセージ 修理する
T201 印刷が見つかりました
print
設立する
🛠
T203 P-プリント-見つかりました
pprint
設立する
🛠

フレーク8-pytestスタイル(PT)

詳細については、PyPI の flake8-pytest-style を参照してください。

コード 名前 メッセージ 修理する
PT001 正しくないフィクスチャ括弧スタイル 以上で使用
@pytest.fixture{expected_parens}
@pytest.fixture{actual_parens}
🛠
PT002 フィクスチャ-位置-引数 位置引数で指定されたフィクスチャの設定、kwargsを使用
{function}
PT003 エクストラネオスコープ関数
scope='function'
に暗示される
@pytest.fixture()
PT004 フィクスチャ名アンダースコアがありません フィクスチャは何も返さず、先頭にアンダースコアを追加します
{function}
PT005 フィクスチャ名アンダースコアが正しくありません フィクスチャは値を返し、先頭のアンダースコアを削除します
{function}
PT006 パラメトライズ名が間違っているタイプ 間違った名前が入力されています。予期される
@pytest.mark.parametrize
{expected}
🛠
PT007 パラメータ値-間違ったタイプ 予期される値のタイプが間違っています
@pytest.mark.parametrize
{values}
{row}
PT008 ラムダ付きパッチ パッチを適用する代わりに使用する
return_value=
lambda
PT009 ユニットテストアサーション ユニットテストスタイルの代わりに通常のスタイルを使用する
assert
{assertion}
🛠
PT010 例外なしでレイズ 予期される例外を
pytest.raises()
PT011 レイズが広すぎる
pytest.raises({exception})
が広すぎる場合は、パラメーターを設定するか、より具体的な例外を使用してください
match
PT012 複数ステートメントによる発生
pytest.raises()
ブロックには、1 つの単純なステートメントを含める必要があります
PT013 正しくない pytest-import pytestの誤ったインポートが見つかりました、代わりにsimpleを使用してください
import pytest
PT015 アサート-常に-偽 アサーションは常に失敗し、
pytest.fail()
PT016 メッセージなしの失敗 メッセージが渡されていません
pytest.fail()
PT017 アサートインサグト 例外ブロックでアサーションが見つかりました。代わりに使用してください
{name}
pytest.raises()
PT018 コンポジットアサーション アサーションは複数の部分に分割する必要があります
PT019 フィクスチャパラメータ値なし 値のないフィクスチャはパラメータとして注入され、代わりに使用します
{name}
@pytest.mark.usefixtures
PT020 非推奨のイールドフィクスチャ
@pytest.yield_fixture
は非推奨です。使用
@pytest.fixture
PT021 フィクスチャ-ファイナライザ-コールバック 代わりに使用
yield
request.addfinalizer
PT022 役に立たない降伏フィクスチャ フィクスチャの分解なし、代わりに使用
{name}
return
yield
🛠
PT023 正しくないマーク括弧スタイル 以上で使用
@pytest.mark.{mark_name}{expected_parens}
@pytest.mark.{mark_name}{actual_parens}
🛠
PT024 不要-非同期マークオンフィクスチャ
pytest.mark.asyncio
備品には不要です
🛠
PT025 誤った使用フィクスチャオンフィクスチャ
pytest.mark.usefixtures
フィクスチャには影響しません
🛠
PT026 パラメータなしの使用フィクスチャ パラメータなしでは役に立たない
pytest.mark.usefixtures
🛠

フレーク8引用符 (Q)

詳細については、PyPIのflake8引用符を参照してください。

コード 名前 メッセージ 修理する
Q000 不正な引用符インライン文字列 二重引用符が見つかりましたが、一重引用符が推奨されます 🛠
Q001 不正な引用符-複数行-文字列 二重引用符の複数行が見つかりましたが、一重引用符が望ましい 🛠
Q002 不正な引用符-ドキュメント文字列 二重引用符のドキュメント文字列が見つかりましたが、一重引用符が推奨されます 🛠
Q003 回避-引用-エスケープ 外側の引用符を変更して、内側の引用符をエスケープしないようにする 🛠

フレーク8リターン (RET)

詳細については、PyPI の flake8-return を参照してください。

コード 名前 メッセージ 修理する
RET501 不要-リターン-なし 関数内で、それが唯一の可能な戻り値である場合は明示的に使用しないでください
return None
🛠
RET502 暗黙的な戻り値 暗黙的に非値を返すことができる関数で
return None
None
🛠
RET503 暗黙の戻り値 関数の最後に明示的に欠落しており、非値を返すことができます
return
None
🛠
RET504 不要-割り当て ステートメントの前に不要な変数代入
return
RET505 余分なリターン 不要な後文
{branch}
return
RET506 余分な他のレイズ 不要な後文
{branch}
raise
RET507 余計な - そうでなければ 不要な後文
{branch}
continue
RET508 余分な休憩 不要な後文
{branch}
break

フレーク8-単純化 (SIM)

詳細については、PyPI の flake8-simplify を参照してください。

コード 名前 メッセージ 修理する
SIM101 重複はインスタンス呼び出しです の複数の呼び出しが 1 つの呼び出しにマージされる
isinstance
{name}
🛠
SIM102 ネストされた if ステートメント ネストされたステートメントの代わりに単一のステートメントを使用する
if
if
🛠
SIM103 戻り値-ブール条件-直接 条件を直接返す
{cond}
🛠
SIM105 use-contextlib-suppress 試行例外パスの代わりに使用する
contextlib.suppress({exception})
SIM107 リターンイントライ例外-最後に /およびで使用しないでください
return
try
except
finally
SIM108 三項演算子を使用 if-else-ブロックの代わりに三項演算子を使用する
{contents}
🛠
SIM109 タプルとの比較 多重等価比較の代わりに使用する
{replacement}
🛠
SIM110 ループを任意に変換 ループの代わりに使用
{any}
for
🛠
SIM111 ループをすべてに変換 ループの代わりに使用
{all}
for
🛠
SIM112 使用-資本-環境変数-変数 代わりに大文字の環境変数を使用する
{expected}
{original}
🛠
SIM115 コンテキストハンドラ付きオープンファイル ファイルを開くためにコンテキスト ハンドラーを使用する
SIM117 複数ステートメント ネストされたステートメントの代わりに複数のコンテキストを持つ単一のステートメントを使用する
with
with
🛠
SIM118 キーインディクト 代わりに使用
{key} in {dict}
{key} in {dict}.keys()
🛠
SIM201 否定等演算 代わりに使用
{left} != {right}
not {left} == {right}
🛠
SIM202 否定-非等価-演算 代わりに使用
{left} == {right}
not {left} != {right}
🛠
SIM208 二重否定 代わりに使用
{expr}
not (not {expr})
🛠
SIM210 if-expr-with-true-false 代わりに使用
bool({expr})
True if {expr} else False
🛠
SIM211 if-expr-with-false-true 代わりに使用
not {expr}
False if {expr} else True
🛠
SIM212 ねじれた腕を持つif-expr 代わりに使用
{expr_else} if {expr_else} else {expr_body}
{expr_body} if not {expr_else} else {expr_else}
🛠
SIM220 AとそうでないA 代わりに使用
False
{name} and not {name}
🛠
SIM221 a-or-not-a 代わりに使用
True
{name} or not {name}
🛠
SIM222 または真 代わりに使用
True
... or True
🛠
SIM223 と-偽 代わりに使用
False
... and False
🛠
SIM300 ヨーダ条件 ヨーダの条件はお勧めできません、代わりに使用してください
{suggestion}
🛠
SIM401 辞書-デフォルト付き ブロックの代わりに使用
{contents}
if
🛠

フレーク8-整頓輸入品 (TID)

詳細については、PyPI の flake8-tidy-imports を参照してください。

コード 名前 メッセージ 修理する
TID251 禁止されたAPI
{name}
禁止されています: {メッセージ}
TID252 相対輸入 親モジュールからの相対インポートは禁止されています

フレーク8タイプチェック(TCH)

詳細については、PyPI での flake8-type-check を参照してください。

コード 名前 メッセージ 修理する
TCH001 入力のみのファーストパーティインポート アプリケーションのインポートを型チェックブロックに移動する
{}
TCH002 入力のみのサードパーティ製インポート サードパーティのインポートを型チェックブロックに移動する
{}
TCH003 入力専用標準ライブラリインポート 標準ライブラリのインポートを型チェックブロックに移動する
{}
TCH004 実行時インポートインタイプチェックブロック インポートを型チェックブロックから移動します。インポートは、型ヒント以上の目的で使用されます。
{}
TCH005 空型チェックブロック 空の型チェック ブロックが見つかりました

flake8-unused-arguments (ARG)

詳細については、PyPI の flake8-unused-arguments を参照してください。

コード 名前 メッセージ 修理する
ARG001 未使用の関数引数 未使用の関数引数:
{name}
ARG002 未使用のメソッド引数 未使用のメソッド引数:
{name}
ARG003 未使用のクラスメソッド引数 未使用のクラスメソッド引数:
{name}
ARG004 未使用の静的メソッド引数 未使用の静的メソッド引数:
{name}
ARG005 未使用のラムダ引数 未使用のラムダ引数:
{name}

フレーク8-use-pathlib (PTH)

詳細については、PyPI の flake8-use-pathlib を参照してください。

コード 名前 メッセージ 修理する
PTH100 pathlib-abspath
os.path.abspath
に置き換える必要があります
.resolve()
PTH101 pathlib-chmod
os.chmod
に置き換える必要があります
.chmod()
PTH102 pathlib-mkdir
os.mkdir
に置き換える必要があります
.mkdir()
PTH103 pathlib-makedirs
os.makedirs
に置き換える必要があります
.mkdir(parents=True)
PTH104 pathlib-rename
os.rename
に置き換える必要があります
.rename()
PTH105 pathlib-replace
os.replace
に置き換える必要があります
.replace()
PTH106 pathlib-rmdir
os.rmdir
に置き換える必要があります
.rmdir()
PTH107 pathlib-remove
os.remove
に置き換える必要があります
.unlink()
PTH108 pathlib-unlink
os.unlink
に置き換える必要があります
.unlink()
PTH109 pathlib-getcwd
os.getcwd()
に置き換える必要があります
Path.cwd()
PTH110 pathlib-exists
os.path.exists
に置き換える必要があります
.exists()
PTH111 pathlib-expanduser
os.path.expanduser
に置き換える必要があります
.expanduser()
PTH112 pathlib-is-dir
os.path.isdir
に置き換える必要があります
.is_dir()
PTH113 pathlib-is-file
os.path.isfile
に置き換える必要があります
.is_file()
PTH114 pathlib-is-link
os.path.islink
に置き換える必要があります
.is_symlink()
PTH115 pathlib-readlink
os.readlink(
に置き換える必要があります
.readlink()
PTH116 pathlib-stat
os.stat
または または に置き換える必要があります。
.stat()
.owner()
.group()
PTH117 パトリブ・イズ・アブス
os.path.isabs
に置き換える必要があります
.is_absolute()
PTH118 pathlib-join
os.path.join
foo_path / "bar"に置き換える必要があります
PTH119 pathlib-basename
os.path.basename
に置き換える必要があります
.name
PTH120 pathlib-dirname
os.path.dirname
に置き換える必要があります
.parent
PTH121 pathlib-samefile
os.path.samefile
に置き換える必要があります
.samefile()
PTH122 pathlib-splitext
os.path.splitext
に置き換える必要があります
.suffix
PTH123 pathlib-open
open("foo")
に置き換える必要があります
Path("foo").open()
PTH124 pathlib-py-path
py.path
メンテナンスモードの場合、代わりに使用してください
pathlib

根絶(時代)

詳細については、「PyPI で根絶する」を参照してください。

コード 名前 メッセージ 修理する
時代001 コメントアウトされたコード コメントアウトされたコードが見つかりました 🛠

パンダ獣医(PD)

詳細については、PyPIのpandas-vetを参照してください。

コード 名前 メッセージ 修理する
PD002 インプレース引数の使用
inplace=True
避けるべきです。動作に一貫性がない
PD003 ドットの使用はヌルです
.isna
が優先されます。機能は同等です
.isnull
PD004 ドット ノット ノット ヌルの使用
.notna
が優先されます。機能は同等です
.notnull
PD007 ドット IX の使用
.ix
は非推奨です。より明示的な OR を使用する
.loc
.iloc
PD008 ドットアットの使用 の代わりに使用します。速度が重要な場合は、numpyを使用してください。
.loc
.at
PD009 ドットIATの使用 の代わりに使用します。速度が重要な場合は、numpyを使用してください。
.iloc
.iat
PD010 ドットピボットまたはアンスタックの使用
.pivot_table
は または よりも優先されます。同じ機能を提供します
.pivot
.unstack
PD011 ドット値の使用 代わりに使用
.to_numpy()
.values
PD012 ドット読み取りテーブルの使用
.read_csv
が優先されます。同じ機能を提供します
.read_table
PD013 ドットスタックの使用
.melt
が優先されます。同じ機能を提供します
.stack
PD015 PDマージの使用 関数の代わりにメソッドを使用します。それらは同等の機能を備えています。
.merge
pd.merge
PD901 df-is a bad-variable-name
df
は不正な変数名です。未来の自分にもっと優しくしてください。

ピグレップフック(PGH)

詳細については、GitHub の pygrep-hooks を参照してください。

コード 名前 メッセージ 修理する
PGH001 評価なし 組み込みは許可されていません
eval()
PGH002 非推奨のログ警告
warn
は非推奨であり、
warning
PGH003 ブランケットタイプ無視 型の問題を無視するときに特定のルール コードを使用する
PGH004 ブランケット-ノカ 使用時に特定のルールコードを使用する
noqa

パイリント(PL)

詳細については、PyPI の Pylint を参照してください。

コンベンション (PLC)

コード 名前 メッセージ 修理する
PLC0414 役に立たないインポートエイリアス エイリアスのインポートで元のパッケージの名前を変更しない 🛠
PLC3002 不要な直接ラムダ呼び出し 直接呼び出されるラムダ式。代わりに、式をインラインで実行してください。

エラー (PLE)

コード 名前 メッセージ 修理する
PLE0117 非ローカル-バインドなし バインドなしで見つかった非ローカル名
{name}
PLE0118 使用済み事前グローバル宣言 名前は、行 {line} のグローバル宣言の前に使用されます
{name}
PLE0604 無効なすべてのオブジェクト の無効なオブジェクトには、文字列のみが含まれている必要があります
__all__
PLE0605 すべて無効な形式 の形式が無効です は、 または
__all__
tuple
list
PLE1142 待機-外部非同期
await
非同期関数内で使用する必要があります

リファクタリング (PLR)

コード 名前 メッセージ 修理する
PLR0133 定数比較 比較で比較された2つの定数は、置き換えを検討してください
{left_constant} {op} {right_constant}
PLR0206 パラメーター付きプロパティ プロパティのパラメーターを定義できません
PLR0402 インポートからの使用を検討する エイリアスの代わりに使用
from {module} import {name}
PLR1701 考慮-マージ-isインスタンス これらの isinstance 呼び出しをマージします。
isinstance({obj}, ({types}))
PLR1722 使用-システム-出口 代わりに使用
sys.exit()
{name}
🛠
PLR2004 マジックバリュー比較 比較に使用されるマジック値、{value}を定数変数に置き換えることを検討してください

警告 (PLW)

コード 名前 メッセージ 修理する
PLW0120 役に立たないループ breakステートメントなしでループのElse句を削除し、その中のすべてのコードをインデント解除します
PLW0602 グローバル変数未割り当て グローバル for を使用しますが、割り当ては行われません
{name}

トリケラトプス(TRY)

詳細については、PyPIのトリケラトプスを参照してください。

コード 名前 メッセージ 修理する
トライ002 レイズバニラ級 独自の例外を作成する
トライ003 レイズ-バニラ-引数 例外クラスの外部に長いメッセージを指定しないようにする
トライ004 優先型エラー 無効な型の例外を優先する
TypeError
🛠
トライ200 原因のない救済 例外の原因を指定するために使用します
raise from
トライ201 詳細レイズ 例外名を指定せずに使用する
raise
トライ300 試してみてください-考慮-その他 このステートメントをブロックに移動することを検討してください
else
トライ301 ライズ・ウィズイン・トライ 内部関数への抽象化
raise
トライ400 例外ではなくエラー 代わりに使用
logging.exception
logging.error

ラフ固有のルール (RUF)

コード 名前 メッセージ 修理する
RUF001 あいまいなユニコード文字列 文字列にあいまいなユニコード文字 '{confusable}' が含まれています ('{representant}' という意味ですか? 🛠
RUF002 あいまいなユニコード文字ドキュメント文字列 ドキュメント文字列にはあいまいなユニコード文字 '{紛らわしい}' が含まれています ('{表現者}' という意味ですか? 🛠
RUF003 あいまいなユニコード文字コメント コメントにあいまいなユニコード文字 '{紛らわしい}' が含まれています ('{代表}' という意味ですか? 🛠
RUF004 キーワード引数-星-引数の前に キーワード引数は、スター付き引数の後に指定する必要があります
{name}
RUF005 連結の代わりにコレクションリテラルをアンパックする 連結の代わりに検討する
{expr}
RUF100 未使用-NOQA 未使用のブランケットディレクティブ
noqa
🛠

エディターの統合

VSコード(公式)

ラフVSコード拡張機能をダウンロードし、 自動修正アクション、インポートソートなどをサポートします。

言語サーバープロトコル(公式)

Ruffは、PyPIで利用可能なruff-lsp Pythonパッケージを介して言語サーバープロトコルをサポートしています。

ruff-lspを使用すると、次のような任意のエディターでRuffを使用できます。 は、NeovimSublime Text、Emacsなどの言語サーバープロトコルをサポートしています。

たとえば、Neovim で使用するには、nvim-lspconfig と共に PyPI からインストールします。次に、次のようなものを追加します あなたに :

ruff-lsp
ruff-lsp
init.lua

-- See: https://github.com/neovim/nvim-lspconfig/tree/54eb2a070a4f389b1be0f98070f81d23e2b1a715#suggested-configuration
local opts = { noremap=true, silent=true }
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float, opts)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist, opts)

-- Use an on_attach function to only map the following keys
-- after the language server attaches to the current buffer
local on_attach = function(client, bufnr)
  -- Enable completion triggered by <c-x><c-o>
  vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc')

  -- Mappings.
  -- See `:help vim.lsp.*` for documentation on any of the below functions
  local bufopts = { noremap=true, silent=true, buffer=bufnr }
  vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts)
  vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts)
  vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts)
  vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts)
  vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, bufopts)
  vim.keymap.set('n', '<space>wa', vim.lsp.buf.add_workspace_folder, bufopts)
  vim.keymap.set('n', '<space>wr', vim.lsp.buf.remove_workspace_folder, bufopts)
  vim.keymap.set('n', '<space>wl', function()
    print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
  end, bufopts)
  vim.keymap.set('n', '<space>D', vim.lsp.buf.type_definition, bufopts)
  vim.keymap.set('n', '<space>rn', vim.lsp.buf.rename, bufopts)
  vim.keymap.set('n', '<space>ca', vim.lsp.buf.code_action, bufopts)
  vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts)
  vim.keymap.set('n', '<space>f', function() vim.lsp.buf.format { async = true } end, bufopts)
end

-- Configure `ruff-lsp`.
local configs = require 'lspconfig.configs'
if not configs.ruff_lsp then
  configs.ruff_lsp = {
    default_config = {
      cmd = { 'ruff-lsp' },
      filetypes = { 'python' },
      root_dir = require('lspconfig').util.find_git_ancestor,
      init_options = {
        settings = {
          args = {}
        }
      }
    }
  }
end
require('lspconfig').ruff_lsp.setup {
  on_attach = on_attach,
}

インストールが成功すると、Ruffの診断がエディターに直接表示されます。

Neovim で利用可能なコードアクション

Sublime Text や Helix などの他のエディタで使用するには、ruff-lsp のドキュメントを参照してください。

ruff-lsp

言語サーバープロトコル(非公式)

Ruffは、python-lsp-server用のpython-lsp-ruffプラグインとしても利用可能です。 PyPIからインストール可能:

pip install python-lsp-server python-lsp-ruff

LSP サーバは、言語サーバ プロトコルをサポートする任意のエディタで使用できます。

たとえば、Neovimで使用するには、次のようなものを追加します。

python-lsp-ruff
init.lua

require'lspconfig'.pylsp.setup {
  settings = {
    pylsp = {
      plugins = {
        ruff = {
          enabled = true
        },
        pycodestyle = {
          enabled = false
        },
        pyflakes = {
          enabled = false
        },
        mccabe = {
          enabled = false
        }
      }
    }
  },
}

Vim & Neovim

ruffは、vimやNeovimを含む、ruff-lsp(言語サーバープロトコルを参照)を介して言語サーバープロトコルをサポートする任意のエディターに統合できます。

ruff-lspを使用することをお勧めします。 ラフのLSPサーバーを公式にサポートしています。

ただし、Ruffは の coc-pyright 拡張の一部としても利用できます。

coc.nvim

(ネオ)ヴィム用のALEプラグインを使用します。
let g:ale_linters = { "python": ["ruff"] }
let g:ale_fixers = {
\       "python": ["black", "ruff"],
\}
ラフは、efmを介してわずか数行で統合することもできます。
tools:
  python-ruff: &python-ruff
    lint-command: 'ruff --config ~/myconfigs/linters/ruff.toml --quiet ${INPUT}'
    lint-stdin: true
    lint-formats:
      - '%f:%l:%c: %m'
    format-command: 'ruff --stdin-filename ${INPUT} --config ~/myconfigs/linters/ruff.toml --fix --exit-zero --quiet -'
    format-stdin: true
null-lsを使用しているneovimユーザーの場合、Ruffはすでに統合されています
local null_ls = require("null-ls")
local methods = require("null-ls.methods")
local helpers = require("null-ls.helpers")

local function ruff_fix()
    return helpers.make_builtin({
        name = "ruff",
        meta = {
            url = "https://github.com/charliermarsh/ruff/",
            description = "An extremely fast Python linter, written in Rust.",
        },
        method = methods.internal.FORMATTING,
        filetypes = { "python" },
        generator_opts = {
            command = "ruff",
            args = { "--fix", "-e", "-n", "--stdin-filename", "$FILENAME", "-" },
            to_stdin = true
        },
        factory = helpers.formatter_factory
    })
end

null_ls.setup({
    sources = {
        ruff_fix(),
        null_ls.builtins.diagnostics.ruff,
    }
})

パイチャーム(外部ツール)

ラフはPyCharmの外部ツールとしてインストールできます。環境設定ペインを開き、[ツール]、[外部ツール]の順に移動します。そこから 次の構成で新しいツールを追加します。

Ruff を外部ツールとしてインストールする

Ruffは実行可能なアクションとして表示されます。

実行可能なアクションとしてのラフ

パイチャーム(非公式)

ラフは、ラフプラグインとしても利用できます。 IntelliJマーケットプレイス(@koxudaxiによって管理されています)。

GitHub Actions

GitHub Actions には、Ruffをすぐに実行するために必要なものがすべて揃っています。

name: CI
on: push
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Install Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.11"
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install ruff
      # Include `--format=github` to enable automatic inline annotations.
      - name: Run Ruff
        run: ruff --format=github .

FAQ

ラフはブラックと互換性がありますか?

はい。ラフは、箱から出してすぐに使えるブラックと互換性があります。 設定は2つの間で一貫しています。

line-length

プロジェクトとして、ラフはブラックと一緒に使用するように設計されているため、実装を延期します 自動書式設定によって削除されるスタイルの lint ルール。

ラフはFlake8とどのように比較されますか?

(フレーク8から来る?フレーク8からラフを試してみてください 既存の構成を自動的に変換します。

ラフは、Flake8を使用しない場合、または少数で使用すると、Flake1のドロップイン代替品として使用できます(2) プラグイン、(3)ブラックと一緒に、(3)Python <>コードで。

これらの条件下で、ラフはFlake8のすべてのルールを実装します。実際には、それはラフを意味します すべてのルール(Pyflakesに由来する)と、andルール(pycodestyleに由来する)のサブセットを実装します。

F
E
W

Ruffはまた、最も人気のあるFlake8プラグインと関連するコード品質ツールのいくつかを再実装します ネイティブに、以下を含みます:

場合によっては、Ruffは、 Flake8プラグインを発信します。たとえば、Ruff は からルールを表すために使用します。これにより、プラグイン間の競合を最小限に抑え、個々のプラグインが可能になります (避けるために)とは対照的に、単一の(例えば)でオンまたはオフを切り替える のような規則と矛盾する)。

TID252
I252
flake8-tidy-imports
--select TID
--select I2
isort
I001

ルールセットを超えて、ラフはFlake8に対して次の制限に苦しんでいます。

  1. Ruffはまだ構造パターンマッチングをサポートしていません。
  2. Flake8にはプラグインアーキテクチャがあり、カスタムリントルールの記述をサポートしています。(代わりに、人気のあるFlake8 プラグインは、Ruff自体の一部としてRustに再実装されます。

Ruffと元のFlake8プラグインの間には、他にもいくつかの小さな非互換性があります。

  • ラフはからのすべての「意見のある」リントルールを実装しているわけではありません。
    flake8-bugbear
  • プロジェクトの構造に応じて、ラフとファーストパーティの検出が異なる場合があります コード。(これは多くの場合、プロパティを変更することで解決されます。 コードはディレクトリに入れ子になっています。
    isort
    src
    src = ["src"]
    src

ラフはパイリントとどのように比較されますか?

執筆時点では、Pylintは合計409のルールを実装していますが、Ruffは224のルールを実装しています。 少なくとも 60 個が Pylint ルールセットと重複しています。主観的には、Pylintはより多くのルールを実装する傾向があります 型の推論に基づく(たとえば、関数呼び出しの引数の数を検証する)。

Flake8と同様に、Pylintはプラグイン(「チェッカー」と呼ばれる)をサポートし、Ruffはすべてのルールをネイティブに実装します。

パイリントとは異なり、ラフは独自のリント違反を自動的に修正することができます。

Pylintパリティは#970で追跡されています。

ラフはミピー、パイライト、パイアと比べてどうですか?

ラフはリンターであり、タイプチェッカーではありません。タイプチェッカーと同じ問題のいくつかを検出できます できますが、型チェッカーはRuffが見逃す特定のエラーをキャッチします。逆もまた真です。 Ruffは、型チェッカーが通常無視する特定のエラーをキャッチします。

たとえば、タイプチェッカーとは異なり、Ruffはインポートが使用されていない場合は、 ソースコード内のそのインポートへの参照。一方、型チェッカーは、 文字列を期待する関数に整数引数を渡しましたが、Ruffはこれを見逃します。ザ ツールは補完的です。

Ruffは、Mypy、Pyright、Pyreなどのタイプチェッカーと組み合わせて使用 することをお勧めします。 Ruffはlint違反に関するより迅速なフィードバックを提供し、タイプチェッカーはより詳細なものを提供します 型エラーに関するフィードバック。

ラフはどのツールを交換しますか?

現在、Ruffは、次のプラグインのいずれかで使用すると、Flake8を置き換えるために使用できます。

ラフは、isortyesqa根絶pygrepフック(#980)、およびルールのサブセットを置き換えることもできます pyアップグレード (#827) で実装されています。

Ruffの使用を検討しているが、サポートされていないFlake8プラグインに依存している場合は、お気軽に問題を報告してください。

Ruffを使用するにはRustをインストールする必要がありますか?

いいえ!ラフはPyPIのラフとして利用できます:

pip install ruff

Ruffには、すべての主要なプラットフォーム用のホイールが付属しているため、依存せずにRuffを取り付けることができます。 まったく錆びています。

pip

Ruff用に独自のプラグインを作成できますか?

Ruffはまだサードパーティのプラグインをサポートしていませんが、プラグインシステムは プロジェクト。詳細については、#283を参照してください。

Ruffの輸入ソートはisortと比べてどうですか?

ラフの輸入選別は、使用時とほぼ同等であることを意図しています。 Ruffとisortが同様のインポート間の関係を壊す方法には、いくつかの既知の小さな違いがあります。 場合によっては、Ruffとisortがインラインコメントをどのように扱うかを示します(#1381#2104を参照)。

isort
profile = "black"

同様に、ラフの輸入ソートはブラックと互換性があります。

isort

Ruffはまだすべての構成オプションをサポートしているわけではありませんが、 それら。サポートされている設定については、API リファレンスを参照してください。たとえば、次のように設定できます。

isort
known-first-party

[tool.ruff]
select = [
    # Pyflakes
    "F",
    # Pycodestyle
    "E",
    "W",
    # isort
    "I001"
]
src = ["src", "tests"]

[tool.ruff.isort]
known-first-party = ["my_module1", "my_module2"]

RuffはJupyterノートブックをサポートしていますか?

ラフは、リンターを実行するためのツールであるnbQAに統合されています。 Jupyter ノートブック上のコードフォーマッタ。

とをインストールした後、次のようにノートブック上でRuffを実行できます。

ruff
nbqa

> 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.

RuffはNumPyまたはGoogleスタイルのドキュメント文字列をサポートしていますか?

はい!特定のドキュメント文字列規則を有効にするには、 に以下を追加します。

pyproject.toml

[tool.ruff.pydocstyle]
convention = "google"  # Accepts: "google", "numpy", or "pep257".

たとえば、 から来ていて、元の構成が を使用している場合、代わりに 、 上記のように。

flake8-docstrings
--docstring-convention=numpy
convention = "numpy"
pyproject.toml

と並んで、次のようにルールコードプレフィックスを明示的に有効にする必要があります。

convention
D

[tool.ruff]
select = [
    "D",
]

[tool.ruff.pydocstyle]
convention = "google"

force を設定すると、その規則と互換性のないルールが無効になります。 それらがどのように提供されるかに関係なく、偶発的な非互換性を回避し、構成を簡素化します。

convention

Ruffがコードをチェックするために使用している設定を確認するにはどうすればよいですか?

実行して、特定のファイルの解決された設定を表示します。

ruff /path/to/code.py --show-settings

ラフを使いたいのですが、使いたくありません。それは可能ですか?
pyproject.toml

はい!ファイルの代わりに、構成にファイルを使用できます。二人 ファイルは機能的に同等であり、ファイルがセクションヘッダーを省略できる点を除いて、同一のスキーマを持ちます。

pyproject.toml
ruff.toml
ruff.toml
[tool.ruff]

たとえば、これが与えられた:

pyproject.toml

[tool.ruff]
line-length = 88

[tool.ruff.pydocstyle]
convention = "google"

代わりに、次のようなファイルを使用できます。

ruff.toml

line-length = 88

[pydocstyle]
convention = "google"

ラフは現在、やのようなINIファイルをサポートしていません。

setup.cfg
tox.ini

Ruffのデフォルト設定を変更するにはどうすればよいですか?

構成ファイルが見つからない場合、Ruffは最後の手段としてユーザー固有のファイルまたはファイルを探します。この動作は Flake8 の .

pyproject.toml
ruff.toml
~/.config/flake8

macOS では、ラフはそのファイルが にあることを期待しています。

/Users/Alice/Library/Application Support/ruff/ruff.toml

Linux では、ラフはそのファイルが にあることを期待しています。

/home/alice/.config/ruff/ruff.toml

Windows では、ラフはそのファイルが にあることを想定しています。

C:\Users\Alice\AppData\Roaming\ruff\ruff.toml

詳細については、ディレクトリクレートを参照してください。

Ruffは何かを修正しようとしましたが、コードが壊れました。どうしたらいいでしょう。

Ruffのオートフィックスはベストエフォート型メカニズムです。Pythonの動的な性質を考えると、 コードに変更を加えるときは、一見些細な修正であっても、完全な確実性を持っています。

将来的には、Ruffはパッチの安全性に基づいて自動修正動作を有効にすることをサポートする予定です。

それまでの間、Autofixが積極的すぎる場合は、ルールごとに無効にするか、 修正不可能なメカニックを使用したカテゴリごと。たとえば、自動修正を無効にするには 安全でない可能性のあるルールについては、次のように追加できます。

pyproject.toml

[tool.ruff]
unfixable = ["B", "SIM", "TRY", "RUF"]

Ruffのautofixがコードを壊すケースを見つけた場合は、問題を報告してください!

貢献

貢献は歓迎され、大歓迎です。開始するには、投稿ガイドラインを確認してください。

リリース

ラフはPyPIで配布され、マチュリンを介して公開されています。

見る:。

.github/workflows/release.yaml

ベンチマーク

まず、CPythonのクローンを作成します。これは大規模で多様なPythonコードベースです。 これは、ベンチマークに適したターゲットになります。

git clone --branch 3.10 https://github.com/python/cpython.git resources/test/cpython

リリースビルドをベンチマークするには:

cargo build --release && hyperfine --ignore-failure --warmup 10 \
  "./target/release/ruff ./resources/test/cpython/ --no-cache" \
  "./target/release/ruff ./resources/test/cpython/"

Benchmark 1: ./target/release/ruff ./resources/test/cpython/ --no-cache
  Time (mean ± σ):     293.8 ms ±   3.2 ms    [User: 2384.6 ms, System: 90.3 ms]
  Range (min … max):   289.9 ms … 301.6 ms    10 runs

  Warning: Ignoring non-zero exit code.

Benchmark 2: ./target/release/ruff ./resources/test/cpython/
  Time (mean ± σ):      48.0 ms ±   3.1 ms    [User: 65.2 ms, System: 124.7 ms]
  Range (min … max):    45.0 ms …  66.7 ms    62 runs

  Warning: Ignoring non-zero exit code.

Summary
  './target/release/ruff ./resources/test/cpython/' ran
    6.12 ± 0.41 times faster than './target/release/ruff ./resources/test/cpython/ --no-cache'

エコシステムの既存のツールに対してベンチマークを行うには:

hyperfine --ignore-failure --warmup 5 \
  "./target/release/ruff ./resources/test/cpython/ --no-cache" \
  "pyflakes resources/test/cpython" \
  "autoflake --recursive --expand-star-imports --remove-all-unused-imports --remove-unused-variables --remove-duplicate-keys resources/test/cpython" \
  "pycodestyle resources/test/cpython" \
  "flake8 resources/test/cpython"

Benchmark 1: ./target/release/ruff ./resources/test/cpython/ --no-cache
  Time (mean ± σ):     294.3 ms ±   3.3 ms    [User: 2467.5 ms, System: 89.6 ms]
  Range (min … max):   291.1 ms … 302.8 ms    10 runs

  Warning: Ignoring non-zero exit code.

Benchmark 2: pyflakes resources/test/cpython
  Time (mean ± σ):     15.786 s ±  0.143 s    [User: 15.560 s, System: 0.214 s]
  Range (min … max):   15.640 s … 16.157 s    10 runs

  Warning: Ignoring non-zero exit code.

Benchmark 3: autoflake --recursive --expand-star-imports --remove-all-unused-imports --remove-unused-variables --remove-duplicate-keys resources/test/cpython
  Time (mean ± σ):      6.175 s ±  0.169 s    [User: 54.102 s, System: 1.057 s]
  Range (min … max):    5.950 s …  6.391 s    10 runs

Benchmark 4: pycodestyle resources/test/cpython
  Time (mean ± σ):     46.921 s ±  0.508 s    [User: 46.699 s, System: 0.202 s]
  Range (min … max):   46.171 s … 47.863 s    10 runs

  Warning: Ignoring non-zero exit code.

Benchmark 5: flake8 resources/test/cpython
  Time (mean ± σ):     12.260 s ±  0.321 s    [User: 102.934 s, System: 1.230 s]
  Range (min … max):   11.848 s … 12.933 s    10 runs

  Warning: Ignoring non-zero exit code.

Summary
  './target/release/ruff ./resources/test/cpython/ --no-cache' ran
   20.98 ± 0.62 times faster than 'autoflake --recursive --expand-star-imports --remove-all-unused-imports --remove-unused-variables --remove-duplicate-keys resources/test/cpython'
   41.66 ± 1.18 times faster than 'flake8 resources/test/cpython'
   53.64 ± 0.77 times faster than 'pyflakes resources/test/cpython'
  159.43 ± 2.48 times faster than 'pycodestyle resources/test/cpython'

上記から作業環境を作成するように実行することができます。すべての 報告されたベンチマークは、Python 3.11で指定されたバージョンを使用して計算されました。

poetry install
./scripts
./scripts/pyproject.toml

Pylint のベンチマークを行うには、CPython リポジトリから以下のファイルを削除します。

rm Lib/test/bad_coding.py \
  Lib/test/bad_coding2.py \
  Lib/test/bad_getattr.py \
  Lib/test/bad_getattr2.py \
  Lib/test/bad_getattr3.py \
  Lib/test/badcert.pem \
  Lib/test/badkey.pem \
  Lib/test/badsyntax_3131.py \
  Lib/test/badsyntax_future10.py \
  Lib/test/badsyntax_future3.py \
  Lib/test/badsyntax_future4.py \
  Lib/test/badsyntax_future5.py \
  Lib/test/badsyntax_future6.py \
  Lib/test/badsyntax_future7.py \
  Lib/test/badsyntax_future8.py \
  Lib/test/badsyntax_future9.py \
  Lib/test/badsyntax_pep3120.py \
  Lib/test/test_asyncio/test_runners.py \
  Lib/test/test_copy.py \
  Lib/test/test_inspect.py \
  Lib/test/test_typing.py

次に、から、次のコマンドを実行します。これ Pylintを最大の並列処理で実行し、エラーのみを報告します。

resources/test/cpython
time pylint -j 0 -E $(git ls-files '*.py')

Pyupgrade のベンチマークを行うには、以下を次から実行します。

resources/test/cpython

hyperfine --ignore-failure --warmup 5 --prepare "git reset --hard HEAD" \
  "find . -type f -name \"*.py\" | xargs -P 0 pyupgrade --py311-plus"

Benchmark 1: find . -type f -name "*.py" | xargs -P 0 pyupgrade --py311-plus
  Time (mean ± σ):     30.119 s ±  0.195 s    [User: 28.638 s, System: 0.390 s]
  Range (min … max):   29.813 s … 30.356 s    10 runs

参考

トップレベル

allowed-confusables

次の場合に無視できる「紛らわしい」Unicode文字のリスト 、、および を強制します。

RUF001
RUF002
RUF003

デフォルト値:

[]

タイプ:

Vec<char>

使用例:

[tool.ruff]
# Allow minus-sign (U+2212), greek-small-letter-rho (U+03C1), and the asterisk-operator (U+2217),
# which could be confused for "-", "p", and "*", respectively.
allowed-confusables = ["", "ρ", ""]

builtins

定義された参照として扱う組み込みのリストに加えて、 システムビルトイン。

デフォルト値:

[]

タイプ:

Vec<String>

使用例:

[tool.ruff]
builtins = ["_"]

cache-dir

A path to the cache directory.

By default, Ruff stores cache results in a directory in the current project root.

.ruff_cache

However, Ruff will also respect the environment variable, which takes precedence over that default.

RUFF_CACHE_DIR

This setting will override even the environment variable, if set.

RUFF_CACHE_DIR

Default value:

.ruff_cache

Type:

PathBuf

Example usage:

[tool.ruff]
cache-dir = "~/.cache/ruff"

dummy-variable-rgx

A regular expression used to identify "dummy" variables, or those which should be ignored when enforcing (e.g.) unused-variable rules. The default expression matches , , and , but not .

_
__
_var
_var_

Default value:

"^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$"

Type:

Regex

Example usage:

[tool.ruff]
# Only ignore variables named "_".
dummy-variable-rgx = "^_$"

exclude

A list of file patterns to exclude from linting.

Exclusions are based on globs, and can be either:

  • Single-path patterns, like (to exclude any directory named in the tree), (to exclude any file named ), or (to exclude any file matching ).
    .mypy_cache
    .mypy_cache
    foo.py
    foo.py
    foo_*.py
    foo_*.py
  • Relative patterns, like (to exclude that specific file) or (to exclude any Python files in ). Note that these paths are relative to the project root (e.g., the directory containing your ).
    directory/foo.py
    directory/*.py
    directory
    pyproject.toml

For more information on the glob syntax, refer to the

globset
documentation.

Note that you'll typically want to use

extend-exclude
to modify the excluded paths.

Default value:

[".bzr", ".direnv", ".eggs", ".git", ".hg", ".mypy_cache", ".nox", ".pants.d", ".ruff_cache", ".svn", ".tox", ".venv", "__pypackages__", "_build", "buck-out", "build", "dist", "node_modules", "venv"]

Type:

Vec<FilePattern>

Example usage:

[tool.ruff]
exclude = [".venv"]

extend

A path to a local file to merge into this configuration. User home directory and environment variables will be expanded.

pyproject.toml

To resolve the current file, Ruff will first resolve this base configuration file, then merge in any properties defined in the current configuration file.

pyproject.toml

Default value:

None

Type:

Path

Example usage:

[tool.ruff]
# Extend the `pyproject.toml` file in the parent directory.
extend = "../pyproject.toml"
# But use a different line length.
line-length = 100

extend-exclude

A list of file patterns to omit from linting, in addition to those specified by .

exclude

Exclusions are based on globs, and can be either:

  • Single-path patterns, like (to exclude any directory named in the tree), (to exclude any file named ), or (to exclude any file matching ).
    .mypy_cache
    .mypy_cache
    foo.py
    foo.py
    foo_*.py
    foo_*.py
  • Relative patterns, like (to exclude that specific file) or (to exclude any Python files in ). Note that these paths are relative to the project root (e.g., the directory containing your ).
    directory/foo.py
    directory/*.py
    directory
    pyproject.toml

For more information on the glob syntax, refer to the

globset
documentation.

Default value:

[]

Type:

Vec<FilePattern>

Example usage:

[tool.ruff]
# In addition to the standard set of exclusions, omit all tests, plus a specific file.
extend-exclude = ["tests", "src/bad.py"]

extend-ignore

A list of rule codes or prefixes to ignore, in addition to those specified by .

ignore

Note that is applied after resolving rules from / and a less specific rule in would overwrite a more specific rule in . It is recommended to only use when extending a file via .

extend-ignore
ignore
select
extend-ignore
select
extend-ignore
pyproject.toml
extend

Default value:

[]

Type:

Vec<RuleSelector>

Example usage:

[tool.ruff]
# Skip unused variable rules (`F841`).
extend-ignore = ["F841"]

extend-select

A list of rule codes or prefixes to enable, in addition to those specified by .

select

Note that is applied after resolving rules from / and a less specific rule in would overwrite a more specific rule in . It is recommended to only use when extending a file via .

extend-select
ignore
select
extend-select
ignore
extend-select
pyproject.toml
extend

Default value:

[]

Type:

Vec<RuleSelector>

Example usage:

[tool.ruff]
# On top of the default `select` (`E`, `F`), enable flake8-bugbear (`B`) and flake8-quotes (`Q`).
extend-select = ["B", "Q"]

external

A list of rule codes that are unsupported by Ruff, but should be preserved when (e.g.) validating directives. Useful for retaining directives that cover plugins not yet implemented by Ruff.

# noqa
# noqa

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff]
# Avoiding flagging (and removing) `V101` from any `# noqa`
# directives, despite Ruff's lack of support for `vulture`.
external = ["V101"]

fix

Enable autofix behavior by-default when running (overridden by the and command-line flags).

ruff
--fix
--no-fix

Default value:

false

Type:

bool

Example usage:

[tool.ruff]
fix = true

fix-only

Like , but disables reporting on leftover violation. Implies .

fix
fix

Default value:

false

Type:

bool

Example usage:

[tool.ruff]
fix-only = true

fixable

A list of rule codes or prefixes to consider autofixable. By default, all rules are considered autofixable.

Default value:

["A", "ANN", "ARG", "B", "BLE", "C", "COM", "D", "DTZ", "E", "EM", "ERA", "EXE", "F", "FBT", "G", "I", "ICN", "INP", "ISC", "N", "PD", "PGH", "PIE", "PL", "PT", "PTH", "Q", "RET", "RUF", "S", "SIM", "T", "TCH", "TID", "TRY", "UP", "W", "YTT"]

Type:

Vec<RuleSelector>

Example usage:

[tool.ruff]
# Only allow autofix behavior for `E` and `F` rules.
fixable = ["E", "F"]

force-exclude

Whether to enforce and patterns, even for paths that are passed to Ruff explicitly. Typically, Ruff will lint any paths passed in directly, even if they would typically be excluded. Setting will cause Ruff to respect these exclusions unequivocally.

exclude
extend-exclude
force-exclude = true

This is useful for

pre-commit
, which explicitly passes all changed files to the
ruff-pre-commit
plugin, regardless of whether they're marked as excluded by Ruff's own settings.

Default value:

false

Type:

bool

Example usage:

[tool.ruff]
force-exclude = true

format

The style in which violation messages should be formatted: (default), (group messages by file), (machine-readable), (machine-readable XML), (GitHub Actions annotations), (GitLab CI code quality report), or (Pylint text format).

"text"
"grouped"
"json"
"junit"
"github"
"gitlab"
"pylint"

Default value:

"text"

Type:

SerializationType

Example usage:

[tool.ruff]
# Group violations by containing file.
format = "grouped"

ignore

A list of rule codes or prefixes to ignore. Prefixes can specify exact rules (like ), entire categories (like ), or anything in between.

F841
F

When breaking ties between enabled and disabled rules (via and , respectively), more specific prefixes override less specific prefixes.

select
ignore

Default value:

[]

Type:

Vec<RuleSelector>

Example usage:

[tool.ruff]
# Skip unused variable rules (`F841`).
ignore = ["F841"]

ignore-init-module-imports

Avoid automatically removing unused imports in files. Such imports will still be flagged, but with a dedicated message suggesting that the import is either added to the module's symbol, or re-exported with a redundant alias (e.g., ).

__init__.py
__all__
import os as os

Default value:

false

Type:

bool

Example usage:

[tool.ruff]
ignore-init-module-imports = true

line-length

The line length to use when enforcing long-lines violations (like ).

E501

Default value:

88

Type:

usize

Example usage:

[tool.ruff]
# Allow lines to be as long as 120 characters.
line-length = 120

namespace-packages

Mark the specified directories as namespace packages. For the purpose of module resolution, Ruff will treat those directories as if they contained an file.

__init__.py

Default value:

[]

Type:

Vec<PathBuf>

Example usage:

[tool.ruff]
namespace-packages = ["airflow/providers"]

per-file-ignores

A list of mappings from file pattern to rule codes or prefixes to exclude, when considering any matching files.

Default value:

{}

Type:

HashMap<String, Vec<RuleSelector>>

Example usage:

[tool.ruff]
# Ignore `E402` (import violations) in all `__init__.py` files, and in `path/to/file.py`.
[tool.ruff.per-file-ignores]
"__init__.py" = ["E402"]
"path/to/file.py" = ["E402"]

required-version

Require a specific version of Ruff to be running (useful for unifying results across many environments, e.g., with a file).

pyproject.toml

Default value:

None

Type:

String

Example usage:

[tool.ruff]
required-version = "0.0.193"

respect-gitignore

Whether to automatically exclude files that are ignored by , , , and global files. Enabled by default.

.ignore
.gitignore
.git/info/exclude
gitignore

Default value:

true

Type:

bool

Example usage:

[tool.ruff]
respect-gitignore = false

select

A list of rule codes or prefixes to enable. Prefixes can specify exact rules (like ), entire categories (like ), or anything in between.

F841
F

When breaking ties between enabled and disabled rules (via and , respectively), more specific prefixes override less specific prefixes.

select
ignore

Default value:

["E", "F"]

Type:

Vec<RuleSelector>

Example usage:

[tool.ruff]
# On top of the defaults (`E`, `F`), enable flake8-bugbear (`B`) and flake8-quotes (`Q`).
select = ["E", "F", "B", "Q"]

show-source

Whether to show source code snippets when reporting lint violations (overridden by the command-line flag).

--show-source

Default value:

false

Type:

bool

Example usage:

[tool.ruff]
# By default, always show source code snippets.
show-source = true

src

The source code paths to consider, e.g., when resolving first- vs. third-party imports.

As an example: given a Python package structure like:

my_package/
  pyproject.toml
  src/
    my_package/
      __init__.py
      foo.py
      bar.py

The

src
directory should be included in the
src
option (e.g.,
src = ["src"]
), such that when resolving imports,
my_package.foo
is considered a first-party import.

This field supports globs. For example, if you have a series of Python packages in a

python_modules
directory,
src = ["python_modules/*"]
would expand to incorporate all of the packages in that directory. User home directory and environment variables will also be expanded.

Default value:

["."]

Type:

Vec<PathBuf>

Example usage:

[tool.ruff]
# Allow imports relative to the "src" and "test" directories.
src = ["src", "test"]

target-version

The Python version to target, e.g., when considering automatic code upgrades, like rewriting type annotations. Note that the target version will not be inferred from the current Python version, and instead must be specified explicitly (as seen below).

Default value:

"py310"

Type:

PythonVersion

Example usage:

[tool.ruff]
# Always generate Python 3.7-compatible code.
target-version = "py37"

task-tags

A list of task tags to recognize (e.g., "TODO", "FIXME", "XXX").

Comments starting with these tags will be ignored by commented-out code detection (

ERA
), and skipped by line-length rules (
E501
) if
ignore-overlong-task-comments
is set to
true
.

Default value:

["TODO", "FIXME", "XXX"]

Type:

Vec<String>

Example usage:

[tool.ruff]
task-tags = ["HACK"]

typing-modules

A list of modules whose imports should be treated equivalently to members of the

typing
module.

This is useful for ensuring proper type annotation inference for projects that re-export

typing
and
typing_extensions
members from a compatibility module. If omitted, any members imported from modules apart from
typing
and
typing_extensions
will be treated as ordinary Python objects.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff]
typing-modules = ["airflow.typing_compat"]

unfixable

A list of rule codes or prefixes to consider non-autofix-able.

Default value:

[]

Type:

Vec<RuleSelector>

Example usage:

[tool.ruff]
# Disable autofix for unused imports (`F401`).
unfixable = ["F401"]

update-check

Enable or disable automatic update checks (overridden by the

--update-check
and
--no-update-check
command-line flags).

Default value:

false

Type:

bool

Example usage:

[tool.ruff]
update-check = true

flake8-annotations

allow-star-arg-any

Whether to suppress

ANN401
for dynamically typed
*args
and
**kwargs
arguments.

Default value:

false

Type:

bool

Example usage:

[tool.ruff.flake8-annotations]
allow-star-arg-any = true

mypy-init-return

Whether to allow the omission of a return type hint for

__init__
if at least one argument is annotated.

Default value:

false

Type:

bool

Example usage:

[tool.ruff.flake8-annotations]
mypy-init-return = true

suppress-dummy-args

Whether to suppress

ANN000
-level violations for arguments matching the "dummy" variable regex (like
_
).

Default value:

false

Type:

bool

Example usage:

[tool.ruff.flake8-annotations]
suppress-dummy-args = true

suppress-none-returning

Whether to suppress

ANN200
-level violations for functions that meet either of the following criteria:

  • Contain no
    return
    statement.
  • Explicit
    return
    statement(s) all return
    None
    (explicitly or implicitly).

Default value:

false

Type:

bool

Example usage:

[tool.ruff.flake8-annotations]
suppress-none-returning = true

flake8-bandit

check-typed-exception

Whether to disallow

try
-
except
-
pass
(
S110
) for specific exception types. By default,
try
-
except
-
pass
is only disallowed for
Exception
and
BaseException
.

Default value:

false

Type:

bool

Example usage:

[tool.ruff.flake8-bandit]
check-typed-exception = true

hardcoded-tmp-directory

A list of directories to consider temporary.

Default value:

["/tmp", "/var/tmp", "/dev/shm"]

Type:

Vec<String>

Example usage:

[tool.ruff.flake8-bandit]
hardcoded-tmp-directory = ["/foo/bar"]

hardcoded-tmp-directory-extend

A list of directories to consider temporary, in addition to those specified by

hardcoded-tmp-directory
.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.flake8-bandit]
extend-hardcoded-tmp-directory = ["/foo/bar"]

flake8-bugbear

extend-immutable-calls

Additional callable functions to consider "immutable" when evaluating, e.g., the

no-mutable-default-argument
rule (
B006
).

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.flake8-bugbear]
# Allow default arguments like, e.g., `data: List[str] = fastapi.Query(None)`.
extend-immutable-calls = ["fastapi.Depends", "fastapi.Query"]

flake8-builtins

builtins-ignorelist

Ignore list of builtins.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.flake8-builtins]
builtins-ignorelist = ["id"]

flake8-errmsg

max-string-length

Maximum string length for string literals in exception messages.

Default value:

0

Type:

usize

Example usage:

[tool.ruff.flake8-errmsg]
max-string-length = 20

flake8-implicit-str-concat

allow-multiline

Whether to allow implicit string concatenations for multiline strings. By default, implicit concatenations of multiline strings are allowed (but continuation lines, delimited with a backslash, are prohibited).

Default value:

true

Type:

bool

Example usage:

[tool.ruff.flake8-implicit-str-concat]
allow-multiline = false

flake8-import-conventions

aliases

The conventional aliases for imports. These aliases can be extended by the

extend_aliases
option.

Default value:

{"altair": "alt", "matplotlib.pyplot": "plt", "numpy": "np", "pandas": "pd", "seaborn": "sns"}

Type:

FxHashMap<String, String>

Example usage:

[tool.ruff.flake8-import-conventions]
[tool.ruff.flake8-import-conventions.aliases]
# Declare the default aliases.
altair = "alt"
"matplotlib.pyplot" = "plt"
numpy = "np"
pandas = "pd"
seaborn = "sns"

extend-aliases

A mapping of modules to their conventional import aliases. These aliases will be added to the

aliases
mapping.

Default value:

{}

Type:

FxHashMap<String, String>

Example usage:

[tool.ruff.flake8-import-conventions]
[tool.ruff.flake8-import-conventions.extend-aliases]
# Declare a custom alias for the `matplotlib` module.
"dask.dataframe" = "dd"

flake8-pytest-style

fixture-parentheses

Boolean flag specifying whether

@pytest.fixture()
without parameters should have parentheses. If the option is set to
true
(the default),
@pytest.fixture()
is valid and
@pytest.fixture
is invalid. If set to
false
,
@pytest.fixture
is valid and
@pytest.fixture()
is invalid.

Default value:

true

Type:

bool

Example usage:

[tool.ruff.flake8-pytest-style]
fixture-parentheses = true

mark-parentheses

Boolean flag specifying whether

@pytest.mark.foo()
without parameters should have parentheses. If the option is set to
true
(the default),
@pytest.mark.foo()
is valid and
@pytest.mark.foo
is invalid. If set to
false
,
@pytest.fixture
is valid and
@pytest.mark.foo()
is invalid.

Default value:

true

Type:

bool

Example usage:

[tool.ruff.flake8-pytest-style]
mark-parentheses = true

parametrize-names-type

Expected type for multiple argument names in

@pytest.mark.parametrize
. The following values are supported:

  • csv
    — a comma-separated list, e.g.
    @pytest.mark.parametrize('name1,name2', ...)
  • tuple
    (default) — e.g.
    @pytest.mark.parametrize(('name1', 'name2'), ...)
  • list
    — e.g.
    @pytest.mark.parametrize(['name1', 'name2'], ...)

Default value:

tuple

Type:

ParametrizeNameType

Example usage:

[tool.ruff.flake8-pytest-style]
parametrize-names-type = "list"

parametrize-values-row-type

Expected type for each row of values in

@pytest.mark.parametrize
in case of multiple parameters. The following values are supported:

  • tuple
    (default) — e.g.
    @pytest.mark.parametrize(('name1', 'name2'), [(1, 2), (3, 4)])
  • list
    — e.g.
    @pytest.mark.parametrize(('name1', 'name2'), [[1, 2], [3, 4]])

Default value:

tuple

Type:

ParametrizeValuesRowType

Example usage:

[tool.ruff.flake8-pytest-style]
parametrize-values-row-type = "list"

parametrize-values-type

Expected type for the list of values rows in

@pytest.mark.parametrize
. The following values are supported:

  • tuple
    — e.g.
    @pytest.mark.parametrize('name', (1, 2, 3))
  • list
    (default) — e.g.
    @pytest.mark.parametrize('name', [1, 2, 3])

Default value:

list

Type:

ParametrizeValuesType

Example usage:

[tool.ruff.flake8-pytest-style]
parametrize-values-type = "tuple"

raises-extend-require-match-for

List of additional exception names that require a match= parameter in a

pytest.raises()
call. This extends the default list of exceptions that require a match= parameter. This option is useful if you want to extend the default list of exceptions that require a match= parameter without having to specify the entire list. Note that this option does not remove any exceptions from the default list.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.flake8-pytest-style]
raises-extend-require-match-for = ["requests.RequestException"]

raises-require-match-for

List of exception names that require a match= parameter in a

pytest.raises()
call.

Default value:

["BaseException", "Exception", "ValueError", "OSError", "IOError", "EnvironmentError", "socket.error"]

Type:

Vec<String>

Example usage:

[tool.ruff.flake8-pytest-style]
raises-require-match-for = ["requests.RequestException"]

flake8-quotes

avoid-escape

Whether to avoid using single quotes if a string contains single quotes, or vice-versa with double quotes, as per PEP8. This minimizes the need to escape quotation marks within strings.

Default value:

true

Type:

bool

Example usage:

[tool.ruff.flake8-quotes]
# Don't bother trying to avoid escapes.
avoid-escape = false

docstring-quotes

Quote style to prefer for docstrings (either "single" (

'
) or "double" (
"
)).

Default value:

"double"

Type:

Quote

Example usage:

[tool.ruff.flake8-quotes]
docstring-quotes = "single"

inline-quotes

Quote style to prefer for inline strings (either "single" (

'
) or "double" (
"
)).

Default value:

"double"

Type:

Quote

Example usage:

[tool.ruff.flake8-quotes]
inline-quotes = "single"

multiline-quotes

Quote style to prefer for multiline strings (either "single" (

'
) or "double" (
"
)).

Default value:

"double"

Type:

Quote

Example usage:

[tool.ruff.flake8-quotes]
multiline-quotes = "single"

flake8-tidy-imports

ban-relative-imports

Whether to ban all relative imports (

"all"
), or only those imports that extend into the parent module or beyond (
"parents"
).

Default value:

"parents"

Type:

Strictness

Example usage:

[tool.ruff.flake8-tidy-imports]
# Disallow all relative imports.
ban-relative-imports = "all"

banned-api

Specific modules or module members that may not be imported or accessed. Note that this rule is only meant to flag accidental uses, and can be circumvented via

eval
or
importlib
.

Default value:

{}

Type:

HashMap<String, BannedApi>

Example usage:

[tool.ruff.flake8-tidy-imports]
[tool.ruff.flake8-tidy-imports.banned-api]
"cgi".msg = "The cgi module is deprecated, see https://peps.python.org/pep-0594/#cgi."
"typing.TypedDict".msg = "Use typing_extensions.TypedDict instead."

flake8-type-checking

exempt-modules

Exempt certain modules from needing to be moved into type-checking blocks.

Default value:

["typing"]

Type:

Vec<String>

Example usage:

[tool.ruff.flake8-type-checking]
exempt-modules = ["typing", "typing_extensions"]

strict

Enforce TC001, TC002, and TC003 rules even when valid runtime imports are present for the same module. See: https://github.com/snok/flake8-type-checking#strict.

Default value:

false

Type:

bool

Example usage:

[tool.ruff.flake8-type-checking]
strict = true

flake8-unused-arguments

ignore-variadic-names

Whether to allow unused variadic arguments, like

*args
and
**kwargs
.

Default value:

false

Type:

bool

Example usage:

[tool.ruff.flake8-unused-arguments]
ignore-variadic-names = true

isort

classes

An override list of tokens to always recognize as a Class for

order-by-type
regardless of casing.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.isort]
classes = ["SVC"]

combine-as-imports

Combines as imports on the same line. See isort's

combine-as-imports
option.

Default value:

false

Type:

bool

Example usage:

[tool.ruff.isort]
combine-as-imports = true

constants

An override list of tokens to always recognize as a CONSTANT for

order-by-type
regardless of casing.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.isort]
constants = ["constant"]

extra-standard-library

A list of modules to consider standard-library, in addition to those known to Ruff in advance.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.isort]
extra-standard-library = ["path"]

force-single-line

Forces all from imports to appear on their own line.

Default value:

false

Type:

bool

Example usage:

[tool.ruff.isort]
force-single-line = true

force-sort-within-sections

Don't sort straight-style imports (like

import sys
) before from-style imports (like
from itertools import groupby
). Instead, sort the imports by module, independent of import style.

Default value:

false

Type:

bool

Example usage:

[tool.ruff.isort]
force-sort-within-sections = true

force-wrap-aliases

Force

import from
statements with multiple members and at least one alias (e.g.,
import A as B
) to wrap such that every line contains exactly one member. For example, this formatting would be retained, rather than condensing to a single line:

from .utils import (
    test_directory as test_directory,
    test_id as test_id
)

Note that this setting is only effective when combined with

combine-as-imports = true
. When
combine-as-imports
isn't enabled, every aliased
import from
will be given its own line, in which case, wrapping is not necessary.

Default value:

false

Type:

bool

Example usage:

[tool.ruff.isort]
force-wrap-aliases = true
combine-as-imports = true

known-first-party

A list of modules to consider first-party, regardless of whether they can be identified as such via introspection of the local filesystem.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.isort]
known-first-party = ["src"]

known-third-party

A list of modules to consider third-party, regardless of whether they can be identified as such via introspection of the local filesystem.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.isort]
known-third-party = ["src"]

no-lines-before

A list of sections that should not be delineated from the previous section via empty lines.

Default value:

[]

Type:

Option<Vec<ImportType>>

Example usage:

[tool.ruff.isort]
no-lines-before = ["future", "standard-library"]

order-by-type

Order imports by type, which is determined by case, in addition to alphabetically.

Default value:

true

Type:

bool

Example usage:

[tool.ruff.isort]
order-by-type = true

relative-imports-order

Whether to place "closer" imports (fewer

.
characters, most local) before "further" imports (more
.
characters, least local), or vice versa.

The default ("furthest-to-closest") is equivalent to isort's

reverse-relative
default (
reverse-relative = false
); setting this to "closest-to-furthest" is equivalent to isort's
reverse-relative = true
.

Default value:

furthest-to-closest

Type:

RelatveImportsOrder

Example usage:

[tool.ruff.isort]
relative-imports-order = "closest-to-furthest"

required-imports

Add the specified import line to all files.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.isort]
required-imports = ["from __future__ import annotations"]

single-line-exclusions

One or more modules to exclude from the single line rule.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.isort]
single-line-exclusions = ["os", "json"]

split-on-trailing-comma

If a comma is placed after the last member in a multi-line import, then the imports will never be folded into one line.

See isort's

split-on-trailing-comma
option.

Default value:

true

Type:

bool

Example usage:

[tool.ruff.isort]
split-on-trailing-comma = false

variables

An override list of tokens to always recognize as a var for

order-by-type
regardless of casing.

Default value:

[]

Type:

Vec<String>

Example usage:

[tool.ruff.isort]
variables = ["VAR"]

mccabe

max-complexity

The maximum McCabe complexity to allow before triggering

C901
errors.

Default value:

10

Type:

usize

Example usage:

[tool.ruff.mccabe]
# Flag errors (`C901`) whenever the complexity level exceeds 5.
max-complexity = 5

pep8-naming

classmethod-decorators

A list of decorators that, when applied to a method, indicate that the method should be treated as a class method. For example, Ruff will expect that any method decorated by a decorator in this list takes a

cls
argument as its first argument.

Default value:

["classmethod"]

Type:

Vec<String>

Example usage:

[tool.ruff.pep8-naming]
# Allow Pydantic's `@validator` decorator to trigger class method treatment.
classmethod-decorators = ["classmethod", "pydantic.validator"]

ignore-names

A list of names to ignore when considering

pep8-naming
violations.

Default value:

["setUp", "tearDown", "setUpClass", "tearDownClass", "setUpModule", "tearDownModule", "asyncSetUp", "asyncTearDown", "setUpTestData", "failureException", "longMessage", "maxDiff"]

Type:

Vec<String>

Example usage:

[tool.ruff.pep8-naming]
ignore-names = ["callMethod"]

staticmethod-decorators

A list of decorators that, when applied to a method, indicate that the method should be treated as a static method. For example, Ruff will expect that any method decorated by a decorator in this list has no

self
or
cls
argument.

Default value:

["staticmethod"]

Type:

Vec<String>

Example usage:

[tool.ruff.pep8-naming]
# Allow a shorthand alias, `@stcmthd`, to trigger static method treatment.
staticmethod-decorators = ["staticmethod", "stcmthd"]

pycodestyle

ignore-overlong-task-comments

Whether or not line-length violations (

E501
) should be triggered for comments starting with
task-tags
(by default: ["TODO", "FIXME", and "XXX"]).

Default value:

false

Type:

bool

Example usage:

[tool.ruff.pycodestyle]
ignore-overlong-task-comments = true

max-doc-length

The maximum line length to allow for line-length violations within documentation (

W505
), including standalone comments.

Default value:

None

Type:

usize

Example usage:

[tool.ruff.pycodestyle]
max-doc-length = 88

pydocstyle

convention

Whether to use Google-style or NumPy-style conventions or the PEP257 defaults when analyzing docstring sections.

Default value:

None

Type:

Convention

Example usage:

[tool.ruff.pydocstyle]
# Use Google-style docstrings.
convention = "google"

pylint

allow-magic-value-types

Constant types to ignore when used as "magic values".

Default value:

["str"]

Type:

Vec<ConstantType>

Example usage:

[tool.ruff.pylint]
allow-magic-value-types = ["int"]

pyupgrade

keep-runtime-typing

Whether to avoid PEP 585 (

List[int]
->
list[int]
) and PEP 604 (
Optional[str]
->
str | None
) rewrites even if a file imports
from __future__ import annotations
. Note that this setting is only applicable when the target Python version is below 3.9 and 3.10 respectively.

Default value:

false

Type:

bool

Example usage:

[tool.ruff.pyupgrade]
# Preserve types, even if a file imports `from __future__ import annotations`.
keep-runtime-typing = true

License

MIT