世界を動かす技術を、日本語で。

Ruff v0.16.0 – 重要な新機能の追加 – 59から413に増加したデフォルトルール

2026年7月26日原文(astral.sh)

概要

  • Ruff v0.16.0 がリリース
  • デフォルトで有効なルール数が大幅増加
  • Markdownコードブロックのフォーマット対応
  • 新しい抑制コメント機能の追加
  • 各種出力・動作の安定化と細かな破壊的変更

Ruff v0.16.0リリース概要

  • Ruff は超高速なPython用 リンター兼フォーマッター、Rust製
  • Black, Flake8, isort, pydocstyle, pyupgrade など多数ツールの置き換え可能
  • ほぼ全ユーザーが 大きな設定変更なし でv0.16へ移行可能
  • PyPI や任意のパッケージマネージャからインストール可能

デフォルトルールセットの強化

  • デフォルトで 413個のルール が有効化(前バージョンは59個)
  • 新しいルールには 重大なバグや構文エラー検出 を含む
  • flake8-bugbear (B)pyupgrade (UP)、独自の RUFカテゴリ のルールも含まれる
  • 従来のデフォルトルールに戻したい場合は設定で対応可能
    • [lint] select = ["E4", "E7", "E9", "F"]で旧ルールに戻すことが可能
  • 今後も ルール分類の見直し を予定

v0.16の新機能

  • Markdownファイル内のPythonコードブロック のフォーマット対応
    • python, py, python3, py3, pyi, pyconのinfo stringに対応
    • Quartoノートブック(.qmd)にも対応
    • フォーマット抑制はfmt: off/onコメントやHTMLコメントで制御可能
    • Markdown全体の除外はextend-excludeで設定可能

ruff: ignoreコメントによる抑制機能の強化

  • ruff: ignore コメントで単行または次の論理行の診断を抑制可能
    • import math # ruff: ignore[F401]のように使用
  • ruff: file-ignore でファイル全体の診断を抑制可能
    • 理由の記載も可能(例: # ruff: file-ignore[F401] Allow unused imports in this file
  • --add-ignore CLIフラグで自動挿入に対応
  • ルール名(例: unused-import)でも抑制可能

診断・修正内容の出力改善

  • checkformat --check コマンドで修正内容のdiffを標準出力に表示
  • JSON出力 など多様なフォーマットに対応
    • GitHub/GitLabのCIアノテーション用フォーマットもサポート
  • JSON出力の一部フィールドが nullを許容 するように変更(破壊的変更)

ルール・動作の安定化

  • 以下のルールが 正式安定化 (プレビュー解除)
    • AIR303, CPY001, FURB164, FURB192, ISC004, LOG004, PLE0304, PLR0917, PLR1708, RUF036, RUF063, RUF068
  • 追加の動作安定化
    • BLE001: loggingのcritical, error, exception以外で例外をロギングした場合は抑制
    • FA102: PEP 585互換APIもチェック対象に拡張
    • INT001〜003: gettextの多様な利用法に対応
    • S310: ローカルバインディング解決で誤検知減少
    • S508, S509: PySNMP新API対応
    • UP019: typing_extensions.Textも認識

コミュニティ・情報

  • フィードバック提供者・コントリビューターへの感謝
  • GitHub で詳細なチェンジログ公開
  • Ruff開発元 Astral についても紹介

参考

  • 公式ドキュメントの Default Rulesページ
  • 詳細な仕様・設定例は公式ドキュメント参照

Hackerたちの意見

これは素晴らしいニュースだね!エージェントコーディングが登場したから、強力なリンティングが今まで以上に重要になってる。もっと多くの言語でforbidigoが見られるといいな。

100%同意だよ、今プロジェクトをアップグレードしてるところ。でも、これには複雑な気持ちもあるんだ。自分でコードを書いていたときは、どのルールをスキップするかを直感で決めてたと思うんだよね。一方で、開発者たちがpylintをほとんどのルールを有効にして使ってるプロジェクトも見たけど、正直言ってコードは良くなってなかった。逆に、pylintを喜ばせるためにコードが読みにくくなるようなハックがたくさんあった。似たような経験として、コーディングエージェントが無害な問題を直そうとトークンをたくさん使ってるのを見たり、テストが通らないときにテストを無効にすることもあったりして、ちょっと顔を覆いたくなるよね。AIの結果には全体的な正確さについては信頼を置くようになったけど、コードの質に関する判断にはまだ信頼しきれない部分があるんだ。

ruff、ty、uvがアクティブに開発されてるのを見るのは嬉しいね。AstralがOpenAIに買収された後も続いてるのはすごい。

良いニュースだね。デフォルトで413ルールを有効にすることで、ほとんどのプロジェクトが設定をいじらなくても役立つリンティングが得られるのはいいことだ!

もしかしたら私だけかもしれないけど、「413 x 潜在的警告」で溢れかえるのはあまり役に立つとは思えないな :) グリーンフィールドにはいいけど、既存のプロジェクトにはあまり向いてないかも。最近は、エージェントを「/goal work through and address all lint warnings by fixing the code according to XYZ」で起動して数時間放置すれば、もう問題じゃなくなると思うけど…誤解しないでほしい、Ruffからの新しい詳細レベルは本当にありがたいし、良いことだと思うよ :)

