Rustで書かれた非常に高速なPythonリンター。
CPythonコードベースを最初からリントします。
pip
pyproject.toml
flake8-bugbearのような数十のFlake8
プラグインのネイティブ再実装
Ruffは、より多くのツールを統合しながら、代替ツールよりも桁違いに高速になることを目指しています 単一の共通インターフェイスの背後にある機能。
ラフは、Flake8(およびさまざまなプラグイン)、isort
、pydocstyle
、yesqa
、根絶
、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
ラフはPyPIのラフ
として利用できます:
pip install ruff
macOS Homebrew および Linuxbrew ユーザーの場合、Ruff は Homebrew で ruff
としても利用できます。
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はファイルも尊重します。 同等のスキーマ (ただし、階層は省略できます)。たとえば、上記の説明は次のように表されます。
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
これらの規則にはいくつかの例外があります。
pyproject.toml
pyproject.toml
[tool.ruff]
--config
exclude
src
ディレクトリ
に対して再び解決されます。pyproject.toml
${config_dir}/ruff/pyproject.toml
${config_dir}
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
コマンドラインでパスが渡されると、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
詳細については、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 会場 | 無効な印刷構文 | の使用は関数で無効です>> |
|
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 |
詳細については、PyPIのパイコードスタイルを参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
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 | 構文エラー | 構文エラー: {メッセージ} |
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
W292 | ファイルの終わりに改行がない | ファイルの末尾に改行がない | |
W505 | ドキュメント行が長すぎます | ドキュメント行が長すぎます ({長さ} > {制限} 文字) | |
W605 | 無効なエスケープシーケンス | 無効なエスケープ シーケンス: '{char}' |
詳細については、PyPIのマッケイブを参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
C901 | 機能が複雑すぎる |
{name}複雑すぎる ({複雑さ}) |
詳細については、PyPI の isort を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
I001 | ソートされていないインポート | インポートブロックがソートされていないか、フォーマットされていない | |
I002 | 欠落している必須のインポート | 必要なインポートがありません:{name} |
詳細については、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} |
詳細については、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 | 空でない | ドキュメント文字列が空です |
詳細については、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 | 無関係括弧 | 無関係な括弧を避ける |
詳細については、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 |
詳細については、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} |
詳細については、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 |
詳細については、PyPI の flake8-blind-except を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
BLE001 | ブラインドを除く | ブラインド例外をキャッチしないでください:{name} |
詳細については、PyPI の flake8-boolean-trap を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
FBT001 | ブール位置引数イン関数定義 | 関数定義のブール位置引数 | |
FBT002 | 関数定義内のブール値デフォルト値 | 関数定義のブール値のデフォルト値 | |
FBT003 | 関数呼び出しのブール値位置値 | 関数呼び出しのブール値の位置値 |
詳細については、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= |
詳細については、PyPI の flake8-builtins を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
A001 | 組み込み変数シャドウイング | 変数はPython組み込みのシャドウイングです{name} |
|
A002 | 組み込み引数シャドウイング | 引数はPythonの組み込みをシャドウイングしています{name} |
|
A003 | 組み込み属性シャドウイング | クラス属性はPython組み込みのシャドウイングです{name} |
詳細については、PyPI の flake8 コンマを参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
COM812 | 末尾のコンマがありません | 末尾のコンマがありません | |
COM818 | 末尾のコンマオンベアタプル禁止 | 裸のタプルの末尾のコンマは禁止されています | |
COM819 | 末尾のコンマ禁止 | 末尾のコンマは禁止されています |
詳細については、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 |
詳細については、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() |
詳細については、PyPI の flake8-デバッガーを参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
T100 | デバッガ | トレースが見つかりました: 使用済み{name} |
詳細については、PyPI の flake8-errmsg を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
EM101 | 例外の生文字列 | 例外は文字列リテラルを使用してはならず、最初に変数に割り当てます | |
EM102 | 例外の F 文字列 | 例外はf文字列リテラルを使用すべきではなく、最初に変数に代入します | |
EM103 | 例外のドット形式 | 例外は文字列を直接使用してはならず、最初に変数に割り当てます.format() |
詳細については、PyPI の flake8 実行可能ファイルを参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
EXE001 | シバン-実行不可 | シバンは存在しますが、ファイルは実行可能ではありません | |
EXE002 | シバン-欠落-実行可能ファイル | ファイルは実行可能ですが、シバンは存在しません | |
EXE003 | シバンパイソン | シバンには「パイソン」が含まれている必要があります | |
EXE004 | シバン-空白 | シバンの前に空白を避ける | |
EXE005 | シバン改行 | シバンはファイルの先頭にある必要があります |
詳細については、PyPI の flake8-implicit-str-concat を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
ISC001 | 単一行暗黙の文字列連結 | 暗黙的に連結された文字列リテラルを 1 行に | |
ISC002 | 複数行暗黙の文字列連結 | 継続行に暗黙的に連結された文字列リテラル | |
ISC003 | 明示的な文字列連結 | 明示的に連結された文字列は暗黙的に連結する必要があります |
詳細については、GitHub の flake8-import-conventions を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
ICN001 | インポート・エイリアスは従来型ではない |
{name}としてインポートする必要があります {asname} |
詳細については、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 |
詳細については、PyPI の flake8-no-pep420 を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
INP001 | 暗黙的な名前空間パッケージ | ファイルは暗黙的な名前空間パッケージの一部です。を追加します。{filename} __init__.py |
詳細については、PyPI の flake8-pie を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
パイ790 | 不要パスなし | 不要なステートメントpass |
|
パイ794 | 重複クラス・フィールド定義 | クラス フィールドが複数回定義されている{name} |
|
パイ796 | 優先-一意-列挙型 | 列挙型に重複する値が含まれています:{value} |
|
パイ800 | 不要なスプレッドなし | 不要なスプレッド** |
|
パイ804 | 不要ではない辞書kwargs | 不要なクワーグdict |
|
パイ807 | 優先リスト-組み込み | 役に立たないラムダよりも優先するlist |
詳細については、PyPI の flake8-print を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
T201 | 印刷が見つかりました |
|
|
T203 | P-プリント-見つかりました |
pprint設立する |
詳細については、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 |
詳細については、PyPIのflake8引用符を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
Q000 | 不正な引用符インライン文字列 | 二重引用符が見つかりましたが、一重引用符が推奨されます | |
Q001 | 不正な引用符-複数行-文字列 | 二重引用符の複数行が見つかりましたが、一重引用符が望ましい | |
Q002 | 不正な引用符-ドキュメント文字列 | 二重引用符のドキュメント文字列が見つかりましたが、一重引用符が推奨されます | |
Q003 | 回避-引用-エスケープ | 外側の引用符を変更して、内側の引用符をエスケープしないようにする |
詳細については、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 |
詳細については、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 |
詳細については、PyPI の flake8-tidy-imports を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
TID251 | 禁止されたAPI |
{name}禁止されています: {メッセージ} |
|
TID252 | 相対輸入 | 親モジュールからの相対インポートは禁止されています |
詳細については、PyPI での flake8-type-check を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
TCH001 | 入力のみのファーストパーティインポート | アプリケーションのインポートを型チェックブロックに移動する{} |
|
TCH002 | 入力のみのサードパーティ製インポート | サードパーティのインポートを型チェックブロックに移動する{} |
|
TCH003 | 入力専用標準ライブラリインポート | 標準ライブラリのインポートを型チェックブロックに移動する{} |
|
TCH004 | 実行時インポートインタイプチェックブロック | インポートを型チェックブロックから移動します。インポートは、型ヒント以上の目的で使用されます。{} |
|
TCH005 | 空型チェックブロック | 空の型チェック ブロックが見つかりました |
詳細については、PyPI の flake8-unused-arguments を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
ARG001 | 未使用の関数引数 | 未使用の関数引数:{name} |
|
ARG002 | 未使用のメソッド引数 | 未使用のメソッド引数:{name} |
|
ARG003 | 未使用のクラスメソッド引数 | 未使用のクラスメソッド引数:{name} |
|
ARG004 | 未使用の静的メソッド引数 | 未使用の静的メソッド引数:{name} |
|
ARG005 | 未使用のラムダ引数 | 未使用のラムダ引数:{name} |
詳細については、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.joinfoo_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 | コメントアウトされたコード | コメントアウトされたコードが見つかりました |
詳細については、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は不正な変数名です。未来の自分にもっと優しくしてください。 |
詳細については、GitHub の pygrep-hooks を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
PGH001 | 評価なし | 組み込みは許可されていませんeval() |
|
PGH002 | 非推奨のログ警告 |
warnは非推奨であり、 warning |
|
PGH003 | ブランケットタイプ無視 | 型の問題を無視するときに特定のルール コードを使用する | |
PGH004 | ブランケット-ノカ | 使用時に特定のルールコードを使用するnoqa |
詳細については、PyPI の Pylint を参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
PLC0414 | 役に立たないインポートエイリアス | エイリアスのインポートで元のパッケージの名前を変更しない | |
PLC3002 | 不要な直接ラムダ呼び出し | 直接呼び出されるラムダ式。代わりに、式をインラインで実行してください。 |
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
PLE0117 | 非ローカル-バインドなし | バインドなしで見つかった非ローカル名{name} |
|
PLE0118 | 使用済み事前グローバル宣言 | 名前は、行 {line} のグローバル宣言の前に使用されます{name} |
|
PLE0604 | 無効なすべてのオブジェクト | の無効なオブジェクトには、文字列のみが含まれている必要があります__all__ |
|
PLE0605 | すべて無効な形式 | の形式が無効です は、 または__all__ tuple list |
|
PLE1142 | 待機-外部非同期 |
await非同期関数内で使用する必要があります |
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
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}を定数変数に置き換えることを検討してください |
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
PLW0120 | 役に立たないループ | breakステートメントなしでループのElse句を削除し、その中のすべてのコードをインデント解除します | |
PLW0602 | グローバル変数未割り当て | グローバル for を使用しますが、割り当ては行われません{name} |
詳細については、PyPIのトリケラトプスを参照してください。
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
トライ002 | レイズバニラ級 | 独自の例外を作成する | |
トライ003 | レイズ-バニラ-引数 | 例外クラスの外部に長いメッセージを指定しないようにする | |
トライ004 | 優先型エラー | 無効な型の例外を優先するTypeError |
|
トライ200 | 原因のない救済 | 例外の原因を指定するために使用しますraise from |
|
トライ201 | 詳細レイズ | 例外名を指定せずに使用するraise |
|
トライ300 | 試してみてください-考慮-その他 | このステートメントをブロックに移動することを検討してくださいelse |
|
トライ301 | ライズ・ウィズイン・トライ | 内部関数への抽象化raise |
|
トライ400 | 例外ではなくエラー | 代わりに使用logging.exception logging.error |
コード | 名前 | メッセージ | 修理する |
---|---|---|---|
RUF001 | あいまいなユニコード文字列 | 文字列にあいまいなユニコード文字 '{confusable}' が含まれています ('{representant}' という意味ですか? | |
RUF002 | あいまいなユニコード文字ドキュメント文字列 | ドキュメント文字列にはあいまいなユニコード文字 '{紛らわしい}' が含まれています ('{表現者}' という意味ですか? | |
RUF003 | あいまいなユニコード文字コメント | コメントにあいまいなユニコード文字 '{紛らわしい}' が含まれています ('{代表}' という意味ですか? | |
RUF004 | キーワード引数-星-引数の前に | キーワード引数は、スター付き引数の後に指定する必要があります{name} |
|
RUF005 | 連結の代わりにコレクションリテラルをアンパックする | 連結の代わりに検討する{expr} |
|
RUF100 | 未使用-NOQA | 未使用のブランケットディレクティブnoqa |
ラフVSコード拡張機能をダウンロードし、 自動修正アクション、インポートソートなどをサポートします。
Ruffは、PyPIで利用可能なruff-lsp
Pythonパッケージを介して言語サーバープロトコルをサポートしています。
ruff-lsp
を使用すると、次のような任意のエディターでRuffを使用できます。
は、Neovim、Sublime 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の診断がエディターに直接表示されます。
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
}
}
}
},
}
ruffは、vimやNeovimを含む、ruff-lsp
(言語サーバープロトコルを参照)を介して言語サーバープロトコルをサポートする任意のエディターに統合できます。
ruff-lsp
を使用することをお勧めします。
ラフのLSPサーバーを公式にサポートしています。
ただし、Ruffは の coc-pyright 拡張の一部としても利用できます。
coc.nvim
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は実行可能なアクションとして表示されます。
ラフは、ラフプラグインとしても利用できます。 IntelliJマーケットプレイス(@koxudaxiによって管理されています)。
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 .
はい。ラフは、箱から出してすぐに使えるブラックと互換性があります。 設定は2つの間で一貫しています。
line-length
プロジェクトとして、ラフはブラックと一緒に使用するように設計されているため、実装を延期します 自動書式設定によって削除されるスタイルの lint ルール。
(フレーク8から来る?フレーク8からラフ
を試してみてください
既存の構成を自動的に変換します。
ラフは、Flake8を使用しない場合、または少数で使用すると、Flake1のドロップイン代替品として使用できます(2) プラグイン、(3)ブラックと一緒に、(3)Python <>コードで。
これらの条件下で、ラフはFlake8のすべてのルールを実装します。実際には、それはラフを意味します すべてのルール(Pyflakesに由来する)と、andルール(pycodestyleに由来する)のサブセットを実装します。
F
E
W
Ruffはまた、最も人気のあるFlake8プラグインと関連するコード品質ツールのいくつかを再実装します ネイティブに、以下を含みます:
オートフレーク
(#1647)eradicate
flake8-2020
flake8-annotations
フレーク8-バンディット
(#1646)flake8-blind-except
flake8-boolean-trap
flake8-bugbear
flake8-builtins
flake8-commas
flake8-comprehensions
flake8-datetimez
flake8-debugger
flake8-docstrings
flake8-eradicate
flake8-errmsg
flake8-executable
flake8-implicit-str-concat
flake8-import-conventions
flake8-logging-format
flake8-no-pep420
flake8-pie
flake8-print
flake8-pytest-style
flake8-quotes
flake8-return
フレーク8-単純化
(#998)flake8-super
flake8-tidy-imports
flake8-type-checking
flake8-use-pathlib
isort
mccabe
pandas-vet
pep8-naming
pydocstyle
ピグレップフック(
#980)pyアップグレード
(#827)yesqa
場合によっては、Ruffは、 Flake8プラグインを発信します。たとえば、Ruff は からルールを表すために使用します。これにより、プラグイン間の競合を最小限に抑え、個々のプラグインが可能になります (避けるために)とは対照的に、単一の(例えば)でオンまたはオフを切り替える のような規則と矛盾する)。
TID252
I252
flake8-tidy-imports
--select TID
--select I2
isort
I001
ルールセットを超えて、ラフはFlake8に対して次の制限に苦しんでいます。
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を置き換えるために使用できます。
flake8-2020
flake8-annotations
フレーク8-バンディット
(#1646)flake8-blind-except
flake8-boolean-trap
flake8-bugbear
flake8-builtins
flake8-commas
flake8-comprehensions
flake8-datetimez
flake8-debugger
flake8-docstrings
flake8-eradicate
flake8-errmsg
flake8-executable
flake8-implicit-str-concat
flake8-import-conventions
flake8-logging-format
flake8-no-pep420
flake8-pie
flake8-print
flake8-pytest-style
flake8-quotes
flake8-return
フレーク8-単純化
(#998)flake8-super
flake8-tidy-imports
flake8-type-checking
flake8-use-pathlib
mccabe
pandas-vet
pep8-naming
pydocstyle
ラフは、isort
、yesqa
、根絶
、pygrepフック
(#980)、およびルールのサブセットを置き換えることもできます
pyアップグレード
(#827) で実装されています。
Ruffの使用を検討しているが、サポートされていないFlake8プラグインに依存している場合は、お気軽に問題を報告してください。
いいえ!ラフはPyPIのラフ
として利用できます:
pip install ruff
Ruffには、すべての主要なプラットフォーム用のホイールが付属しているため、依存せずにRuffを取り付けることができます。 まったく錆びています。
pip
Ruffはまだサードパーティのプラグインをサポートしていませんが、プラグインシステムは プロジェクト。詳細については、#283を参照してください。
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"]
ラフは、リンターを実行するためのツールである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.
はい!特定のドキュメント文字列規則を有効にするには、 に以下を追加します。
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 /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は最後の手段としてユーザー固有のファイルまたはファイルを探します。この動作は 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のオートフィックスはベストエフォート型メカニズムです。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:
.mypy_cache
.mypy_cache
foo.py
foo.py
foo_*.py
foo_*.py
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:
.mypy_cache
.mypy_cache
foo.py
foo.py
foo_*.py
foo_*.py
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:
returnstatement.
returnstatement(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-
passis only disallowed for
Exceptionand
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-argumentrule (
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_aliasesoption.
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
aliasesmapping.
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.fixtureis invalid. If set to
false,
@pytest.fixtureis 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.foois invalid. If set to
false,
@pytest.fixtureis 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.parametrizein 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
evalor
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
*argsand
**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-typeregardless 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-typeregardless 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 fromstatements 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-importsisn't enabled, every aliased
import fromwill 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-relativedefault (
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-typeregardless 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
C901errors.
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
clsargument 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-namingviolations.
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
selfor
clsargument.
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
MIT