結論:RUF100は「今回有効なルール」を基準に判定する
RUF100は、noqaがその実行で発生する診断を実際に抑制しているかを調べます。普段の設定にRUF100を追加したい場面で--select RUF100だけを指定すると、設定済みのルールがRUF100へ置き換わり、普段は必要なnoqaまでunusedと判定されることがあります。削除する前に、--extend-select RUF100で元の規則へ追加し、元診断も確認してください。
Ruff公式のlinter文書では、最優先のselectを土台にextend-selectとignoreを適用し、CLI指定はpyproject.tomlより優先すると説明しています。未使用抑制の追加検査も--extend-select RUF100が公式例です。
最小構成で3通りの実行結果を比べる
以下は2026年10月6日、Windows、Ruff 0.16.10、Python 3.13.7の専用隔離フォルダーで、計6コマンドを確認した結果です。別OSでの実行結果を示すものではありません。空の検証用フォルダーへ次の2ファイルを作成します。
pyproject.toml
[tool.ruff.lint]
select = ["F401"]demo.py
import os # noqa: F4011. 普段の設定だけで確認する
ruff check --config pyproject.toml demo.pyF401は有効で、noqaが未使用importの診断を抑制します。終了コードは0です。
2. --selectでRUF100だけを選ぶ
ruff check --config pyproject.toml --select RUF100 demo.pyRUF100 [*] Unused `noqa` directive (non-enabled: `F401`)終了コードは1です。CLIの--selectが設定ファイルのselect = ["F401"]より優先されるため、有効ルールはRUF100だけになります。F401自体が無効なので、RUF100から見るとF401用の抑制は「今回の診断を抑えていない」状態です。この段階でnoqaを削除してはいけません。
3. --extend-selectでRUF100を追加する
ruff check --config pyproject.toml --extend-select RUF100 demo.pyF401へRUF100が追加されます。F401の対象となる未使用importがありますが、noqaが診断を抑制しているため、RUF100は不要とは判定しません。終了コードは0です。
| 指定 | 今回の有効ルール | demo.pyの結果 |
|---|---|---|
--select RUF100 | RUF100のみ | F401はnon-enabledとしてRUF100 |
--extend-select RUF100 | F401とRUF100 | noqaは必要、終了コード0 |
extend-selectの公式設定資料も、selectはルール集合を置き換え、extend-selectは既存の有効ルールへ追加すると説明しています。公式リポジトリのIssue #24004でも、--select RUF100が設定側のC90を置き換えていた点が整理され、既存ルールへ追加する場合は--extend-selectを使うと説明されています。これは全環境での頻度やRuff本体の一般的な不具合を示すものではなく、まず有効ルールを確認すべき例です。
noqaが抑えている元診断を確認する
ruff check --config pyproject.toml --select F401 --ignore-noqa demo.pyF401 [*] `os` imported but unusedこの条件では終了コード1です。--ignore-noqaは抑制コメントを一時的に無視して検査する指定であり、ファイルからコメントを削除しません。これにより、demo.pyのnoqaがF401を実際に抑えていたと確認できます。
実プロジェクトでは、普段のselectだけでなく、ignore、per-file-ignores、検査対象ファイルの違いも結果へ影響します。通常実行との差を比べ、診断確認時には--fixを付けないでください。設定で自動修正が有効なら、確認用実行へ--no-fixを加えて修正を抑えられます。
本当に不要なnoqaとは区別する
次のused.pyではimportしたosを実際に使用します。
import os # noqa: F401
print(os.name)ruff check --config pyproject.toml --extend-select RUF100 used.pyRUF100 [*] Unused `noqa` directive (unused: `F401`)終了コードは1です。os.nameを参照するためF401は発生せず、今度はF401用のnoqaが本当に不要です。先ほどの「F401が有効ルールから外れた」ケースとは原因が異なります。
確認後はRUF100だけを限定して修正する
ruff check --config pyproject.toml --extend-select RUF100 --fix --fixable RUF100 used.pyこの実測例では終了コード0となり、noqaコメントだけが除去され、importとprintは保持されました。
import os
print(os.name)この例に--unsafe-fixesは不要です。ただし、RUF100の公式説明では、noqaの後ろにあるコメントは説明文と解釈され、修正時に削除される場合があると説明しています。また、抑制コメント全体を削除し、同じ行の別コメントへ影響し得る修正はunsafe扱いです。別ツールの抑制は2つ目の#で区切り、実プロジェクトでは必ず差分と同居コメントを確認してください。RUF100は、Ruffが知らないルールコードを無視します。他ツールのコードを無効と決めつけて削除しないでください。
安全な確認順序
最初に普段の設定で有効なルールを保ち、RUF100は--extend-selectで追加します。次に--ignore-noqaで元診断の有無を確認し、不要と確認できたファイルだけを--fixable RUF100で限定修正します。RUF100は「全ツール、将来の全設定でも不要」という判定ではありません。また、ここで扱うのはruff checkのlintであり、ruff formatの整形とは別です。
よくある質問
RUF100が出たnoqaは、すべて削除してよいですか?
今回の有効ルールと元診断を確認してから判断します。別ツールの抑制や、通常実行と違うルール設定まで不要だと判断する検査ではありません。
ruff formatでもRUF100を確認できますか?
RUF100はlintルールなので、ruff checkで確認します。コード整形を行うruff formatとは役割が異なります。
関連するPython開発ツールのトラブル
uvで依存関係は入るのに自作コマンドを実行できない場合は、uvのproject.scriptsとパッケージ設定を確認する手順も参照してください。


コメント