HN 日本語サマリー

← 一覧へ戻る
プログラミング

Ruff v0.16.0 – 大幅な新アップデート – デフォルトルールが59から413に増加

Ruff v0.16.0 – Significant new updates – 413 default rules up from 59 (astral.sh)

318 pointsby vismit2000192 コメント

要約

Pythonの高速リンター兼フォーマッターであるRuffがバージョン0.16.0にアップデートされました。今回のリリースでは、デフォルトで有効になるルールが59から413に大幅に増加し、より多くの潜在的な問題を早期に検出できるようになりました。また、Markdownファイル内のPythonコードブロックのフォーマット機能や、新しい抑制コメント形式の導入など、開発者の利便性を向上させる機能が追加されています。

全文翻訳

Ruff v0.16.0 がリリースされました!PyPI またはお好みのパッケージマネージャーからインストールしてください: uv tool install ruff@latest 念のためお伝えすると、Ruff は Rust で書かれた非常に高速な Python リンターおよびフォーマッターです。Ruff は Black、Flake8(多数のプラグインを含む)、isort、pydocstyle、pyupgrade などを置き換えることができ、個々のツールよりも数十倍から数百倍高速に実行されます。 v0.16 への移行 Ruff v0.16 には少数の破壊的変更が含まれていますが、ほとんどのユーザーはコードや設定に大きな変更を加えることなくアップデートできます。主な例外は以下で説明します。 より優れたデフォルトルールセット Ruff は以前のバージョンで 59 だったデフォルトルールセットを、現在 413 のルールをデフォルトで有効にしています。Ruff のデフォルトルールセットが v0.1.0 で最後に変更されて以来、Ruff のルール数は 708 から 968 に増加しました。これらのルールの多くは、構文エラーや即時の実行時エラーを含む深刻な問題を検出しますが、以前はデフォルトで有効になっていませんでした。新しいルールセットにより、Ruff はこれらの問題やその他の多くの問題を、Ruff の設定なしで注意喚起してくれます。すでに select や extend-select を使用している場合でも、以前は発見できなかった役立つルールに注意を向けてくれることを願っています。有効になっているルールの完全なリストは長すぎるためここに含めることはできませんが、ドキュメントの新しい Default Rules ページで見つけることができます。ハイライトの一部には、人気の flake8-bugbear (B) および pyupgrade (UP) リンターのルール、および独自の RUF カテゴリのルールが含まれます。古いデフォルトセットに戻したい場合は、この設定で簡単に古いルールを選択できます: [lint] select = ["E4", "E7", "E9", "F"]。 この作業は、ルールの再分類という長年の目標と密接に関連していると考えており、この分野での今後の展開にご期待ください。 v0.16 の新機能 Ruff v0.16 には、以下にハイライトされたいくつかの新しく安定化された機能も含まれています。 Markdown コードブロックのフォーマット Ruff は Markdown ファイルに埋め込まれた Python コードブロックをフォーマットできるようになりました。これらのファイルでは、Ruff v0.16 は python、py、python3、py3、pyi、または pycon の情報文字列を持つフェンスされたコードブロックをフォーマットします。pyi ブロックはスタブファイルのようにフォーマットされ、pycon ブロックは REPL セッションとしてフォーマットされ、その他は通常の Python ファイルフォーマットを使用します。例: # README 以下は例です: ```py import ruff ruff_binary = ( ruff.find_ruff_bin() ) ``` ruff format を実行すると再フォーマットされます: これは Quarto ノートブックのフォーマットにも使用できます。Ruff は波括弧で囲まれた言語(例: ```{python})も引き続き認識するためです。Quarto ファイルが .qmd 拡張子を使用している場合は、拡張機能のマッピングを設定する必要がある場合があります。 フォーマットを抑制する必要がある場合は、いくつかのオプションがあります。抑制コメントをコードブロック内に表示したい場合は、コードブロック自体内に通常の fmt: off および fmt: on コメントを使用するか、同様の HTML コメントを使用してドキュメント全体のフォーマットを無効にすることができます: # README <!-- fmt: off --> ```py x = "this will be suppressed" ``` <!-- fmt: on --> Markdown フォーマットを完全に抑制するには、通常の extend-exclude 設定を使用して、*.md のようなグロブで Markdown ファイルをすべて除外できます。詳細については、ドキュメント全体を参照してください。 ruff: ignore コメントが新しい抑制機能を提供 Ruff は独自の抑制コメント形式を持つようになり、単独の行で使用できます。v0.15 では、Ruff リンターは、上記の fmt: off および fmt: on のペアと同様に、ペアになった ruff: disable および ruff: enable コメントを通じて範囲抑制メカニズムを獲得しました: # ruff: disable[N803] def foo( legacyArg1, legacyArg2, legacyArg3, legacyArg4, ): ... # ruff: enable[N803] Ruff v0.16 はこれを拡張して、さらに 2 つの ruff 抑制コメントを追加しました。 ruff: ignore は、noqa と同様に、同じ行または次の論理行で診断を抑制するために使用できます: import math # ruff: ignore[F401] # ruff: ignore[N803] def foo( legacyArg1, legacyArg2, legacyArg3, legacyArg4, ): ... この場合、論理行は関数のヘッダー全体(def からコロンまで)にわたるため、ruff: ignore は上記の disable/enable ペアと同じ N803 診断すべてを抑制します。 ruff: file-ignore コメントは、ruff: noqa コメントと同様に、ファイル全体の診断を抑制するために使用できます: # ruff: file-ignore[F401] このファイルで未使用のインポートを許可する import foo import bar import baz この例が示すように、これらのコメントの種類ごとに、追加された理由を説明する「理由」を関連付けることができます。この場合、このファイルで未使用のインポートを許可します。 ruff: ignore コメントは、新しい --add-ignore CLI フラグで自動的に追加できます。プレビューでは、これらの ruff 抑制コメントすべてが、コードではなくルール名をサポートします: ❯ echo 'import math' > try.py ❯ uvx ruff@latest check --preview --add-ignore try.py 1 ignore comment added. ❯ cat try.py import math # ruff: ignore[unused-import] これらのコメントの完全な仕様は、ドキュメントで見つけることができます。 修正が check および format --check 出力に表示されるようになりました Ruff は、診断をレンダリングする際に、リンターおよびフォーマッターの修正の差分を表示するようになりました。check および format のサブコマンドは、check --fix または format で適用される修正による変更を表示するための --diff フラグを長らくサポートしていましたが、これは通常の出力とは別であり、付随する説明的な診断を抑制していました。v0.16 では、利用可能な修正が、ヘルプのサブ診断の下にレンダリングされる、デフォルトの完全な出力形式の一部として表示されるようになりました。 format --check も同様です。以下の入力があるとします: # example.py if True: pass elif False: pass フォーマッターは次を生成します: format --check は、リンターでサポートされているすべての出力形式の選択もサポートするようになりました。これにより、機械可読な JSON 出力を取得したり、CI でアノテーションをレンダリングするために GitHub および GitLab で期待される形式を生成したりできます。サポートされている形式の完全なリストについては、CLI ヘルプまたはドキュメントを参照してください。 出力形式に関する最後の注意点として、v0.16 では JSON 出力に小さな破壊的変更があります。filename、location、end_location、fix.edits[].location、および fix.edits[].end_location フィールドは、デフォルトの空文字列および行 1、列 1 の代わりに null になる可能性があります。これは Ruff の既存の診断の非常に少ない数に影響しますが、内部の診断表現をより良く反映しており、将来のルールでより一般的になる可能性があります。 ルール安定化 以下のルールが安定化され、プレビューモードではなくなりました: airflow3-incompatible-function-signature (AIR303) missing-copyright-notice (CPY001) unnecessary-from-float (FURB164) sorted-min-max (FURB192) implicit-string-concatenation-in-collection-literal (ISC004) log-exception-outside-except-handler (LOG004) invalid-bool-return-type (PLE0304) too-many-positional-arguments (PLR0917) stop-iteration-return (PLR1708) none-not-at-end-of-union (RUF036) access-annotations-from-class-dict (RUF063) duplicate-entry-in-dunder-all (RUF068) その他の動作安定化 このリリースでは、以前はプレビューモードでのみ利用可能だった追加の動作も安定化しています: blind-except (BLE001) は、例外が critical、error、exception 以外のロギングメソッドを通じてログに記録される場合に抑制されるようになりました。 future-required-type-annotation (FA102) は、collections.abc などからの追加の PEP 585 互換 API をチェックするようになりました。 f-string-in-get-text-func-call (INT001)、format-in-get-text-func-call (INT002)、printf-in-get-text-func-call (INT003) は、builtins._ への代入など、gettext モジュールの使用の追加の一般的な方法をチェックするようになりました。 suspicious-url-open-usage (S310) は、より多くの偽陽性を回避するために、ローカル文字列リテラルのバインディングを解決するようになりました。 snmp-insecure-version (S508) および snmp-weak-cryptography (S509) は、新しいバージョンの PySNMP からの推奨 API をサポートするようになりました。 typing-text-str-alias (UP019) は、typing.Text に加えて typing_extensions.Text も認識するようになりました。 ありがとうございます! Ruff のプレビューモードに含まれる変更に関するフィードバックを提供してくださったすべての方々、および貢献者の皆様に感謝いたします。