GoにもRuffみたいなツールがあればいいのに!たくさんの言語が素晴らしいツールを手に入れてるけど、Goはツールがバラバラで、どれもRuffやOxc、Biome、PHPのMagoみたいに高品質って感じがしないんだよね。

断片化されたエコシステムってどういう意味かよくわからないな。Goには公式のフォーマットやリンティングがあって、言語自体が特定の書き方になるように意図的に制限されてるんだ。完全な初心者が書いてもね。PythonやTypeScriptと比べると、意見のある公式ツールがない「西部開拓時代」の言語だから、Ruff/Biomeが素晴らしいのも納得だよ。Goでは同じ高揚感は得られないと思う。

え、何言ってるの?Goは、いじめるようなIDEなしでも最高の言語ツールが揃ってると思うよ。golangci-lintはかなり包括的だし。他に何が足りないの?(正直、Goの配布自体がかなりカバーしてるけどね)

おお、そんなに前のことじゃないけど、全く逆の意見が多かったよね。Pythonコミュニティはツールに苦しんでて、みんなPythonにもgofmtがあればいいのにって思ってた。確かに、これはリンターであってフォーマッターじゃないけど、要するに最近のPythonエコシステムの進化には嬉しいよ。

それはそうだし、さらに良くなってるよ。Go Analysis Frameworkって呼ばれてるんだ(https://pkg.go.dev/golang.org/x/tools/go/analysis)。まだ新しいからあまり知られてないけど、go fixやgo vetの裏で動いてるものなんだ。Goチームは、モジュールの作者が自分のカスタム分析パスを簡単に記述できるようにするために取り組んでるみたい。自分の静的分析パスを定義するのがすごく簡単で、ASTや型、SSA情報などの役立つ情報にアクセスできるし、アナライザー間で情報を組み合わせることもできるよ。それをバイナリにコンパイルして、コマンドラインフラグを使ってgo fixに渡すだけで実行できるんだ。Goツールチェーン自体が複雑なキャッシングロジックを処理してくれるから、アナライザーが速く動くんだよ。Goチームが作ったものだから、徐々に君が求めてる統一された標準になるはず。だから、golangci-lintや他のツールも最終的にはこのフレームワークの下で統一されると思う。AIエージェントにGo Analysisアナライザーを書かせて、go fixで動かすように指示すれば簡単に試せるよ。俺のGoプロジェクトは、いろんなルールを決定的かつ自動的に強制するために、こういうのをたくさん蓄積する傾向があるんだ。

Golang-ciはしばらく前からあって、みんな使ってるよ。何を言ってるのかよくわからないな。

これらの「文法ナチ」ボットに対する人々の魅力には驚かされるよ。中には完全に恣意的な「ルール」を実装してるものもあれば、「良い」Pythonコードがどうあるべきかで意見が食い違うものもあるし。これが「悪い」コードだとしたら:important_numbers = { 'x': 3, 'y': 42, # 究極の質問への答え! 'z': 2 } これが「良い」コードの例:important_numbers = {"x": 3, "y": 42, "z": 2} # 究極の質問への答え! これって、書き手の意図を完全に無視してるよね。でも、今はその前にスペースが2つあるのに気づいた?それに、引用符もダブルになってるのは、なんかもっと正当だと思われてるからかな!すごい改善だね!私が扱ってるコードの実際の問題は、行の終わりのスペースやインポートのアルファベット順じゃなくて、10行のリスト内包表現が長すぎて解析できないことなんだ。これらのツールはそれをキャッチしない。私の職場ではpylint、flake8、black、ruffを使ってて、変更ごとに何百ものコミットがあった。そんなエネルギーはもっと他のところに使った方がいいと思う。

Hacker Newsで議論の続きを見る