Python 3.15の最初のバグ修正版、3.15.1が2026年10月21日に公開されました。さらにその4日後の10月25日には、3.15.2が続けて公開されています。
3.15.0の正式版が出たのは10月9日なので、わずか2週間ほどで2つの修正版が届いたことになります。中身を数えると、2つあわせて300件を超える修正が入っていました。
正式版が出たばかりなのに、もう直すところがあるの?と思うかもしれません。今回は、何が直ったのかを、3.15.0と3.15.2で同じコードを動かしながら見ていきます。
まずはバグ修正版とは何か¶
最初に、バグ修正版という言葉を確認しておきましょう。Pythonのバージョン番号は、3.15.2のように3つの数字でできています。
| 位置 | 例 | 意味 |
|---|---|---|
| 1つ目 | 3 | 大きな世代。めったに変わらない |
| 2つ目 | 15 | 新しい機能が入るバージョン。毎年10月ごろに上がる |
| 3つ目 | 2 | バグ修正版。新しい機能は入らず、修正だけが入る |
3つ目の数字が上がる版では、新しい機能は加わりません。そのため、同じ3.15の中で上げても、書いたコードが動かなくなる心配はほとんどありません。
3.15.0の新機能については、こちらで実際に動かしながら紹介しました。【関連記事】Python 3.15が正式リリース
3.15.1と3.15.2で何が直ったのか¶
それでは、中身を見ていきましょう。CPythonの公式リポジトリには、版ごとの変更点をまとめたNEWSという記録があります。
この記録で、それぞれの版の修正を分野ごとに数えると、次のようになりました。
| 分野 | 3.15.1 | 3.15.2 |
|---|---|---|
| 標準ライブラリ | 129件 | 44件 |
| Python本体 | 47件 | 22件 |
| IDLE | 23件 | なし |
| C API | 11件 | 1件 |
| セキュリティ | 3件 | 3件 |
| そのほか | 29件 | 7件 |
| 合計 | 242件 | 77件 |
最初のバグ修正版は、正式版を多くの人が使い始めてから見つかった問題をまとめて直すので、件数が多くなりがちです。3.15.1の242件は、まさにその表れでしょう。
3.14系も同じ日に修正版が出た¶
同じ日には、ひとつ前の3.14系でも修正版が公開されました。CPythonのリポジトリのタグを確かめると、3.14.9が10月21日、3.14.10が10月25日に作られています。
3.14を使っている方も、あわせて最新版に上げておくと安心です。
セキュリティの修正¶
まずは、いちばん大事なセキュリティの修正から見ていきます。3.15.2のNEWSには、Securityの分野に3件が並んでいます。
| 対象 | 中身 |
|---|---|
| http.cookiejar | Versionが負の値のクッキーを、ドメインを確かめずに受け入れていた問題を修正 |
| tarfile | tar_filterが、展開先のフォルダそのものを指すリンクを拒否するように |
| ssl | 不正に使われるおそれのある、一部の中間認証局の鍵を使った証明書を拒否するように |
このうちtarfileとsslの2件には、CVEという、脆弱性を識別するための番号が付けられています。
sslの修正は、最後の守り¶
sslの修正について、NEWSには、これは特別な措置であり最後の守りだと説明されています。証明書を信頼しないようにするのは、本来はOSなどが持つ信頼の一覧の役目です。
その一覧の更新が、まだOSやコンテナのイメージに届いていない間も、Pythonの側で接続を止められるようにした、という位置づけです。対象は、eMudhraという認証局の、一部の中間認証局の鍵だと書かれています。
3.15.1のセキュリティの修正¶
3.15.1にも、Securityの分野に3件の修正があります。Pythonに同梱されているpipを26.2.2に上げたことや、XMLを読むためのライブラリlibexpatを2.9.0に更新したことなどです。
tarfileでの展開の危うさについては、setuptoolsの修正を取り上げた記事でも詳しく紹介しました。【関連記事】setuptools 84.1がアーカイブ展開の弱点を修正
3.15.0で入った不具合も直った¶
3.15.2のNEWSには、3.15.0で入ってしまった不具合の修正も含まれています。NEWSの中で、はっきりとregression、つまり以前は動いていたのに壊れた問題と書かれているものです。
それによると、複数のスレッドが、パッケージの中のモジュールを初めて読み込むときに、エラーになったり、お互いを待ったまま止まったりすることがありました。循環import、つまりモジュール同士がお互いを読み込み合う書き方をしていなくても起きていたそうです。
スレッドを使ったプログラムで、3.15.0にしてから読み込みのエラーが出るようになった方は、3.15.2で直っているかもしれません。
3.15.0と3.15.2で動かしてみた¶
ここからは、身近な標準ライブラリの修正を、実際に試してみます。uvを使って3.15.0と3.15.2を並べて入れ、同じコードを動かしました。
uvでのPythonの入れ方は、こちらで紹介しています。【関連記事】uvとは?Rust製の高速Pythonパッケージ管理ツール
zipfileの2つの修正¶
まずは、ZIPファイルを扱うzipfileです。NEWSには、閉じたZIPに対するmkdir()と、メモリ上のZIPに対するzipfile.Pathの表示について、修正が載っています。
import io
import zipfile
# 1. 閉じたZIPにフォルダを作ろうとする
zf = zipfile.ZipFile(io.BytesIO(), "w")
zf.close()
try:
zf.mkdir("photos")
except Exception as e:
print(type(e).__name__, e)
# 2. メモリ上のZIPの中のファイルを、文字列として表示する
buf = io.BytesIO()
with zipfile.ZipFile(buf, "w") as z:
z.writestr("a.txt", "x")
print(str(zipfile.Path(zipfile.ZipFile(buf), "a.txt")))
3.15.0と3.15.2で実行した結果です。3.15.0のエラーは、最後の行だけを載せています。
Python 3.15.0
AttributeError 'NoneType' object has no attribute 'seek'
TypeError: expected str, bytes or os.PathLike object, not NoneType
Python 3.15.2
ValueError Attempt to write to ZIP archive that was already closed
:zipfile:/a.txt
1つ目は、3.15.0では原因のわかりにくいAttributeErrorでした。3.15.2では、すでに閉じたZIPに書き込もうとしている、と原因をそのまま教えてくれるValueErrorになっています。
2つ目は、3.15.0ではファイル名がないためにTypeErrorで止まっていました。3.15.2では、メモリ上のZIPであることがわかる形で表示されるようになりました。
zipfileの基本的な使い方は、こちらで紹介しています。【関連記事】Pythonのzipfileとは?
失敗したbytearrayに、中途半端な中身が残らなくなった¶
もう1つ、少し珍しい例も試しました。NEWSによると、bytearrayの作り直しが、0から255の範囲にない数のせいで失敗したとき、初期化されていないメモリが残ることがあったそうです。
data = bytearray(b"hello")
try:
data.__init__([72, 105, 300])
except ValueError as e:
print("ValueError:", e)
print(len(data), data[:8])
実行した結果です。
Python 3.15.0
ValueError: byte must be in range(0, 256)
3 bytearray(b'Hil')
Python 3.15.2
ValueError: byte must be in range(0, 256)
0 bytearray(b'')
3.15.0では、失敗したのに長さが3のまま残り、3文字目には、書き込まれていないはずの値が入っていました。3.15.2では、失敗したあとは空になっています。
普段__init__を直接呼ぶことはまずありません。ただ、失敗したのにゴミが残るというのは見過ごせない問題で、こうした細かな直しが何百件も積み重なっているのがバグ修正版です。
sqlite3のBlobの、逆向きのスライス¶
データベースのsqlite3にも、たくさんの修正が入っています。NEWSによると、Blobと呼ばれる、バイト列をそのまま保存した値を逆向きのスライスで読むと、原因のわかりにくいエラーになっていました。
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE t (b BLOB)")
con.execute("INSERT INTO t VALUES (?)", (b"abcdef",))
blob = con.blobopen("t", "b", 1)
try:
print(blob[::-1])
except Exception as e:
print(type(e).__name__, e)
実行した結果です。
Python 3.15.0
ValueError size must be >= 0
Python 3.15.2
ValueError Blob doesn't support slices with a negative step
どちらもValueErrorですが、3.15.0では、大きさは0以上でなければならないという、何のことかわからない文面でした。3.15.2では、Blobは逆向きのスライスに対応していない、とはっきり書かれています。
上げる方法と、上げる前に確かめたいこと¶
最後に、3.15.2への上げ方と、確かめておきたいことを整理します。
| 使い方 | 上げ方の例 |
|---|---|
| uvを使っている | uv python install 3.15.2で入れ、仮想環境を作り直す |
| 公式のインストーラーを使っている | 公式サイトから3.15.2のインストーラーを入れ直す |
| Dockerを使っている | イメージのタグを3.15.2にして、作り直す |
今のPythonの版を確かめる¶
上げる前に、手元のPythonの版を確かめておきましょう。プログラムの中から確かめるなら、sys.version_infoが便利です。
import sys
print(sys.version_info[:3])
print(sys.version_info >= (3, 15, 2))
3.15.2で実行すると、(3, 15, 2)とTrueが表示されました。ターミナルでpython --versionと打っても確かめられます。
仮想環境は、作ったときのPythonを使い続けます。Python本体を上げたら、仮想環境も作り直すのを忘れないようにしましょう。
私は10年ほどエンジニアとして開発に関わってきましたが、正式版が出てすぐに本番の環境を上げ、最初のバグ修正版で直る不具合に当たって慌てたことがあります。それ以来、大事な環境は、x.y.1かx.y.2が出てから上げるようにしています。
Pythonのバージョンの上げ方そのものは、こちらで詳しく紹介しています。【関連記事】Pythonのバージョンを変更する方法
まとめ¶
Python 3.15.1が2026年10月21日に、3.15.2が10月25日に公開されました。2つあわせて300件を超える修正が入り、tarfileやsslなどのセキュリティの修正や、3.15.0で入ったスレッドと読み込みの不具合の修正も含まれています。
3.15を使い始めた方は、早めに3.15.2へ上げておきましょう。3.14を使っている方も、同じ日に出た3.14.10が最新です。
ここまでお読みいただきありがとうございました。