2026年10月9日、Astralという会社が開発するuv 0.13.0とRuff 0.17.0が、そろって公開されました。Python 3.15の正式版が出たのと同じ日です。
uvはパッケージ管理ツール、Ruffはコードの問題を見つけるリンター兼フォーマッターです。どちらも、ここ数年で一気に使う人が増えたツールですね。
今回はどちらも、Python 3.15を新しい標準として扱う更新になっています。あわせて、知らないうちに動きが変わるところもあるので、順番に見ていきましょう。
まずは何が変わったのかを整理しよう¶
最初に、今回取り上げる変更を表にまとめます。内容は、それぞれの公式リポジトリにある変更履歴にもとづいています。
| ツール | 変更 | 影響を受けやすい人 |
|---|---|---|
| uv 0.13.0 | 指定がないときに入れるPythonが3.14から3.15へ | バージョンを固定していない人 |
| uv 0.13.0 | キャッシュの形式が変わり、再ダウンロードが起きることがある | CIで時間を気にしている人 |
| uv 0.13.0 | 制約ファイルの扱いが厳しくなった | requirementsファイルを細かく使い分けている人 |
| Ruff 0.17.0 | Pythonのバージョン指定がないときの既定が3.10から3.11へ | 設定ファイルを書いていない人 |
| Ruff 0.17.0 | 既定で有効なルールの入れ替え | 設定なしでruff checkしている人 |
| Ruff 0.17.0 | 旧式のruff-lspのサポートを終了 | 古いエディタ連携を使っている人 |
Python 3.15そのものについては、昨日の記事で実際に動かしながら紹介しました。【関連記事】Python 3.15が正式リリース
uv 0.13は、何も指定しないと3.15を入れる¶
uvの変更履歴によると、0.13.0でいちばん大きいのは、既定のPythonのバージョンが3.14から3.15に変わったことです。たとえば、バージョンを付けずにuv python installを実行すると、3.15が入るようになりました。
ただし、すでに条件に合うPythonが入っていれば、uvはそれを使い続けます。3.14が入っている環境でuv venvを実行しても、勝手に3.15に切り替わるわけではありません。
3.14のまま使いたいとき¶
まだ3.14を使い続けたい場合は、バージョンを明示します。変更履歴では、次のような方法が案内されています。
| やりたいこと | 書き方 |
|---|---|
| 仮想環境を3.14で作る | uv venv --python 3.14 |
| プロジェクトのPythonを3.14に固定する | uv python pin 3.14 |
uv python pinを実行すると、.python-versionというファイルにバージョンが記録されます。チームで同じバージョンを使うためにも、使うPythonのバージョンはファイルに残しておくのがおすすめです。
uvの基本的な使い方は、こちらで紹介しています。【関連記事】uvとは?Rust製の高速Pythonパッケージ管理ツール
uv 0.13のそのほかの変更¶
変更履歴では、ほとんどの利用者は何も変えずに上げられると説明されています。それでも、知っておきたい変更がいくつかあります。
キャッシュが作り直されることがある¶
0.13.0では、性能を上げるために多くのキャッシュの形式が変わりました。そのため、上げた直後は依存ライブラリのダウンロードやビルドがもう一度走ることがあります。
これは互換性を壊す変更ではありません。CIで初回だけ時間がかかっても、慌てなくて大丈夫です。
制約ファイルと仮想環境の細かな変更¶
requirementsファイルの中で-cを使って読み込む制約ファイルの扱いが、厳しくなりました。制約ファイルに書かれた--require-hashesが守られるようになり、編集可能インストールの-eはエラーになります。
また、Python 3.10以降で作る仮想環境には、distutils向けの古い補正ファイルが入らなくなりました。変更履歴によると、これによってPythonの起動にかかる手間が減ります。
Windows ARM64とビルドの安全性¶
ARM版のWindowsでは、エミュレーションで動くx86_64版ではなく、ARM64向けのPythonを優先して使うようになりました。CPython本体やGitHubのsetup-pythonと同じ方針に合わせた変更です。
また、uv build --clearで、ビルド元のプロジェクトを含むフォルダを出力先に指定すると、エラーで止まるようになりました。これまでは、出力先を片付ける際にプロジェクトそのものを消してしまうおそれがあったそうです。
Ruff 0.17は、Pythonの既定のバージョンが変わった¶
続いてRuffです。Ruffは、コードを調べるときに、どのバージョンのPythonを想定するかを決めて動きます。
変更履歴によると、設定ファイルでバージョンを指定していない場合の既定が、3.10から3.11に上がりました。3.10のサポートが10月に終わったことに合わせた変更だと考えられます。
バージョンは設定ファイルで伝えるのが確実¶
Ruffは、pyproject.tomlのrequires-pythonを読んで、想定するPythonのバージョンを決めます。実際に、3.15で加わったlazy importを使うファイルで試してみました。
lazy import json
def load(text):
return json.loads(text)
設定ファイルがない状態でRuff 0.17.0を実行すると、このように文法エラーとして報告されました。
invalid-syntax: Cannot use `lazy` import statement on Python 3.11 (syntax was added in Python 3.15)
同じフォルダのpyproject.tomlにrequires-python = ">=3.15"と書いて実行し直すと、All checks passed!と表示されました。Ruffに正しく伝えれば、新しい文法もきちんと受け入れてくれるわけです。
pyproject.tomlの書き方は、こちらで詳しく解説しています。【関連記事】pyproject.tomlとは?
Ruff 0.17は、既定で有効なルールも入れ替わった¶
もう1つの大きな変更が、何も設定しないときに有効になるルールの入れ替えです。変更履歴によると、flake8-datetimezに由来するいくつかのルールが、既定では無効になりました。
flake8-datetimezは、タイムゾーンを指定せずに日時を扱うコードを見つけるルールの集まりです。たとえばDTZ005は、datetime.now()をタイムゾーンなしで呼んでいる箇所を指摘します。
新旧のRuffで同じコードを調べてみた¶
実際に、次の短いコードを、設定なしのRuff 0.16.10と0.17.0で調べてみました。
from datetime import datetime
print(datetime.now())
0.16.10では、DTZ005として1件の指摘が出ました。
DTZ005 `datetime.datetime.now()` called without a `tz` argument
Found 1 error.
0.17.0では、同じコードでAll checks passed!と表示され、指摘は出ませんでした。設定なしで使っていると、上げただけで警告の数が変わるということです。
指摘が消えても、問題が消えたわけではない¶
ここで勘違いしたくないのは、タイムゾーンの扱いが不要になったわけではない点です。あくまで、既定で調べる範囲から外れただけです。
私は10年ほどエンジニアとして開発に関わってきましたが、サーバーの時刻とのずれで集計の日付が1日ずれる不具合には、何度も悩まされてきました。タイムゾーンを意識したい方は、設定でDTZのルールを明示的に有効にしておくと安心です。
タイムゾーンの正しい扱い方は、こちらで紹介しています。【関連記事】Pythonのzoneinfoとは?
日本語の変数名にも関係する変更¶
日本語でコードを書く方にとって、ちょっと嬉しい変更もあります。変更履歴によると、アンダースコアで始まる日本語などのUnicodeの名前も、ダミー変数として扱われるようになりました。
ダミー変数とは、受け取るけれど使わない値を入れておくための変数です。Pythonでは、_xのように名前をアンダースコアで始めると、使わない変数だと伝える習慣があります。
実際に、次のコードを新旧のRuffで調べてみました。
def main():
_x = 1
_次 = 2
return 0
0.16.10では、_xは見逃される一方で、_次だけがF841として指摘されました。
F841 Local variable `_次` is assigned to but never used
Found 1 error.
0.17.0では、同じコードでAll checks passed!となり、_次も_xと同じく使わない変数として正しく扱われるようになりました。英語の名前だけが特別扱いされていた状態が、解消されたわけです。
Ruff 0.17のそのほかの変更¶
変更履歴には、ほかにも利用者に関係する変更が並んでいます。代表的なものを見ておきましょう。
| 変更 | 中身 |
|---|---|
| 実行ファイルへのコード署名 | macOSとWindows向けの配布物に署名が付き、セキュリティ警告が出にくくなる |
| ruff-lspの削除 | VS Codeの拡張機能は常に組み込みの言語サーバーを使う |
| lazy import関連ルールの正式化 | TID254とTID255がプレビューから外れた |
| Unicode 17への対応 | 識別子の正規化などに新しいUnicodeのデータを使う |
ruff-lspは、0.9.5の時点ですでに非推奨になっていた古いエディタ連携の仕組みです。古い設定のまま使っている方は、移行ガイドに沿って切り替えておきましょう。
Ruffそのものについては、こちらで紹介しています。【関連記事】Ruffとは?
上げる前にやっておきたいこと¶
最後に、確認しておきたい点をまとめます。どちらのツールも、設定をファイルに書いておくほど、更新の影響を受けにくくなります。
| 順番 | 確認すること |
|---|---|
| 1 | .python-versionで、使うPythonのバージョンを固定しているか |
| 2 | pyproject.tomlにrequires-pythonを書いているか |
| 3 | Ruffで使いたいルールを、設定で明示しているか |
| 4 | CIでuvやRuffのバージョンを固定しているか |
以前、CIでリンターのバージョンを固定しておらず、ある日突然ビルドが赤くなったことがあります。ツールのバージョンも依存ライブラリと同じように固定すると、こうした予期せぬ失敗を防げます。
まとめ¶
2026年10月9日、uv 0.13.0とRuff 0.17.0が公開されました。uvは何も指定しないとPython 3.15を入れるようになり、Ruffは既定のPythonのバージョンと有効なルールが変わりました。
どちらも、設定をファイルに書いておけば、更新に振り回されずに済みます。この機会に、.python-versionとrequires-pythonを見直してみてください。
ここまでお読みいただきありがとうございました。