Python 3.15 の新機能

編集者:

Hugo van Kemenade

この記事では、Python 3.14 と比較した Python 3.15 の新機能を説明します。 Python 3.15 は2026年10月9日にリリースされました。 詳細は 変更履歴 を参照してください。

参考

PEP 790 -- Python 3.15 のリリーススケジュール

概要 -- リリースハイライト

Python 3.15 は Python プログラミング言語の最新の安定版で、言語、実装、標準ライブラリにさまざまな変更が加わっています。 主な変更には、遅延インポート、組み込み型 frozendict と sentinel、デフォルトのエンコーディングの UTF-8 化、内包表記でのアンパック、フリースレッドビルド向けの安定 ABI があります。

ライブラリの変更には、高頻度の統計的サンプリングプロファイラー Tachyon を備えた新しい profiling パッケージ や、コマンドライン出力の カラー表示の拡充 があります。 これらに加え、通常どおり非推奨化や削除、使いやすさと正確性の改善も行われています。

この記事は、すべての新機能の完全な仕様を示すものではなく、概要を分かりやすく紹介するものです。 詳細は ライブラリリファレンス や 言語リファレンス などのドキュメントを参照してください。 変更の実装や設計の根拠を詳しく知るには、その新機能の PEP を参照してください。 ただし、PEP は通常、機能の実装が完了すると更新されなくなることに注意してください。

以前のバージョンからアップグレードする際の指針は、Porting to Python 3.15 を参照してください。


インタプリタの改善:

標準ライブラリーの顕著な改善

新しい型ヒントの機能:

C API の改善:

ビルドの変更:

リリースの変更:

新しい機能

PEP 810:明示的な遅延インポート

大規模な Python アプリケーションでは、起動に時間がかかることがよくあります。 大きな原因の一つがインポートシステムです。 モジュールをインポートするとき、Python はファイルを探し、ディスクから読み込み、バイトコードにコンパイルして、トップレベルのコードをすべて実行する必要があります。 依存関係が深いアプリケーションでは、その実行でインポートしたコードの大半を使わない場合でも、この処理に数秒かかることがあります。

開発者は、インポートを関数内に移したり、importlib で必要になった時点でモジュールをロードしたり、不要な依存関係を避けるようコードを再構成したりして対処してきました。 これらの方法は有効ですが、コードを読みにくく保守しにくいものにし、コード全体にインポート文を散在させ、一貫して適用するための注意を必要とします。

Python は、新しいソフトキーワード lazy を使った明示的な lazy インポートという、よりすっきりした解決方法を提供するようになりました。 インポートを遅延させると、インポートした名前を初めて使うまで、Python は実際のモジュールのロードを延期します。 これにより、すべてのインポートをファイルの先頭にまとめて宣言しながら、実際に使うモジュールについてだけロードのコストを支払えます。

lazy キーワードは import 文と from ... import 文の両方で使えます。 lazy import heavy_module と書いても、Python はすぐにはモジュールをロードせず、軽量なプロキシオブジェクトを作成します。 その名前に初めてアクセスしたときに、実際のモジュールのロードが透過的に行われます:

lazy import json
lazy from pathlib import Path

print("Starting up...")  # json と pathlib はまだ完全にはインポートされていない

data = json.loads('{"key": "value"}')  # ここで json が完全にインポートされる
p = Path(".")  # ここで pathlib が完全にインポートされる

この仕組みは、トップレベルで多くのモジュールをインポートするものの、1回の実行ではその一部しか使わないことがあるアプリケーションで特に有用です。 ロードを遅らせることで、コードの再構成や、コード全体に条件付きインポートを散在させることなく、起動時の待ち時間を短縮できます。

遅延インポートしたモジュールのロードが失敗した場合 (例えばモジュールが存在しない場合)、Python はインポート時ではなく、最初に使った時点で例外を送出します。 トレースバックには、名前にアクセスした場所と元のインポート文の両方が含まれるため、失敗の原因を調べてデバッグしやすくなります。

ソースコードを変更せずに全体で遅延ロードを有効にしたい場合のために、Python はコマンドラインオプション -X lazy_imports と環境変数 PYTHON_LAZY_IMPORTS を提供します。 どちらも二つの値を受け付けます。 all はすべてのインポートをデフォルトで遅延させ、normal (デフォルト) はソースコード内の lazy キーワードに従います。 sys.set_lazy_imports() と sys.get_lazy_imports() を使うと、実行時にこのモードを変更・照会できます。

より細かく制御するために、sys.set_lazy_imports_filter() は、特定のモジュールを遅延ロードするかどうかを判定する呼び出し可能オブジェクトを受け付けます。 フィルターは、インポートする側のモジュール名 (または None)、インポートされるモジュール名、fromlist (通常のインポートでは None) の三つの引数を受け取ります。 遅延インポートを許可するには True を、即時ロードを強制するには False を返してください。 これにより、自分のアプリケーションのモジュールだけを遅延させ、サードパーティーの依存モジュールはすぐにロードするといった使い方ができます:

import sys

def myapp_filter(importing, imported, fromlist):
    return imported.startswith("myapp.")
sys.set_lazy_imports_filter(myapp_filter)
sys.set_lazy_imports("all")

import myapp.slow_module  # 遅延 (フィルターに一致)
import json               # 即時 (フィルターに不一致)

遅延インポートをプログラムで検出する必要があるコード向けに、プロキシの型自体も types.LazyImportType として公開されています。

lazy キーワードを使える場所には制限があります。 遅延インポートはモジュールスコープでのみ許可され、関数、クラス本体、try/except/finally ブロックの中で lazy を使うと SyntaxError が発生します。 スターインポートと future インポートも遅延させられません (lazy from module import * と lazy from __future__ import ... はどちらも SyntaxError になります)。

lazy キーワードを直接使えないコード (例えば、3.15 より前の Python に対応しつつ、3.15 以降では遅延インポートを使いたい場合) では、完全修飾されたモジュール名の文字列を格納するコンテナとして __lazy_modules__ を定義できます。 これらのモジュールに対する通常の import 文は、lazy キーワードと同じ意味を持つ遅延インポートとして扱われます。

__lazy_modules__ = ["json", "pathlib"]

import json     # 遅延
import os       # 引き続き即時

(Pablo Galindo Salgado と Dino Viehland が gh-142349 で貢献しました。)

参考

完全な仕様と設計の根拠は PEP 810 を参照してください。

PEP 814:組み込み型 frozendict の追加

新しい イミュータブル な型 frozendict が builtins モジュールに追加されました。 作成後の変更はできません。 frozendict は dict のサブクラスではなく、object を直接継承します。 キーと値がすべてハッシュ可能であれば、frozendict も ハッシュ可能 です。 frozendict は挿入順序を保持しますが、比較では順序を考慮しません。

例えば:

>>> a = frozendict(x=1, y=2)
>>> a
frozendict({'x': 1, 'y': 2})
>>> a['z'] = 3
Traceback (most recent call last):
  File "<python-input-2>", line 1, in <module>
    a['z'] = 3
    ~^^^^^
TypeError: 'frozendict' object does not support item assignment
>>> b = frozendict(y=2, x=1)
>>> hash(a) == hash(b)
True
>>> a == b
True

frozendict を受け付けるように、標準ライブラリの copy、decimal、json、marshal、plistlib (シリアライズのみ)、pickle、pprint、xml.etree.ElementTree が更新されました。

eval() と exec() は globals に frozendict を、type() と str.maketrans() は dict に frozendict を受け付けます。

isinstance(arg, dict) で dict 型を調べているコードは、frozendict 型も受け付けるように isinstance(arg, (dict, frozendict)) に変更できます。 また、MappingProxyType などのほかのマッピング型も受け付けるには、isinstance(arg, collections.abc.Mapping) に変更できます。

(Victor Stinner と Donghee Na が gh-141510 で貢献しました。)

参考

完全な仕様と設計の根拠は PEP 814 を参照してください。

PEP 661:組み込み型 sentinel の追加

簡潔な表現を持つ一意なセンチネル値を作成するために、新しい sentinel 型が builtins モジュールに追加されました。 センチネルオブジェクトはコピーしても同一性を保ち、| 演算子を使った型式で利用でき、モジュール名と名前でインポートできる場合は pickle 化できます。

(Jelle Zijlstra が gh-148829 で貢献しました。PEP 661 は Tal Einat が執筆しました。)

参考

詳しくは PEP 661 を参照してください。

PEP 799:専用の profiling パッケージ

Python 組み込みのプロファイリングツールを一つの一貫した名前空間にまとめるため、新しい profiling モジュールが追加されました。 このモジュールには以下が含まれます:

  • profiling.tracing:決定論的な関数呼び出しのトレース (cProfile から移動)。

  • profiling.sampling:新しい統計的サンプリングプロファイラー (Tachyon)。

cProfile モジュールは後方互換性のために別名として残ります。 profile モジュールは非推奨となり、Python 3.17 で削除されます。

(Pablo Galindo と László Kiss Kollár が gh-138122 で貢献しました。)

参考

詳しくは PEP 799 を参照してください。

Tachyon:高頻度の統計的サンプリングプロファイラー

Tachyon プロファイラーのロゴ

新しい統計的サンプリングプロファイラー (Tachyon) が profiling.sampling として追加されました。 コードの変更やプロセスの再起動をせずに、実行中の Python プロセスのパフォーマンスを低いオーバーヘッドで分析できます。

すべての関数呼び出しを計測する決定論的プロファイラー (profiling.tracing など) とは異なり、サンプリングプロファイラーは実行中のプロセスから定期的にスタックトレースを取得します。 この方法は、実質的にオーバーヘッドを生じさせずに 最大1,000,000 Hz のサンプリングレートを達成します。 そのため、提供時点で Python 向けに利用できる最速のサンプリングプロファイラーであり、本番環境のパフォーマンス問題のデバッグに適しています。 従来のプロファイリング方法では実行への影響が大きすぎる本番システムで、パフォーマンスの問題を調べる際に特に有用です。

主な機能は以下のとおりです:

  • オーバーヘッドのないプロファイリング:実行中の Python プロセスのパフォーマンスに影響を与えずにアタッチできます。 アプリケーションの再起動や速度低下を許容できない本番環境でのデバッグに適しています。

  • コードの変更が不要:既存のアプリケーションを再起動せずにプロファイリングできます。 実行中のプロセスを PID で指定するだけで、データの収集を開始できます。

  • 柔軟な対象の指定方法:

    • PID で実行中のプロセスをプロファイリング (attach) -- すでに実行中のアプリケーションにアタッチします

    • スクリプトを直接実行してプロファイリング (run) -- 実行開始時点からプロファイリングします

    • モジュールを実行してプロファイリング (run -m) -- python -m module で実行するパッケージをプロファイリングします

    • 実行中のプロセスのスナップショットを一度だけ取得する (dump) — 各スレッドのスタックをトレースバック形式で表示します (--async-aware を指定した場合はすべての asyncio タスクが対象です)。 ハングしたプロセスの調査に役立ちます。

  • 複数のプロファイリングモード: パフォーマンス調査の目的に応じて測定対象を選べます。

    • 実経過時間 (--mode wall、デフォルト): I/O、ネットワーク待ち、ブロックする操作を含む実際の経過時間を測定します。 外部リソースを待っている時間も含め、プログラムがどこに時間を費やしているかを調べるために使います。

    • CPU 時間 (--mode cpu): I/O 待ちやブロックを除き、CPU が実際に実行している時間だけを測定します。 CPU 処理が原因のボトルネックを特定し、計算処理を最適化するために使います。

    • GIL の保持時間 (--mode gil): Python のグローバルインタープリタロックを保持している時間を測定します。 マルチスレッドアプリケーションで、どのスレッドが GIL の使用時間の大半を占めているかを調べるために使います。

    • 例外処理時間 (--mode exception): 処理中の例外があるスレッドからだけサンプルを取得します。 例外処理のオーバーヘッドを分析するために使います。

  • スレッドを考慮したプロファイリング: すべてのスレッド (-a) を対象にするか、メインスレッドだけを対象にするかを選べます。 マルチスレッドアプリケーションの動作を理解する上で重要な機能です。

  • 複数の出力形式: 作業に最も適した可視化形式を選べます。

    • --pstats: pstats と互換性のある詳細な表形式の統計です。 関数単体と呼び出し先を含めた累積のサンプル数により、関数単位の時間を表示します。 詳細な分析や既存の Python プロファイリングツールとの連携に適しています。

    • --collapsed: スタックごとに 1 行にまとめたスタックトレースを生成します。 この形式は Brendan Gregg の FlameGraph スクリプトや speedscope などの外部ツールでフレームグラフを作成するために設計されています。

    • --flamegraph: D3.js を使い、単体で動作する対話型の HTML フレームグラフを生成します。 ブラウザーで直接開いて、すぐに視覚的な分析を始められます。 フレームグラフは呼び出しの階層を表示し、幅で所要時間を表すため、ボトルネックを一目で見つけやすくなります。

    • --gecko: Firefox Profiler と互換性のある Gecko Profiler 形式を生成します。 出力を Firefox Profiler にアップロードすると、スタックチャート、マーカー、ネットワークアクティビティなどの機能を使って、タイムラインに基づく高度な分析を行えます。

    • --heatmap: 行単位のサンプル数を示す対話型の HTML ヒートマップを生成します。 ファイルごとのヒートマップを含むディレクトリを作成し、ソースコードのどこに時間を費やしているかを正確に示します。

  • 対話型のライブモード: top に似たインターフェースを持つリアルタイムの TUI プロファイラーです (--live)。 対話的な並べ替えやフィルタリングを使い、実行中のアプリケーションのパフォーマンスを監視できます。

  • 非同期処理を考慮したプロファイリング: タスクごとにスタックを再構成し、async/await コードをプロファイリングします (--async-aware)。 どのコルーチンが時間を消費しているかを確認できます。 実行中のタスクだけを表示するか、待機中も含むすべてのタスクを表示するかを選べます。

  • オペコード単位のプロファイリング: バイトコードのオペコード情報を収集し、命令単位でプロファイリングします (--opcodes)。 適応型インタープリタによる特殊化も含め、どのバイトコード命令が実行されているかを表示します。

利用可能なすべての出力形式、プロファイリングモード、設定オプションを含む完全なドキュメントは profiling.sampling を参照してください。

(Pablo Galindo と László Kiss Kollár が gh-135953 and gh-138122 で貢献しました。)

PEP 831: フレームポインターをデフォルトで有効化

フレームポインターをサポートするプラットフォームでは、CPython のビルド時にデフォルトでフレームポインターを有効にするようになりました。 コンパイラーフラグ -fno-omit-frame-pointer と -mno-omit-leaf-frame-pointer を使用し、システムプロファイラー、デバッガー、クラッシュ解析ツール、eBPF ベースの観測ツールがネイティブスタックをより高速かつ確実に巻き戻せるようにします。

これらのフラグは sysconfig を通じて公開されるため、Python のビルド設定を利用するツールでビルドした拡張モジュールも、デフォルトでフレームポインターの設定を引き継ぎます。 この伝播は意図したものです。 Python とネイティブコードが混在するプロファイリングでは、インタープリタ、拡張モジュール、埋め込みアプリケーション、ネイティブライブラリを通じて、フレームポインターの連鎖が途切れないことが必要です。

重要

サードパーティーのビルドバックエンドやネイティブのビルドシステムは、Python の sysconfig の値を利用する際にこれらのフラグを保持するべきです。 Python のコンパイラーフラグを引き継がずに C、C++、Rust などのネイティブコードをコンパイルするビルドシステムでは、同等のフレームポインターフラグを独自に有効にするべきです。 フレームポインターなしでビルドされたネイティブコンポーネントが一つあるだけで、Python プロセス全体のスタックの巻き戻しができなくなることがあります。

(Pablo Galindo Salgado と Savannah Ostrowski が gh-149201; PEP 831 written by Pablo Galindo Salgado, Ken Jin, Savannah Ostrowski, and Diego Russo で貢献しました。)

参考

詳しくは PEP 831 を参照してください。

PEP 798: 内包表記でのアンパック

リスト、集合、辞書の内包表記とジェネレーター式で、* と ** によるアンパックが使えるようになりました。 PEP 448 のアンパック構文を内包表記に拡張し、任意の数のイテラブルや辞書を一つの平坦な構造にまとめる新しい構文を提供します。 この新しい構文は、入れ子の内包表記、itertools.chain()、itertools.chain.from_iterable() の代わりに使えます。 例えば次のように書けます。

>>> lists = [[1, 2], [3, 4], [5]]
>>> [*L for L in lists]  # 次の式と等価: [x for L in lists for x in L]
[1, 2, 3, 4, 5]

>>> sets = [{1, 2}, {2, 3}, {3, 4}]
>>> {*s for s in sets}  # 次の式と等価: {x for s in sets for x in s}
{1, 2, 3, 4}

>>> dicts = [{'a': 1}, {'b': 2}, {'a': 3}]
>>> {**d for d in dicts}  # 次の式と等価: {k: v for d in dicts for k,v in d.items()}
{'a': 3, 'b': 2}

ジェネレーター式でも同様にアンパックを使い、複数のイテラブルから値を yield できます。

>>> gen = (*L for L in lists)  # 次の式と等価: (x for L in lists for x in L)
>>> list(gen)
[1, 2, 3, 4, 5]

この変更は非同期ジェネレーター式にも適用されます。 例えば (*a async for a in agen()) は (x async for a in agen() for x in a) と等価です。

(Adam Hartz が gh-143055 で貢献しました。)

参考

詳しくは PEP 798 を参照してください。

PEP 829: パッケージの起動設定ファイル

-S が指定されていないときに site モジュールが読み込む .pth ファイル には、sys.path を拡張する行を含められます。 また、import (直後にスペースまたはタブが続く) で始まる行では任意のコードを実行できます。 後者の機能には、Python の起動時に実行される内容を正確に把握することが難しいという問題があります。

起動前に実行されるコードを監査しやすくするための一歩として、Python 3.15 は .start ファイル を導入します。 このファイルには pkg.mod:callable という形式でエントリーポイントを指定します。 pkg.mod は指定した呼び出し可能オブジェクトへのインポートパスです。 Python の起動時に、この呼び出し可能オブジェクトを見つけて引数なしで呼び出します。

.pth ファイルの import 行は、警告を出さずに非推奨となりました。 対応する .start ファイルが見つかると、.pth ファイルの import 行は無視されます。 .pth ファイル内の sys.path を拡張する行に変更はありません。

site モジュールは、複数の site ディレクトリの起動処理をまとめて行う site.StartupState も提供します。 これにより、起動コードを実行する前にすべての静的なパス拡張が適用されます。 通常のインタープリタの起動時には、site.main() がこのクラスのインスタンスを暗黙に使い、すべての起動設定ファイルをまとめて処理します。 同じようにまとめて処理する必要がある呼び出し側は、StartupState を直接作成し、addsitedir()、addusersitepackages()、addsitepackages() を呼び出した後、最後に process() を一度呼び出せます。

(Barry Warsaw が gh-148641 and gh-150228 で貢献しました。)

PEP 803: フリースレッドビルド用の安定 ABI

安定 ABI を対象とする C 拡張を、新しい フリースレッドビルド用の安定 ABI (abi3t とも呼ばれます) 向けにコンパイルできるようになりました。 これにより CPython の フリースレッドビルド と互換性を持たせられます。 通常はソースコードに相応の変更が必要です。 具体的には次の変更を行います。

  • インスタンスの構造体に PyObject を含める代わりに、負の basicsize や PyObject_GetTypeData() など、PEP 697 (Python 3.12) で導入された API に切り替える。

  • PyInit_ 関数から、この目的のために PEP 793 で導入された新しいエクスポートフック PyModExport_* に切り替え、PEP 820 で導入された新しい PySlot 構造体を使う。

安定 ABI は CPython が提供するすべての機能を利用できるわけではありません。 abi3t に切り替えられない拡張は、引き続き既存の安定 ABI (abi3) とフリースレッド用のバージョン固有の ABI (cp315t) 向けに別々にビルドするべきです。

フリースレッドビルド用の安定 ABI は通常、ビルドツールで選択するべきです。 abi3t をサポートするツールには meson-python、scikit-build-core、Maturin があります。 abi3t ビルドに関する各ツールのドキュメントへのリンクは ビルドの設定 を参照してください。 ビルドツールが abi3t をサポートしていない場合は、cp315t 向けに別途コンパイルしてください。 ビルドツールを使わない場合や、そのようなツールを作成する場合は、Stable ABI 向けのコンパイル で説明するようにマクロ Py_TARGET_ABI3T を設定して abi3t を選択できます。

abi3t に切り替えるための実践的な 移行ガイド が用意されています。 コミュニティーが保守する Python Free-Threading Guide には、abi3t wheel のビルドとテストの例があります。

参考

詳しくは PEP 803 を参照してください。

PEP 788: インタープリタの終了処理から C API を保護

C API では インタープリタの終了処理 が多くの拡張で問題になることがあります。 終了処理中にスレッド状態を アタッチ するとスレッドが永久に停止し、デッドロックやその他の予期しない問題につながるためです。 また、従来はインタープリタを使う前にその生存を安全に確認することができませんでした。 あるスレッドがインタープリタにアタッチしようとしている間に別のスレッドがそのインタープリタを削除すると、クラッシュにつながっていました。

これらの問題を回避するため、次の新しい API 群が追加されました。

  • インタープリタガード は、インタープリタの終了処理を防ぎます。

  • インタープリタビュー は、並行して終了処理や削除が行われる可能性があるインタープリタに、スレッドセーフなアクセスを提供します。

  • スレッド状態を自動でアタッチおよびデタッチする 新しい API には、終了処理に対する保護が組み込まれています。

さらに、PyGILState 系の API (特に PyGILState_Ensure() と PyGILState_Release()) が ソフト非推奨 になりました。 削除する予定は なく、既存のコードは引き続き動作しますが、今後の Python のバージョンで新しい PyGILState API が追加されることはありません。

(Peter Bierma が gh-149101 で貢献しました。)

参考

詳しくは PEP 788 を参照してください。

エラーメッセージの改善

  • オブジェクトに存在しない属性にアクセスした際、そのメンバーの一つを通じて似た属性を利用できる場合、インタープリタが AttributeError 例外でより役立つ候補を提示するようになりました。

    例えば、オブジェクトのある属性が、求めている名前を持つ属性を公開している場合、エラーメッセージはその内側の属性を通じたアクセスを提案します。

    from dataclasses import dataclass
    from math import pi
    
    @dataclass
    class Circle:
       radius: float
    
       @property
       def area(self) -> float:
          return pi * self.radius**2
    
    class Container:
       def __init__(self, inner: Circle) -> None:
          self.inner = inner
    
    circle = Circle(radius=4.0)
    container = Container(circle)
    print(container.area)
    

    このコードを実行すると、より明確な候補が表示されるようになりました。

    Traceback (most recent call last):
      File "example.py", line 18, in <module>
        print(container.area)
              ^^^^^^^^^^^^^^
    AttributeError: 'Container' object has no attribute 'area'. Did you mean '.inner.area' instead of '.area'?
    
  • 組み込み型の AttributeError で、レーベンシュタイン距離が近い候補が見つからない場合、他の言語 (JavaScript、Java、Ruby、C#) でよく使われるメソッド名の固定の表を調べ、対応する Python のメソッドを提示するようになりました。

    >>> [1, 2, 3].push(4)
    Traceback (most recent call last):
    ...
    AttributeError: 'list' object has no attribute 'push'. Did you mean '.append'?
    
    >>> 'hello'.toUpperCase()
    Traceback (most recent call last):
    ...
    AttributeError: 'str' object has no attribute 'toUpperCase'. Did you mean '.upper'?
    

    Python で対応するものがメソッドではなく言語構文の場合は、その構文を直接説明するヒントを表示します。

    >>> {}.put("a", 1)
    Traceback (most recent call last):
    ...
    AttributeError: 'dict' object has no attribute 'put'. Use d[k] = v.
    

    イミュータブルな型に対してミュータブルな型のメソッドが呼び出されると、対応するミュータブルな型をヒントとして提示します。

    >>> (1, 2, 3).append(4)
    Traceback (most recent call last):
    ...
    AttributeError: 'tuple' object has no attribute 'append'. Did you mean to use a 'list' object?
    

    これらのヒントは組み込み型のサブクラスでも機能します。

    (Matt Van Horn が gh-146406 で貢献しました。)

  • delattr() が属性が存在しないために失敗した場合、インタープリタが候補の提示を試みるようになりました。 既存の属性によく似た属性名が使われると、エラーメッセージで正しい属性名を提示します。 例えば次のようになります。

    >>> class A:
    ...     pass
    >>> a = A()
    >>> a.abcde = 1
    >>> del a.abcdf
    Traceback (most recent call last):
    ...
    AttributeError: 'A' object has no attribute 'abcdf'. Did you mean: 'abcde'?
    

    (Nikita Sobolev と Pranjal Prajapati が gh-136588 で貢献しました。)

  • 「引数」という用語を誤って使っていたいくつかのエラーメッセージを訂正しました。 (Stan Ulbrych による貢献。gh-133382。)

その他の言語の変更

  • Python はシステム環境によらず、UTF-8 をデフォルトのエンコーディングとして使うようになりました。 つまり、open('flying-circus.txt') など、エンコーディングを明示しない I/O 操作は UTF-8 を使います。 UTF-8 は広くサポートされている Unicode の文字エンコーディングであり、インターネット上のほぼすべてのウェブページ、多くの一般的なファイル形式、プログラミング言語などで、テキストを表現するための 事実上の 標準となっています。

    これは encoding 引数が指定されていない場合にだけ適用されます。 Python のバージョン間で最大限の互換性を保つには、常に encoding 引数を明示してください。 任意で有効にできるエンコーディングの警告 を使うと、この変更の影響を受ける可能性があるコードを特定できます。 特別な引数 encoding='locale' は現在のロケールのエンコーディングを使い、Python 3.10 以降でサポートされています。

    以前の動作を維持するには、環境変数 PYTHONUTF8=0 またはコマンドラインオプション -X utf8=0 で Python の UTF-8 モードを無効にできます。

    (Adam Turner が gh-133711; PEP 686 written by Inada Naoki で貢献しました。)

    参考

    詳しくは PEP 686 を参照してください。

  • インタープリタのヘルプ (python --help など) が色付きになりました。 環境変数 で制御できます。 (Hugo van Kemenade による貢献。gh-148766。)

  • 送出できない例外がデフォルトで色付きで強調表示されるようになりました。 環境変数 で制御できます。 (Peter Bierma による貢献。gh-134170。)

  • argparse、ast、calendar、difflib、http.server、pickletools、PyREPL のタブ補完、python --help、sqlite3、timeit、tokenize、送出できない例外、および stdlib (ast、compileall、doctest、gzip、inspect、json.tool、pdb、profiling.sampling、random、regrtest、sqlite3、timeit、tokenize、trace、unittest、uuid、zipapp、zipfile) の CLI ヘルプで、色の使用を拡大しました。

  • ImportError と ModuleNotFoundError の __repr__() が、生成時にキーワード引数として与えられた "name" と "path" を、それぞれ name=<name> と path=<path> として表示するようになりました。 (Serhiy Storchaka, Oleg Iarygin, と Yoav Nir による貢献。gh-74185。)

  • __dict__ と __weakref__ のデスクリプタが、インタープリタごとに一つのデスクリプタインスタンスを使い、必要とするすべての型で共有するようになりました。 これによりクラスの作成が高速化し、循環参照の回避にも役立ちます。 (Petr Viktorin による貢献。gh-135228。)

  • -W オプションと PYTHONWARNINGS 環境変数で、対応するフィールドをスラッシュ (/) で囲むと、警告メッセージやモジュール名との照合にリテラル文字列ではなく正規表現を指定できるようになりました。 (Serhiy Storchaka による貢献。gh-134716。)

  • タイムスタンプやタイムアウトの引数を取る関数が、整数と浮動小数点数だけでなく、任意の実数 (Decimal や Fraction など) を受け付けるようになりました。 ただし、精度が向上するわけではありません。 (Serhiy Storchaka による貢献。gh-67795。)

  • bytearray からコピーせずにバイト列を取り出す bytearray.take_bytes(n=None, /) を追加しました。 これにより、データのバッファリング、ネットワークプロトコルの解析、エンコード、デコード、圧縮など、ミュータブルなバイト列のバッファーを操作した後に bytes を返す必要があるコードを最適化できます。 take_bytes() で最適化できる一般的なコードパターンを以下に示します。

    最適化のためのリファクタリング例

    説明

    古い(Old)

    変更後

    bytearray を操作した後に bytes を返す

    def read() -> bytes:
        buffer = bytearray(1024)
        ...
        return bytes(buffer)
    
    def read() -> bytes:
        buffer = bytearray(1024)
        ...
        return buffer.take_bytes()
    

    バイト列を取り出してバッファーを空にする

    buffer = bytearray(1024)
    ...
    data = bytes(buffer)
    buffer.clear()
    
    buffer = bytearray(1024)
    ...
    data = buffer.take_bytes()
    

    指定した区切りでバッファーを分割する

    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    data = bytes(buffer[:n + 1])
    del buffer[:n + 1]
    assert data == b'abc\n'
    assert buffer == bytearray(b'def')
    
    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    data = buffer.take_bytes(n + 1)
    

    指定した区切りでバッファーを分割し、区切り以降を破棄する

    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    data = bytes(buffer[:n])
    buffer.clear()
    assert data == b'abc'
    assert len(buffer) == 0
    
    buffer = bytearray(b'abc\ndef')
    n = buffer.find(b'\n')
    buffer.resize(n)
    data = buffer.take_bytes()
    

    (Cody Maloney が gh-139871 で貢献しました。)

  • compile()、ast.parse()、symtable.symtable()、importlib.abc.InspectLoader.source_to_code() など、Python コードのコンパイルや解析に関わる多くの関数に、モジュール名を渡せるようになりました。 これは、モジュール名に基づいて構文警告を曖昧さなく フィルタリング するために必要です。 (Serhiy Storchaka による貢献。gh-135801。)

  • どのクラスでも __dict__ と __weakref__ の __slots__ を定義できるようになりました。 (Serhiy Storchaka による貢献。gh-41779。)

  • tuple の派生クラス (collections.namedtuple() で作成したクラスも含みます) で、任意の __slots__ を定義できるようになりました。 (Serhiy Storchaka による貢献。gh-41779。)

  • slice 型が添字付けをサポートし、generic type になりました。 (James Hilton-Balfe による貢献。gh-128335。)

  • memoryview クラスが C の float complex 型と double complex 型をサポートしました。 それぞれ書式文字 'Zf' と 'Zd' に対応します。 (Victor Stinner による貢献。gh-146151 と gh-148675。)

  • bytes.replace() の count 引数をキーワードで指定できるようになりました。 (Stan Ulbrych による貢献。gh-147856。)

  • match のリテラルパターンで、従来からサポートされていた単項マイナスと同様に、単項プラスも使えるようになりました。 (Bartosz Sławecki による貢献。gh-145239。)

  • インポートシステムがモジュールごとのロックを階層順に (サブモジュールより先に親パッケージのロックを) 取得するようになりました。 これにより、pkg/sub/__init__.py が pkg.sub.mod をインポートする場合に、pkg.sub をインポートするスレッドと pkg.sub.mod をインポートする別のスレッドが互いをブロックし得る、長年のデッドロックの問題を修正しました。 (Gregory P. Smith による貢献。gh-83065。)

  • .so 接尾辞を使う安定 ABI 拡張のファイル名に、foo.abi3-x86-64-linux-gnu.so のように multiarch タプルを含められるようになりました。 これにより、通常の動的拡張と同様に、複数のアーキテクチャー向けの安定 ABI 拡張を互いに衝突することなく同じディレクトリにインストールできます。 (Stefano Rivera による貢献。gh-122931。)

  • バージョン 3.13 から非推奨だったモジュールの __cached__ 属性を、インポートシステムと標準ライブラリが設定も参照もしなくなりました。 代わりに __spec__.cached を使ってください。 (Brett Cannon による貢献。gh-97879。)

    __loader__ 属性と __package__ 属性も非推奨であり、削除が予定されていることに注意してください。

デフォルトの対話型シェル

  • fancycompleter を基に、タブ補完の候補をオブジェクトの種類ごとに色分けするようになりました。 PYTHON_BASIC_COMPLETER を設定すると rlcompleter に戻せます。 色は 環境変数 でも制御できます。 (Antonio Cuni と Pablo Galindo による貢献。gh-130472。)

  • タブ補完が from ... import 文でモジュールの属性を候補として提示するようになりました。 属性を提示できるのはモジュールのインポート後だけなので、stdlib のモジュールは自動的にインポートします。 それ以外のモジュールでは、Tab を 2 回目に押したときに補完機能がインポートを提案します。 (Loïc Simon と Pablo Galindo による貢献。gh-140870。)

新しいモジュール

math.integer

このモジュールは整数の引数に対する数学関数を提供します (PEP 791)。 (Serhiy Storchaka による貢献。gh-81313。)

改良されたモジュール

argparse

  • BooleanOptionalAction アクションが、単一のダッシュで始まる長いオプションと、別の接頭辞文字をサポートしました。 (Serhiy Storchaka による貢献。gh-138525。)

  • argparse.ArgumentParser の suggest_on_error パラメーターのデフォルトを True に変更しました。 これにより、入力を間違えた引数に対する候補の提示がデフォルトで有効になります。 (Jakob Schluse による貢献。gh-140450。)

  • ArgumentParser の description と epilog のテキストでバッククォートによるマークアップをサポートし、色付き出力が有効な場合にインラインコードを強調表示するようになりました。 (Savannah Ostrowski による貢献。gh-142390。)

  • バッククォートによるマークアップを引数の help テキストにも拡張し、ダブルバッククォート (RST のインラインリテラル形式) もサポートしました。 (Hugo van Kemenade による貢献。gh-149375。)

array

  • C の float complex 型と double complex 型をサポートしました。 それぞれ書式文字 'Zf' と 'Zd' に対応します。 (Victor Stinner による貢献。gh-146151 と gh-148675。)

  • 半精度浮動小数点数 (16 ビットの IEEE 754 バイナリ交換形式) をサポートしました。 書式文字は 'e' です。 (Sergey B Kirpichev による貢献。gh-146238。)

  • 1 文字より長い型コード (Zf と Zd) をサポートするため、array.typecodes の型を str から tuple に変更しました。 (Victor Stinner による貢献。gh-148675。)

ast

  • dump() に color パラメーターを追加しました。 True の場合、返される文字列に ANSI エスケープシーケンスによる構文強調表示を施します。 False (デフォルト) の場合、色付き出力は常に無効です。 (Stan Ulbrych による貢献。gh-148981。)

  • コマンドライン 出力がデフォルトで構文強調表示されるようになりました。 これは 環境変数で制御できます。 (Stan Ulbrych による貢献。gh-148981。)

asyncio

  • TaskGroup.cancel を追加しました。 例えば、タスクの目的が達成された場合や、処理が不要になった場合に、タスクグループを早期に終了できます。 従来は、独自の例外を送出する追加のタスクを作り、タスクグループを抜ける際にその例外を抑制するといった、直感的でない定型処理が必要でした。 (John Belmonte による貢献。gh-127214。)

base64

binascii

calendar

  • calendar の コマンドライン のテキスト出力で、色の使用を拡大しました。 環境変数 で制御できます。 (Hugo van Kemenade による貢献。gh-148352。)

  • calendar の コマンドライン の HTML 出力で、python -m calendar -t html 2009 06 のように年月を指定できるようになりました。 (Pål Grønås Drange による貢献。gh-140212。)

  • calendar.HTMLCalendar クラスが生成するカレンダーページがダークモードをサポートし、アクセシビリティ向上のため HTML5 標準に移行しました。 (Jiahao Li と Hugo van Kemenade による貢献。gh-137634。)

collections

  • Counter オブジェクト間の対称差を計算する collections.Counter.__xor__() と collections.Counter.__ixor__() を追加しました。 (Raymond Hettinger による貢献。gh-138682。)

concurrent.futures

  • concurrent.futures.ProcessPoolExecutor の子プロセスが突然終了した場合のエラー報告を改善しました。 トレースバックに終了したプロセスの PID と終了コードが表示されるようになりました。 (Jonathan Berg による貢献。gh-139486。)

contextlib

  • with 文および async with 文との一貫性のため、ExitStack と contextlib.AsyncExitStack で、__enter__()、__exit__()、__aenter__()、__aexit__() として任意のデスクリプタをサポートしました。 (Serhiy Storchaka による貢献。gh-144386。)

  • ContextDecorator と AsyncContextDecorator (したがってデコレーターとして使う contextmanager() と asynccontextmanager() も) が、ジェネレーター関数、コルーチン関数、非同期ジェネレーター関数を検出し、反復処理や await の間もコンテキストマネージャーを開いたままにするようになりました。 従来は、ジェネレーターオブジェクトやコルーチンオブジェクトが作成されるとすぐにコンテキストマネージャーを終了していました。 (Alex Grönholm & Gregory P. Smith による貢献。gh-125862。)

ctypes

dataclasses

  • 生成される __init__ メソッドのアノテーションに、内部の型名が含まれなくなりました。 (David Ellis による貢献。gh-137530。)

dbm

  • 削除済みのエントリーが以前占有していた未使用の空き領域を回収する、新しい reorganize() メソッドを dbm.dumb と dbm.sqlite3 に追加しました。 (Andrea Oliveri による貢献。gh-134004。)

difflib

  • difflib.unified_diff() にオプションの color パラメーターを導入し、git diff のような色付き出力を可能にしました。 環境変数 で制御できます。 (Douglas Thor による貢献。gh-133725。)

  • difflib.HtmlDiff クラスが生成する HTML 差分ページのスタイルを改善し、出力を HTML5 標準に移行しました。 (Jiahao Li による貢献。gh-134580。)

email

  • アドレスヘッダーに非 ASCII のメールアドレス (メールボックス) があるために EmailMessage を正確に直列化できない場合、メールのジェネレーターがエラーを送出するようになりました。 メールアドレスの国際化 (EAI) をサポートするための選択肢は EmailPolicy.utf8 で説明しています。 (R David Murray と Mike Edmunds による貢献。gh-122540。)

faulthandler

functools

  • singledispatchmethod() が descriptor ではない呼び出し可能オブジェクトをサポートしました。 (Serhiy Storchaka による貢献。gh-140873。)

  • singledispatchmethod() が通常のメソッドをラップしていて、クラスの属性として呼び出された場合、2 番目の引数に基づいてディスパッチするようになりました。 (Bartosz Sławecki による貢献。gh-143535。)

gc

  • Python 3.14.0–3.14.4 は新しいインクリメンタルガベージコレクターを搭載していました。 しかし、本番環境で深刻なメモリ逼迫が生じたという 報告 が複数あったため、3.13 の世代別 GC に戻しました。 Python 3.14.5 以降と Python 3.15 は、この GC を使います。 (Sergey Miryanov による貢献。gh-148726。)

hashlib

  • 常に 利用可能 であることが保証されているハッシュ関数について、バックエンドの実装がなく実行時には動作しない場合でも、hashlib の属性として存在するようにしました。 例えば、OpenSSL が利用できず Python が MD5 サポートなしでビルドされている場合でも、hashlib.md5 が AttributeError を送出しなくなります。 (Bénédikt Tran による貢献。gh-136929。)

http.client

  • HTTPConnection と HTTPSConnection のコンストラクターに、新しいキーワード専用パラメーター max_response_headers を追加しました。 このパラメーターは、許容するレスポンスヘッダーの数のデフォルトの上限を上書きします。 (Alexander Enrique Urieles Nieto による貢献。gh-131724。)

http.server

  • コマンドラインインターフェース でも使われる BaseHTTPRequestHandler のログ出力が、デフォルトで色付きになりました。 環境変数 で制御できます。 (Hugo van Kemenade による貢献。gh-146292。)

  • default_content_type とコマンドラインオプション --content-type を追加し、不明な拡張子を持つファイルのデフォルトの Content-Type ヘッダーをカスタマイズできるようになりました。 (John Comeau と Hugo van Kemenade による貢献。gh-113471。)

  • SimpleHTTPRequestHandler に新しいキーワード引数 extra_response_headers を追加し、HTTP レスポンスに独自のヘッダーを設定できるようになりました。 (Anton I. Sipos による貢献。gh-135057。)

  • python -m http.server コマンドラインインターフェースに -H/--header オプションを追加し、HTTP レスポンスに独自のヘッダーを設定できるようになりました。 (Anton I. Sipos による貢献。gh-135057。)

importlib.metadata

  • 従来は、メタデータファイルを含まない配布物のメタデータディレクトリにアクセスすると、metadata() と Distribution.metadata は、ファイルが存在していて中身が空であるかのように空の PackageMetadata オブジェクトを返していました。 今後は MetadataNotFound 例外を送出します。 背景と理由は importlib_metadata#493 を、互換性に関する懸念への説明は gh-143387 を参照してください。 (Jason R. Coombs による貢献。)

inspect

  • getdoc() にパラメーター inherit_class_doc と fallback_to_class_doc を追加しました。 (Serhiy Storchaka による貢献。gh-132686。)

json

  • load() 関数と loads() 関数に array_hook パラメーターを追加しました。 JSON の配列リテラルに対するコールバックを指定し、デコード結果のオブジェクトに含まれる Python のリストをカスタマイズできます。 object_pairs_hook パラメーターに frozendict を、array_hook に tuple を組み合わせて渡すと、JSON データを表す、深く入れ子になったイミュータブルな Python の構造が得られます。 (Joao S. O. Bueno による貢献。gh-146440。)

locale

  • setlocale() が @ 修飾子付きの言語コードをサポートしました。 getlocale() は @ 修飾子を黙って削除せず、言語コードに含めるようになりました。 (Serhiy Storchaka による貢献。gh-137729。)

  • locale.getdefaultlocale() 関数の非推奨を撤回しました。 (Victor Stinner による貢献。gh-130796。)

math

mimetypes

  • MIME 型を追加しました。 (Benedikt Johannes, Charlie Lin, Foolbar, Gil Forcada と John Franey による貢献。gh-144217, gh-145720, gh-140937, gh-139959, gh-145698, gh-145718, gh-145918, と gh-144213。)

  • application/x-texinfo を application/texinfo に改名しました。 (Charlie Lin による貢献。gh-140165。)

  • .ai ファイルの MIME 型を application/pdf に変更しました。 (Stan Ulbrych による貢献。gh-141239。)

mmap

  • Windows の mmap.mmap に trackfd パラメーターを追加しました。 False の場合、fileno に対応するファイルハンドルを複製しません。 (Serhiy Storchaka による貢献。gh-78502。)

  • Linux カーネルが PR_SET_VMA_ANON_NAME をサポートしている場合 (Linux 5.17 以降) に、匿名メモリマッピングに注釈を付ける mmap.mmap.set_name() メソッドを追加しました。 (Donghee Na による貢献。gh-142419。)

os

  • Linux カーネル 4.11 以降かつ glibc 2.28 以降で os.statx() を追加しました。 (Jeffrey Bosboom と Victor Stinner による貢献。gh-83714。)

  • os.makedirs() 関数に、中間ディレクトリのモードを指定できる parent_mode パラメーターを追加しました。 parent_mode=mode を渡すと、Python 3.6 以前の動作に合わせられます。 (Zackery Spytz と Gregory P. Smith による貢献。gh-86533。)

os.path

  • realpath() に、最後の要素だけは存在しなくてもよいモードのサポートを追加しました。 (Serhiy Storchaka による貢献。gh-71189。)

  • os.path.realpath() の strict パラメーターが、新しい値 os.path.ALLOW_MISSING を受け付けます。 この値を使うと、FileNotFoundError 以外のエラーは再送出されます。 結果のパスは存在しない可能性がありますが、シンボリックリンクを含みません。 (Petr Viktorin による CVE 2025-4517 への対応。)

pathlib

  • pathlib.Path.mkdir() に、parents=True の場合に中間ディレクトリのモードを指定できる parent_mode パラメーターを追加しました。 (Gregory P. Smith による貢献。gh-86533。)

pdb

  • pdb のデフォルトの入力シェルに、新しい対話型シェルを使うようになりました。 (Tian Gao による貢献。gh-145379。)

pickle

  • 非公開メソッドと入れ子のクラスの pickle 化をサポートしました。 (Zackery Spytz と Serhiy Storchaka による貢献。gh-77188。)

pickletools

  • pickletools のコマンドラインインターフェースの出力が、デフォルトで色付きになりました。 環境変数 で制御できます。 (Hugo van Kemenade による貢献。gh-149026。)

pprint

  • pprint.pprint()、pprint.pformat()、pprint.pp() にキーワード引数 expand を追加しました。 真の場合、indent を指定した json.dumps() の整形出力に似た形式で出力します。 (Stefan Todoran, Semyon Moroz と Hugo van Kemenade による貢献。gh-112632。)

  • pprint に t-string のサポートを追加しました。 (Loïc Simon と Hugo van Kemenade による貢献。gh-134551。)

re

  • 既存の re.match() と re.Pattern.match() API の代わりとなる、より明示的な名前として、re.prefixmatch() と対応する re.Pattern.prefixmatch() を追加しました。 既存の API は soft deprecated となりました。 新しい名前は、Zen of Python の 「暗黙的であるより明示的であるほうがよい」 という指針に従い、match の意味についての混乱を減らすためのものです。 他の言語の正規表現ライブラリの多くは、Python が従来 search と呼んできた処理に、match という名前の API を使っています。 (Gregory P. Smith による貢献。gh-86519。)

resource

shelve

  • shelve に、削除済みのエントリーが以前占有していた未使用の空き領域を回収する、新しい reorganize() メソッドを追加しました。 (Andrea Oliveri による貢献。gh-134004。)

  • shelve モジュールに、独自の直列化関数と非直列化関数のサポートを追加しました。 (Furkan Onder による貢献。gh-99631。)

socket

  • ISO-TP CAN プロトコルの定数を追加しました。 (Patrick Menschel と Stefan Tatschner による貢献。gh-86819。)

sqlite3

  • コマンドラインインターフェース にいくつかの新機能が追加されました。

    • Tab による SQL キーワードの補完。 (Long Tan による貢献。gh-133393。)

    • プロンプト、エラーメッセージ、ヘルプテキストが色付きになりました。 デフォルトで有効です。 詳細は 色の制御 を参照してください。 (Stan Ulbrych と Łukasz Langa による貢献。gh-133461。)

    • Tab によるテーブル、インデックス、トリガー、ビュー、カラム、関数、スキーマの補完。 (Long Tan による貢献。gh-136101。)

ssl

  • ssl.HAS_PSK_TLS13 により、ssl モジュールが RFC 9258 に記載された TLSv1.3 の「外部 PSK」をサポートするかどうかを示すようになりました。 (Will Childs-Klein による貢献。gh-133624。)

  • SSL の鍵共有で使うグループを管理する新しいメソッドを追加しました。

    • ssl.SSLContext.set_groups() sets the groups allowed for doing key agreement, extending the previous ssl.SSLContext.set_ecdh_curve() method. This new API provides the ability to list multiple groups and supports fixed-field and post-quantum groups in addition to ECDH curves. This method can also be used to control what key shares are sent in the TLS handshake.

    • ssl.SSLSocket.group() は、TLS ハンドシェイクの完了後、現在の接続で鍵共有に使うために選択されたグループを返します。 この呼び出しには OpenSSL 3.2 以降が必要です。

    • ssl.SSLContext.get_groups() は、コンテキストに現在設定されている TLS の最小バージョンと最大バージョンに適合する、利用可能なすべての鍵共有グループのリストを返します。 この呼び出しには OpenSSL 3.5 以降が必要です。

    (Ron Frederick が gh-136306 で貢献しました。)

  • TLS 1.3 の暗号を設定する新しいメソッド ssl.SSLContext.set_ciphersuites() を追加しました。 TLS 1.2 以前には引き続き ssl.SSLContext.set_ciphers() を使ってください。 両方を同じコンテキストで呼び出せます。 選択される暗号スイートは、接続時にネゴシエーションされた TLS バージョンに応じて決まります。 (Ron Frederick による貢献。gh-137197。)

  • 署名アルゴリズムを管理する新しいメソッドを追加しました。

    • ssl.get_sigalgs() は、利用可能なすべての TLS 署名アルゴリズムのリストを返します。 この呼び出しには OpenSSL 3.4 以降が必要です。

    • ssl.SSLContext.set_client_sigalgs() は、証明書に基づくクライアント認証で許可する署名アルゴリズムを設定します。

    • ssl.SSLContext.set_server_sigalgs() は、サーバーが TLS ハンドシェイクを完了するために使用を許可する署名アルゴリズムを設定します。

    • ssl.SSLSocket.client_sigalg() は、現在の接続のクライアント認証で使うために選択された署名アルゴリズムを返します。 この呼び出しには OpenSSL 3.5 以降が必要です。

    • ssl.SSLSocket.server_sigalg() は、現在の接続でサーバーが TLS ハンドシェイクを完了するために選択された署名アルゴリズムを返します。 この呼び出しには OpenSSL 3.5 以降が必要です。

    (Ron Frederick が gh-138252 で貢献しました。)

subprocess

  • subprocess.Popen.wait(): timeout が None ではなく、プラットフォームがサポートする場合、効率的なイベント駆動の仕組みでプロセスの終了を待つようになりました。

    • Linux 5.3 以降では os.pidfd_open() と select.poll() を使います。

    • macOS とその他の BSD 系では select.kqueue()、KQ_FILTER_PROC、KQ_NOTE_EXIT を使います。

    • Windows は引き続き WaitForSingleObject を使います (変更なし)。

    これらの仕組みがどれも使えない場合、この関数は従来のビジーループ (非ブロッキング呼び出しと短いスリープ) にフォールバックします。 (Giampaolo Rodola による貢献。gh-83069。)

symtable

sys

  • ABI 情報にアクセスしやすくするため、sys.abi_info 名前空間を追加しました。 (Klaus Zimmermann による貢献。gh-137476。)

sys.monitoring

  • その他のイベント (PY_THROW、PY_UNWIND、RAISE、EXCEPTION_HANDLED、RERAISE) を、コードオブジェクトごとに有効化、無効化できるようになりました。 これらのイベントのコールバックから DISABLE を返すと、以前のバージョンのように ValueError を送出せず、そのコードオブジェクト全体で (現在のツールについて) イベントを無効化します。 (Gabriele N. Tornetta による貢献。gh-146182。)

tarfile

  • data_filter() がパストラバーサル攻撃を防ぐために、シンボリックリンクのリンク先を正規化するようになりました。 (Petr Viktorin による貢献。gh-127987 と CVE 2025-4138。)

  • extractall() が、ディレクトリが削除された場合や別の種類のファイルに置き換わった場合に、そのディレクトリの属性の修正をスキップするようになりました。 (Petr Viktorin による貢献。gh-127987 と CVE 2024-12718。)

  • extract() and extractall() now (re-)apply the extraction filter when substituting a link (hard or symbolic) with a copy of another archive member, and when fixing up directory attributes. The former raises a new exception, LinkFallbackError. (Contributed by Petr Viktorin for CVE 2025-4330 and CVE 2024-12718.)

  • errorlevel() がゼロの場合でも、extract() と extractall() は拒否されたメンバーを展開しなくなりました。 (Matt Prodani と Petr Viktorin による貢献。gh-112887 と CVE 2025-4435。)

  • extract() と extractall() が、Windows 上で壊れたリンクを作成しないよう、シンボリックリンクのリンク先のスラッシュをバックスラッシュに置き換えるようになりました。 (Christoph Walcher による貢献。gh-57911。)

  • gettarinfo() が tar 形式の標準に従うため、Windows 上でシンボリックリンクのリンク先のバックスラッシュをスラッシュに置き換えるようになりました。 (Daniele Nicolodi による貢献。gh-151669。)

threading

timeit

  • timeit のコマンドラインインターフェースの出力が、デフォルトで色付きになりました。 環境変数 で制御できます。 (Hugo van Kemenade による貢献。gh-146609。)

  • コマンドラインインターフェースがデフォルトでエラーのトレースバックに色を付けるようになりました。 環境変数 で制御できます。 (Yi Hong による貢献。gh-139374。)

  • timeit.Timer.autorange() の目標時間を設定可能にし、コマンドラインインターフェースに --target-time オプションを追加しました。 (Alessandro Cucci と Miikka Koskinen による貢献。gh-80642。)

tkinter

  • tkinter.Text.search() メソッドが、二つの追加引数をサポートしました。 nolinestop は検索を行の境界を越えて継続できるようにし、strictlimits は検索を指定した範囲内に制限します。 (Rihaan Meher による貢献。gh-130848。)

  • 新しいメソッド tkinter.Text.search_all() を導入しました。 Tcl の -all オプションと -overlap オプションを使い、パターンに一致する箇所をすべて検索できます。 (Rihaan Meher による貢献。gh-130848。)

  • 古い名前の Tk コマンドを使う *_slaves() メソッドの代わりに、新しい名前の Tk コマンド (Tk 8.6 で導入) を使う新しいメソッド pack_content()、place_content()、grid_content() を追加しました。 (Serhiy Storchaka による貢献。gh-143754。)

  • Event の属性として、Tk の仮想イベント用に user_data を、Enter、Leave、FocusIn、FocusOut、ConfigureRequest イベント用に detail を追加しました。 (Matthias Kievernagel と Serhiy Storchaka による貢献。gh-47655。)

tokenize

tomllib

  • tomllib モジュールが TOML 1.1.0 をサポートしました。 後方互換性のある更新なので、有効な TOML 1.0.0 文書はすべて従来と同じように解析されます。

    official TOML changelog に記載された変更は次のとおりです。

    • インラインテーブル内で改行と末尾のカンマを許可。

      従来はインラインテーブルを 1 行に書く必要があり、末尾にカンマを置けませんでした。 この制約が緩和され、次の記述が有効になりました。

      tbl = {
         key      = "a string",
         moar-tbl =  {
            key = 1,
         },
      }
      
    • 基本文字列で、255 未満のコードポイントを表す \xHH 表記と、エスケープ文字を表す \e エスケープを追加。

      null = "null byte: \x00; letter a: \x61"
      csi = "\e["
      
    • 日時値と時刻値で秒を省略できるようになりました。 次の記述が有効になりました。

      dt = 2010-02-03 14:15
      t  = 14:15
      

    (Taneli Hukkinen が gh-142956 で貢献しました。)

types

typing

  • PEP 747: 値自体が型式である場合にアノテーションを付ける、新しい特殊形式 TypeForm を追加しました。 TypeForm[T] は「T (または T に代入可能な型) を記述する型形式オブジェクト」を意味します。 実行時の TypeForm(x) は単に x を返すので、動作を変えずに型形式の値に明示的なアノテーションを付けられます。

    これにより、ユーザーが指定する型式 (例えば int、str | None、TypedDict クラス、list[int]) を受け付けるライブラリが、正確なシグネチャを公開しやすくなります。

    from typing import Any, TypeForm
    
    def cast[T](typ: TypeForm[T], value: Any) -> T: ...
    

    (Jelle Zijlstra が gh-145033 で貢献しました。)

  • PEP 728: TypedDict にクラス引数 closed と extra_items のサポートを追加しました。 閉じた TypedDict は、クラス本体で指定されたキー以外の追加のキーを許可しません。 一方、extra_items を指定した TypedDict は、値が指定した型である任意の追加項目を許可します。 (Angela Liss による貢献。gh-137840。)

  • class ExtraTypeVars(P1[S], Protocol[T, T2]): ... のようなコードは、S が Protocol の型引数に含まれていないため、TypeError を送出するようになりました。 (Nikita Sobolev による貢献。gh-137191。)

  • class B2(A[T2], Protocol[T1, T2]): ... のようなコードが、型引数の順序を正しく扱うようになりました。 順序は (T1, T2) です。 従来は実行時に誤って (T2, T1) と推論されていました。 (Nikita Sobolev による貢献。gh-137191。)

  • PEP 800: クラスを disjoint base として指定する新しいデコレーター @typing.disjoint_base を追加しました。 これは主に、組み込み型やコンパイルされた拡張で定義される型の実行時の意味を、型チェッカーが忠実に反映できるようにするための高度な機能です。 クラス C が disjoint base の場合、その子クラスは、C の親クラスでも子クラスでもない他の disjoint base を継承できません。 (Jelle Zijlstra による貢献。gh-148639。)

  • TypeVarTuple が TypeVar と ParamSpec のインターフェースに合わせ、キーワード引数 bound、covariant、contravariant、infer_variance を受け付けるようになりました。 bound の意味は仕様上、引き続き未定義です。

unicodedata

unittest

urllib.parse

  • urlsplit()、urlparse()、urldefrag() 関数に missing_as_none パラメーターを追加しました。 urlunsplit() と urlunparse() 関数に keep_empty パラメーターを追加しました。 これにより、空の URI 構成要素と未定義の構成要素を区別し、空の構成要素を保持できます。 (Serhiy Storchaka による貢献。gh-67041。)

venv

  • POSIX プラットフォームでは、仮想環境の作成時に lib64 -> lib シンボリックリンクを使う代わりに、必要に応じて platlib ディレクトリを作成するようになりました。 これにより、sys.platlibdir が lib と異なるプラットフォームでは、仮想環境の purelib と platlib が同じ lib ディレクトリを共有しなくなります。 (Rui Xi による貢献。gh-133951。)

warnings

  • module 引数を渡さない場合の warnings.warn_explicit() のモジュールによるフィルタリングを改善しました。 警告フィルターのモジュール正規表現を、ファイル名から .py を除いたものだけでなく、ファイル名の各親ディレクトリを起点に構成したモジュール名 (/__init__.py、.py、Windows では .pyw も除く) とも照合するようになりました。 (Serhiy Storchaka による貢献。gh-135801。)

wave

  • wave に IEEE 浮動小数点数の WAVE 音声 (WAVE_FORMAT_IEEE_FLOAT) のサポートを追加しました。

  • フレーム形式を明示的に扱うため、wave.Wave_read.getformat()、wave.Wave_write.getformat()、wave.Wave_write.setformat() を追加しました。

  • wave.Wave_write.setparams() は、format を含む 7 要素のタプルと、後方互換性のための 6 要素のタプル (形式はデフォルトの WAVE_FORMAT_PCM) の両方を受け付けます。

  • WAVE_FORMAT_IEEE_FLOAT の出力に、非 PCM の WAVE 形式で必須の fact チャンクを含めるようになりました。

(Lionel Koenig と Michiel W. Beijen が gh-60729 で貢献しました。)

webbrowser

  • macOS では、新しい webbrowser.MacOS クラスが、osascript で AppleScript を組み立てて実行する代わりに、/usr/bin/open で URL を開きます。 デフォルトのブラウザーは plistlib を使って LaunchServices の設定ファイルから検出し、新規インストールでは com.apple.Safari にフォールバックします。 HTTP(S) 以外の URL では、open -b <bundle-id> を使って OS のファイルハンドラーではなくブラウザーに URL を渡し、ファイルインジェクション攻撃を防ぎます。 (Jeff Lyon による貢献。gh-137586。)

xml

  • 文字列を XML の要素名または属性名として使えるかを調べる xml.is_valid_name() 関数を追加しました。 (Serhiy Storchaka による貢献。gh-139489。)

  • 文字列を XML 文書で使えるかを調べる xml.is_valid_text() 関数を追加しました。 (Serhiy Storchaka による貢献。gh-139489。)

xml.parsers.expat

zlib

  • adler32_combine() で二つの Adler-32 チェックサムを結合できるようになりました。 (Callum Attryde と Bénédikt Tran による貢献。gh-134635。)

  • crc32_combine() で二つの CRC-32 チェックサムを結合できるようになりました。 (Bénédikt Tran による貢献。gh-134635。)

最適化

base64 と binascii

  • 単純な CPU パイプライン処理の最適化により、CPython の基盤となる base64 実装のエンコードが 2 倍、デコードが 3 倍高速になりました。 (Gregory P. Smith と Serhiy Storchaka による貢献。gh-143262。)

  • Ascii85、Base85、Z85 エンコーディングの実装を C で書き直しました。 エンコードとデコードが 2 桁 (約 100 倍) 高速になり、メモリ消費量も 2 桁 (約 100 分の 1) 減りました。 (James Seo と Serhiy Storchaka による貢献。gh-101178。)

  • Base32 の実装を C で書き直しました。 エンコードとデコードが 2 桁 (約 100 倍) 高速になりました。 (James Seo による貢献。gh-146192。)

csv

  • csv.Sniffer.sniff() の区切り文字の検出が最大 1.6 倍高速になりました。 (Maurycy Pawłowski-Wieroński による貢献。gh-137628。)

実験的な JIT コンパイラーの改良

pyperformance ベンチマークスイートの結果では、x86-64 Linux において、すべての最適化を有効にしてビルドした標準の CPython インタープリタに比べ、JIT は幾何平均で 7–8% の性能向上を示しています。 AArch64 macOS では、すべての最適化を有効にした 末尾呼び出し型インタープリタ に比べ、JIT は 11–12% 高速です。 JIT なしのビルドと比較した JIT ビルドの速度変化は、x86-64 Linux と AArch64 macOS のシステムで、およそ 15% の低下から 100% を超える向上まで幅があります (unpack_sequence マイクロベンチマークを除く)。

JIT の主な改良点は次のとおりです。

  • ビルド時の依存先を LLVM 21 に変更

  • 新しいトレーシングフロントエンド

  • JIT に基本的なレジスター割り当てを導入

  • JIT の最適化を拡充

  • GDB と GNU の backtrace() によるスタックの巻き戻しをサポート

  • 機械語コードの生成を改善

ビルド時の依存先を LLVM 21 に変更

JIT コンパイラーが、ビルド時のステンシル生成に LLVM 21 を使うようになりました。 従来どおり、LLVM が必要なのは JIT を有効にして CPython をビルドするときだけです。 Python を実行するエンドユーザーが LLVM をインストールする必要はありません。 すべてのサポート対象プラットフォームについて、LLVM のインストール手順は JIT コンパイラーのドキュメント にあります。 (Savannah Ostrowski による貢献。gh-140973。)

新しいトレーシングフロントエンド

JIT コンパイラーが Python 3.14 よりも大幅に多くのバイトコード操作と制御フローをサポートし、より幅広いコードを高速化できるようになりました。 例えば、3.15 の JIT コンパイラーは単純な Python オブジェクトの作成を理解できるようになりました。 オーバーロードされた演算やジェネレーターも部分的にサポートします。 これは JIT のトレーシングフロントエンドを刷新し、以前の実装のように実行経路を推定する代わりに、コードの実際の実行経路を記録するようにしたことで実現しました。 (Ken Jin による gh-139109 での貢献。Windows のサポートは Mark Shannon が gh-141703 で追加しました。)

JIT に基本的なレジスター割り当てを導入

JIT コンパイラーのオプティマイザーに、基本的なレジスター割り当てを追加しました。 これにより、一部のスタック操作を完全に省き、代わりにレジスター上で操作できます。 メモリの読み書きを避けることで、JIT はより効率的なトレースを生成できます。 (Mark Shannon による貢献。gh-135379。)

JIT の最適化を拡充

より多くの 定数伝播 を行うようになりました。 つまり、JIT コンパイラーが、あるユーザーコードの結果が定数になると検出した場合に、そのコードを単純化できます。 (Ken Jin と Savannah Ostrowski による貢献。gh-132732。)

安全に省略できる場合は 参照カウント の処理を省くようになりました。 これにより、一般に Python のほとんどの操作のコストが減ります。 (Ken Jin, Donghee Na, Zheao Li, Hai Zhu, Savannah Ostrowski, Reiden Ong, Noam Cohen, Tomas Roun, PuQing, Cajetan Rodrigues, と Sacul による貢献。gh-134584。)

オブジェクトへの参照が唯一であることを追跡することで、JIT オプティマイザーが参照カウントの更新を除去し、整数や浮動小数点数に対してインプレース操作を行えるようになりました。 (Reiden Ong, と Pieter Eendebak による貢献。gh-143414 と gh-146306。)

JIT オプティマイザーが、3.14 よりも大幅に多くの操作をサポートするようになりました。 (Kumar Aditya, Ken Jin, Jiahao Li, と Sacul による貢献。gh-131798。)

GDB と GNU の backtrace() によるスタックの巻き戻しをサポート

サポート対象の Linux ELF プラットフォームで、JIT コンパイラーが生成した機械語コードの巻き戻し情報を GDB インターフェースに公開するようになりました。 libgcc のフレーム登録が利用可能な場合、同じ巻き戻し情報を GNU の backtrace() でスタックをたどるためにも登録します。 これにより、これらの仕組みを使うネイティブデバッガー、クラッシュハンドラー、診断ツールが、生成されたコードで止まらずに JIT フレームを通過してスタックを巻き戻せます。 (Diego Russo と Pablo Galindo Salgado による貢献。gh-146071 と gh-149104。)

機械語コードの生成を改善

JIT コンパイラーの機械語コード生成器が、macOS と Linux の x86-64 および AArch64 向けに、より良い機械語コードを生成するようになりました。 一般に、3.14 に比べて生成された機械語コードのメモリ使用量が減り、コードの効率も向上することが期待されます。 (Brandt Bucher による gh-136528 と gh-135905 での貢献。AArch64 向けの実装は Mark Shannon による gh-139855 での貢献。AArch64 向けの追加の最適化は Mark Shannon と Diego Russo による gh-140683 と gh-142305 での貢献。)

保守性

JIT のデータ構造のリファクタリングにより、JIT オプティマイザーの操作を単純化しました。 (Zhongtian Zheng による gh-148211、Hai Zhu による gh-143421 での貢献。)

削除

ast

  • AST ノード のコンストラクターが、必須の引数を省略した場合や、AST ノードのフィールドに対応しないキーワード引数を渡した場合に TypeError を送出するようになりました。 これらの場合は Python 3.13 以降、DeprecationWarning を発していました。 (Brian Schubert と Jelle Zijlstra による貢献。gh-137600 と gh-105858。)

collections.abc

  • collections.abc.ByteString を collections.abc.__all__ から削除しました。 collections.abc.ByteString は Python 3.12 以降非推奨で、Python 3.17 で削除される予定です。 (Alex Waygood による貢献。gh-118803。)

ctypes

  • Python 3.13 以降非推奨だった、ドキュメントに記載されていない関数 ctypes.SetPointerType() を削除しました。 (Bénédikt Tran による貢献。gh-133866。)

datetime

  • strptime() が、書式文字列に年の指定なしで %d (月内の日) が含まれている場合に ValueError を送出するようになりました。 これは Python 3.13 以降非推奨でした。 (Stan Ulbrych と Gregory P. Smith による貢献。gh-70647。)

glob

  • Python 3.13 以降非推奨だった、ドキュメントに記載されていない関数 glob.glob0() と glob.glob1() を削除しました。 代わりに glob.glob() を使い、root_dir 引数にディレクトリを渡してください。 (Barney Gale による貢献。gh-137466。)

http.server

  • CGIHTTPRequestHandler クラスと、python -m http.server コマンドラインインターフェースの --cgi フラグを削除しました。 これらは Python 3.13 で非推奨になりました。 (Bénédikt Tran による貢献。gh-133810。)

importlib

  • Loader とそのサブクラスの load_module() メソッドを削除しました。 独自のサブクラスにこのメソッドが定義されていても、インポートシステムは呼び出さなくなります。 このメソッドは Python 3.4 以降、exec_module() に置き換えられ、非推奨でした。 (Brett Cannon による貢献。gh-97850。)

importlib.resources

pathlib

  • 非推奨の pathlib.PurePath.is_reserved() を削除しました。 Windows の予約済みパスを検出するには os.path.isreserved() を使ってください。 (Nikita Sobolev による貢献。gh-133875。)

platform

  • Python 3.13 以降非推奨だった platform.java_ver() 関数を削除しました。 (Alexey Makridenko による貢献。gh-133604。)

sre_*

  • sre_compile、sre_constants、sre_parse モジュールを削除しました。 (Stan Ulbrych による貢献。gh-135994。)

sysconfig

threading

  • RLock オブジェクトの C 実装で、任意の位置引数やキーワード引数のサポートを削除しました。 これは Python 3.14 で非推奨になりました。 (Bénédikt Tran による貢献。gh-134087。)

types

  • PEP 626 により Python 3.12 以降非推奨だった codeobject.co_lnotab を、types.CodeType から削除しました。 (Nikita Sobolev による貢献。gh-134690。)

typing

  • typing.ByteString を typing.__all__ から削除しました。 typing.ByteString は Python 3.9 以降非推奨で、Python 3.17 で削除される予定です。 (Alex Waygood による貢献。gh-118803。)

  • NamedTuple クラスを作るための、ドキュメントに記載されていないキーワード引数の構文 (例えば Point = NamedTuple("Point", x=int, y=int)) は、サポートされなくなりました。 代わりにクラス構文または関数形式の構文を使ってください。 (Bénédikt Tran による貢献。gh-133817。)

  • TD = TypedDict("TD") または TD = TypedDict("TD", None) でフィールドがゼロの TypedDict 型を作ることは、サポートされなくなりました。 代わりに class TD(TypedDict): pass または TD = TypedDict("TD", {}) を使ってください。 (Bénédikt Tran による貢献。gh-133823。)

  • 非推奨の @typing.no_type_check_decorator を削除しました。 (Nikita Sobolev による貢献。gh-133601。)

wave

  • Python 3.13 以降非推奨だった Wave_read クラスと Wave_write クラスの getmark()、setmark()、getmarkers() メソッドを削除しました。 (Bénédikt Tran による貢献。gh-133873。)

zipimport

非推奨

新たな非推奨事項

  • ast:

    • 抽象 AST ノード (ast.AST や ast.expr など) のインスタンスを作成することは非推奨となり、Python 3.20 ではエラーになります。

      (Brian Schubert が gh-116021 で貢献しました。)

  • base64:

    • b64decode() と urlsafe_b64decode() で、代替の文字集合を指定したときに + と / を受け付けることは非推奨になりました。 今後の Python では、厳密モードではエラーとなり、厳密モードでなければ破棄されます。 (Serhiy Storchaka による貢献。gh-125346。)

  • CLI:

    • コマンドラインオプション -b と -bb を非推奨とし、Python 3.17 で何もしなくなる予定です。 これらは主に Python 2 から 3 への移行を支援するためのものでした。 Python 3.17 以降、これらの場合に BytesWarning は送出されなくなります。 代わりに型チェッカーを使ってください。

      (Nikita Sobolev が gh-136355 で貢献しました。)

  • collections.abc:

    • 次の文が実行時に DeprecationWarning を発するようになりました。

      • from collections.abc import ByteString

      • import collections.abc; collections.abc.ByteString.

      collections.abc.ByteString をサブクラス化した場合や、isinstance() または issubclass() の第 2 引数に使った場合は、すでに DeprecationWarning を発していました。 従来は単にインポートした場合や、collections.abc モジュールの属性としてアクセスした場合には、警告を発していませんでした。 (Alex Waygood による貢献。gh-118803。)

  • hashlib:

    • new() のようなハッシュ関数のコンストラクターや、md5() と sha256() のようにハッシュ名を直接使うコンストラクターでは、各種の hashlib 実装で、任意の初期データのパラメーターを data= や string= という名前のキーワード引数としても渡せました。

      キーワード引数名 string のサポートは非推奨となり、Python 3.19 で削除される予定です。 後方互換性を最大限に保つため、初期データは位置引数として渡すことを推奨します。

      (Bénédikt Tran が gh-134978 で貢献しました。)

  • http.cookies:

  • imaplib:

    • IMAP4.file の変更は非推奨となり、Python 3.19 で削除される予定です。 このプロパティは使われなくなり、値を変更しても現在のファイルを明示的に閉じることは ありません。 (Bénédikt Tran による貢献。gh-142307。)

  • profile:

    • profile モジュールは非推奨となり、Python 3.17 で削除されます。 代わりに、互換性のある API を提供する profiling.tracing を使ってください。 詳しくは PEP 799 を参照してください。 (Pablo Galindo と László Kiss Kollár が gh-138122 で貢献しました。)

  • re:

    • re.match() と re.Pattern.match() は ソフト非推奨 となり、代わりに新しい API re.prefixmatch() と re.Pattern.prefixmatch() を使うことが推奨されます。 これらは、より明確な別名として追加されました。 Zen of Python の 「暗黙的であるより明示的であるほうがよい」 という指針に従い、match の意味に関する混乱を減らすことを意図しています。 他の言語の正規表現ライブラリの多くでは、Python が一貫して search と呼んできた操作を match という名前の API で提供しています。

      従来の名前 match() は30年以上コードで使われているため、削除する予定は ありません。 古いバージョンの Python に対応するコードでは、引き続き match() を使ってください。 新しいコードでは prefixmatch() を使うことを推奨します。 prefixmatch() と match() の違い を参照してください。

      (Gregory P. Smith が gh-86519 で、Hugo van Kemenade が gh-148100 で貢献しました。)

  • struct:

    • 必須の引数を指定せずに Struct.__new__() を呼び出すことは非推奨となり、Python 3.20 で削除されます。 初期化済みの Struct オブジェクトで __init__() メソッドを呼び出すことも非推奨となり、Python 3.20 で削除されます。

      (Sergey B Kirpichev と Serhiy Storchaka が gh-143715 で貢献しました。)

    • 型コード 'F' と 'D' は、2 文字の形式 'Zf' と 'Zd' に置き換えられ、soft deprecated となりました。 (Sergey B Kirpichev による貢献。gh-121249。)

  • typing:

    • 次の文が実行時に DeprecationWarning を発するようになりました。

      • from typing import ByteString

      • import typing; typing.ByteString.

      typing.ByteString をサブクラス化した場合や、isinstance() または issubclass() の第 2 引数に使った場合は、すでに DeprecationWarning を発していました。 従来は単にインポートした場合や、typing モジュールの属性としてアクセスした場合には、警告を発していませんでした。 (Alex Waygood による貢献。gh-118803。)

    • 実行時チェック可能なプロトコルクラスを継承していても、runtime_checkable() で明示的にデコレートされていないプロトコルクラスに対し、isinstance() や issubclass() でチェックすることは非推奨です。 Python 3.20 では TypeError が発生します。

      (Bartosz Sławecki が gh-132604 で貢献しました。)

  • webbrowser:

    • webbrowser.MacOSXOSAScript は webbrowser.MacOS に置き換えられ、非推奨となりました。 Python 3.17 で削除される予定です。 (Jeff Lyon による貢献。gh-137586。)

  • __version__:

Python 3.16 で削除予定

  • インポートシステム:

    • モジュールの __spec__.loader を設定せずに __loader__ を設定することは非推奨です。 Python 3.16 では、インポートシステムや標準ライブラリは __loader__ を設定しなくなり、その値も参照しなくなります。

  • array:

    • 書式コード 'u' (wchar_t) は、Python 3.3 からドキュメントで非推奨とされ、Python 3.13 からは実行時にも非推奨とされています。 Unicode 文字には、代わりに書式コード 'w' (Py_UCS4) を使ってください。

  • asyncio:

  • builtins:

    • 真偽値に対するビット単位の反転 ~True や ~False は、直感に反する意外な結果 (-2 と -1) になるため、Python 3.12 から非推奨です。 真偽値の論理否定には、代わりに not x を使ってください。 元の整数値のビット単位の反転が必要になるまれな場合には、明示的に int に変換してください (~int(x))。

  • functools:

    • functools.reduce() の Python 実装を、function や sequence をキーワード引数として指定して呼び出すことは、Python 3.14 から非推奨です。

  • logging:

    • strm 引数を持つカスタムログハンドラーへの対応は非推奨となり、Python 3.16 で削除予定です。 代わりに stream 引数を持つハンドラーを定義してください。 (Mariusz Felisiak が gh-115032 で貢献しました。)

  • mimetypes:

    • mimetypes.MimeTypes.add_type() で有効な拡張子は、'.' で始まるものか空のものです。 ドットのない拡張子は非推奨となり、Python 3.16 では ValueError が発生します。 (Hugo van Kemenade が gh-75223 で貢献しました。)

  • shutil:

    • ExecError 例外は Python 3.14 から非推奨です。 Python 3.4 以降は shutil のどの関数でも使われておらず、現在は RuntimeError の別名になっています。

  • symtable:

  • sys:

  • sysconfig:

    • sysconfig.expand_makefile_vars() 関数は Python 3.14 から非推奨です。 代わりに sysconfig.get_paths() の vars 引数を使ってください。

  • tarfile:

    • ドキュメント化されておらず、使われてもいない TarFile.tarfile 属性は Python 3.13 から非推奨です。

Python 3.17 で削除予定

  • datetime:

    • 年を含まず %e (月内の日) を含む書式文字列で strptime() を呼び出すこと。 これは Python 3.15 から非推奨です。 (Stan Ulbrych が gh-70647 で貢献しました。)

  • collections.abc:

    • collections.abc.ByteString は Python 3.17 で削除予定です。

      実行時に obj が バッファプロトコル を実装しているか調べるには、isinstance(obj, collections.abc.Buffer) を使ってください。 型アノテーションには Buffer を使うか、コードが対応する型を明示したユニオン (例えば bytes | bytearray | memoryview) を使ってください。

      ByteString は当初、bytes と bytearray の両方の上位型となる抽象クラスとして意図されていました。 しかし、この ABC はメソッドを一つも持たないため、あるオブジェクトが ByteString のインスタンスだと分かっても、そのオブジェクトに関する有用な情報は何も得られませんでした。 memoryview など、他の一般的なバッファ型も、実行時にも静的型チェッカーによっても ByteString のサブタイプとして認識されることはありませんでした。

      詳しくは PEP 688 を参照してください。 (Shantanu Jain が gh-91896 で貢献しました。)

  • encodings:

  • profile:

    • profile モジュールは非推奨となり、Python 3.17 で削除されます。 代わりに、互換性のある API を提供する profiling.tracing を使ってください。 詳しくは PEP 799 を参照してください。 (Pablo Galindo と László Kiss Kollár が gh-138122 で貢献しました。)

  • webbrowser:

    • webbrowser.MacOSXOSAScript は非推奨となりました。 代わりに webbrowser.MacOS を使ってください。 (gh-137586)

  • typing:

    • Python 3.14 より前は、従来のユニオンは非公開クラス typing._UnionGenericAlias を使って実装されていました。 このクラスは実装上は不要になりましたが、後方互換性のために残されており、Python 3.17 で削除予定です。 非公開の実装の詳細に依存する代わりに、typing.get_origin() や typing.get_args() など、ドキュメント化されたイントロスペクション用の補助関数を使ってください。

    • Python 3.9 から非推奨となっている typing.ByteString は、Python 3.17 で削除予定です。

      実行時に obj が バッファプロトコル を実装しているか調べるには、isinstance(obj, collections.abc.Buffer) を使ってください。 型アノテーションには Buffer を使うか、コードが対応する型を明示したユニオン (例えば bytes | bytearray | memoryview) を使ってください。

      ByteString は当初、bytes と bytearray の両方の上位型となる抽象クラスとして意図されていました。 しかし、この ABC はメソッドを一つも持たないため、あるオブジェクトが ByteString のインスタンスだと分かっても、そのオブジェクトに関する有用な情報は何も得られませんでした。 memoryview など、他の一般的なバッファ型も、実行時にも静的型チェッカーによっても ByteString のサブタイプとして認識されることはありませんでした。

      詳しくは PEP 688 を参照してください。 (Shantanu Jain が gh-91896 で貢献しました。)

  • tkinter:

    • Python 3.14 から非推奨となっている tkinter.Variable のメソッド trace_variable()、trace() (trace_variable() の別名)、trace_vdelete()、trace_vinfo() は、Python 3.17 で削除予定です。 代わりに trace_add()、trace_remove()、trace_info() を使ってください。 (Serhiy Storchaka が gh-120220 で貢献しました。)

Python 3.18 で削除予定

  • ファイルディスクリプタが必要なところでは、真偽値を受け付けなくなります。 (Serhiy Storchaka が gh-82626 で貢献しました。)

  • decimal:

    • Decimal の標準外でドキュメント化されていない書式指定子 'N' は、Python 3.13 から非推奨です。 これは decimal モジュールの C 実装だけでサポートされています。 (Serhiy Storchaka が gh-89902 で貢献しました。)

  • PEP 829 で定義された非推奨事項:

    • name.pth ファイルの import 行は、警告なしで無視されます。

    (Barry Warsaw が gh-148641 で貢献しました。)

Python 3.19 で削除予定

  • ctypes:

    • Windows 以外のプラットフォームで、_layout_ を設定せずに _pack_ を設定することで、暗黙的に MSVC 互換の構造体レイアウトに切り替えること。

  • hashlib:

    • hashlib のさまざまな実装では、new() や、md5()、sha256() などのハッシュ名を直接使ったコンストラクターに、省略可能な初期データを data= または string= というキーワード引数で渡すこともできました。

      キーワード引数名 string のサポートは非推奨となり、Python 3.19 で削除予定です。

      Python 3.13 より前は、ハッシュ関数のバックエンド実装によっては、キーワードパラメータ string が正しくサポートされていませんでした。 後方互換性を最大限に保つには、初期データは位置引数として渡してください。

  • http.cookies:

  • imaplib:

    • IMAP4.file の変更は非推奨となり、Python 3.19 で削除予定です。 このプロパティは現在使われておらず、値を変更しても現在のファイルは自動的には閉じられません。

      Python 3.14 より前は、このプロパティは IMAP4 の対応する read() メソッドと readline() メソッドの実装に使われていましたが、それ以降は使われていません。

Python 3.20 で削除予定

  • struct.Struct の __new__() メソッドを format 引数なしで呼び出すことは非推奨となり、Python 3.20 で削除されます。 初期化済みの Struct オブジェクトで __init__() メソッドを呼び出すことも非推奨となり、Python 3.20 で削除されます。

    (Sergey B Kirpichev と Serhiy Storchaka が gh-143715 で貢献しました。)

  • 以下の標準ライブラリモジュールの __version__、version、VERSION 属性は非推奨となり、Python 3.20 で削除されます。 代わりに sys.version_info を使ってください。

    (Hugo van Kemenade と Stan Ulbrych が gh-76007 で貢献しました。)

  • PEP 829 で定義された非推奨事項:

    • name.pth ファイルに import 行がある場合は警告が出ます。

    • name.pth ファイルは、デフォルトではロケールのエンコーディングでデコードされなくなります。 utf-8-sig でエンコードされて いなければなりません。

    (Barry Warsaw が gh-148641 で貢献しました。)

  • ast:

    • 抽象 AST ノード (ast.AST や ast.expr など) のインスタンスを作成することは非推奨となり、Python 3.20 ではエラーになります。

  • typing:

    • 実行時チェック可能なプロトコルクラスを継承していても、runtime_checkable() で明示的にデコレートされていないプロトコルクラスに対し、isinstance() や issubclass() でチェックすることは非推奨です。 Python 3.20 では TypeError が発生します。

      (Bartosz Sławecki が gh-132604 で貢献しました。)

将来のバージョンで削除予定

以下の API は将来削除されますが、現時点では削除時期は決まっていません。

  • argparse:

    • 引数グループの入れ子と、相互排他的なグループの入れ子は非推奨です。

    • add_argument_group() に、ドキュメント化されていないキーワード引数 prefix_chars を渡すことは非推奨になりました。

    • argparse.FileType 型コンバーターは非推奨です。

  • builtins:

    • ジェネレーター:throw(type, exc, tb) と athrow(type, exc, tb) というシグネチャは非推奨です。 代わりに、引数が一つの throw(exc) と athrow(exc) を使ってください。

    • 現在の Python は、0in x、1or x、0if 1else 2 のように数値リテラルの直後にキーワードが続く記法を受け付けます。 そのため、[0x1for x in y] のような紛らわしく曖昧な式も書けます ([0x1 for x in y] とも [0x1f or x in y] とも解釈できます)。 数値リテラルの直後に and、else、for、if、in、is、or のいずれかが続く場合は、構文上の警告が発生します。 将来のリリースでは構文エラーになります。 (gh-87999)

    • Support for __index__() and __int__() method returning non-int type: these methods will be required to return an instance of a strict subclass of int.

    • __float__() メソッドが float の厳密なサブクラスのインスタンスを返すことへの対応:今後は float 自体のインスタンスを返すことが必須になります。

    • __complex__() メソッドが complex の厳密なサブクラスのインスタンスを返すことへの対応:今後は complex 自体のインスタンスを返すことが必須になります。

    • complex() コンストラクターの real 引数や imag 引数に複素数を渡すことは非推奨になりました。 複素数は単独の位置引数としてのみ渡してください。 (Serhiy Storchaka が gh-109218 で貢献しました。)

  • calendar:定数 calendar.January と calendar.February は非推奨となり、calendar.JANUARY と calendar.FEBRUARY に置き換えられました。 (Prince Roshan が gh-103636 で貢献しました。)

  • codecs:codecs.open() の代わりに open() を使ってください。 (gh-133038)

  • codeobject.co_lnotab:代わりに codeobject.co_lines() メソッドを使ってください。

  • datetime:

    • utcnow():datetime.datetime.now(tz=datetime.UTC) を使ってください。

    • utcfromtimestamp():datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC) を使ってください。

  • gettext:複数形を選択するための値は整数でなければなりません。

  • importlib:

    • cache_from_source() の debug_override パラメータは非推奨です。 代わりに optimization パラメータを使ってください。

  • importlib.metadata:

    • EntryPoints のタプルインターフェース。

    • 戻り値として暗黙的に None を返すこと。

  • logging:warn() メソッドは Python 3.3 から非推奨です。 代わりに warning() を使ってください。

  • mailbox:StringIO による入力とテキストモードの使用は非推奨です。 代わりに BytesIO とバイナリモードを使ってください。

  • os: Calling os.register_at_fork() in a multi-threaded process.

  • os.path:os.path.commonprefix() は非推奨です。 パスの共通の先頭部分を求めるには os.path.commonpath() を使ってください。 os.path.commonprefix() は、名前と所属するモジュールが誤解を招くため非推奨になります。 この関数はパス操作用のモジュールに含まれていますが、パスの先頭部分を扱う用途では安全に使えません。 そのため、この関数を使うと Python プログラムにパストラバーサルの脆弱性を誤って持ち込みやすくなります。

  • pydoc.ErrorDuringImport:exc_info パラメータにタプルを渡すことは非推奨です。 例外インスタンスを使ってください。

  • re:正規表現内の番号によるグループ参照とグループ名に、より厳しい規則が適用されるようになりました。 番号による参照には ASCII の数字の並びだけを使えます。 bytes パターンと置換文字列のグループ名には、ASCII の英字、数字、アンダースコアだけを使えます。 (Serhiy Storchaka が gh-91760 で貢献しました。)

  • shutil:rmtree() の onerror パラメータは Python 3.12 で非推奨になりました。 代わりに onexc パラメータを使ってください。

  • ssl のオプションとプロトコル:

    • プロトコル引数を指定せずに ssl.SSLContext を作成することは非推奨です。

    • ssl.SSLContext:set_npn_protocols() と selected_npn_protocol() は非推奨です。 代わりに ALPN を使ってください。

    • ssl.OP_NO_SSL* オプション

    • ssl.OP_NO_TLS* オプション

    • ssl.PROTOCOL_SSLv3

    • ssl.PROTOCOL_TLS

    • ssl.PROTOCOL_TLSv1

    • ssl.PROTOCOL_TLSv1_1

    • ssl.PROTOCOL_TLSv1_2

    • ssl.TLSVersion.SSLv3

    • ssl.TLSVersion.TLSv1

    • ssl.TLSVersion.TLSv1_1

  • threading のメソッド:

  • typing.Text (gh-92332).

  • 内部クラス typing._UnionGenericAlias は、typing.Union の実装には使われなくなりました。 この非公開クラスを使っているユーザーとの互換性を保つため、少なくとも Python 3.17 までは互換性を維持するための実装が提供されます。 (Jelle Zijlstra が gh-105499 で貢献しました。)

  • unittest.IsolatedAsyncioTestCase:テストケースから None 以外の値を返すことは非推奨です。

  • urllib.parse の非推奨の関数:代わりに urlparse() を使ってください。

    • splitattr()

    • splithost()

    • splitnport()

    • splitpasswd()

    • splitport()

    • splitquery()

    • splittag()

    • splittype()

    • splituser()

    • splitvalue()

    • to_bytes()

  • wsgiref:SimpleHandler.stdout.write() は、渡されたデータの一部だけを書き込んで終了してはいけません。

  • xml.etree.ElementTree:Element の真偽値を調べることは非推奨です。 将来のリリースでは、常に True を返すようになります。 代わりに len(elem) や elem is not None を使って明示的に判定してください。

  • sys._clear_type_cache() は非推奨です。 代わりに sys._clear_internal_caches() を使ってください。

ソフト非推奨

ソフト非推奨 の API を削除する予定はありません。

  • re.match() と re.Pattern.match() は ソフト非推奨 となり、代わりに新しい API re.prefixmatch() と re.Pattern.prefixmatch() を使うことが推奨されます。 これらは、より明確な別名として追加されました。 Zen of Python の 「暗黙的であるより明示的であるほうがよい」 という指針に従い、match の意味に関する混乱を減らすことを意図しています。 他の言語の正規表現ライブラリの多くでは、Python が一貫して search と呼んできた操作を match という名前の API で提供しています。

    従来の名前 match() は30年以上コードで使われているため、削除する予定は ありません。 古いバージョンの Python に対応するコードでは、引き続き match() を使ってください。 新しいコードでは prefixmatch() を使うことを推奨します。 prefixmatch() と match() の違い を参照してください。

    (Gregory P. Smith が gh-86519 で、Hugo van Kemenade が gh-148100 で貢献しました。)

  • struct モジュールの書式型コード 'F' と 'D' の使用は ソフト非推奨 となり、代わりに2文字の形式 'Zf' と 'Zd' を使うことが推奨されます。 (Sergey B Kirpichev が gh-121249 で貢献しました。)

C API の変更

新しい機能

変更された C API

削除された C API

  • 非推奨の PyUnicode 関数を削除しました。

    • PyUnicode_AsDecodedObject():代わりに PyCodec_Decode() を使ってください。

    • PyUnicode_AsDecodedUnicode(): 代わりに PyCodec_Decode() を使ってください。 一部のコーデック (例えば "base64") は、bytes など、str 以外の型を返す場合があることに注意してください。

    • PyUnicode_AsEncodedObject():代わりに PyCodec_Encode() を使ってください。

    • PyUnicode_AsEncodedUnicode(): Use PyCodec_Encode() instead; note that some codecs (for example, "base64") may return a type other than bytes, such as str.

    (Stan Ulbrych が gh-133612 で貢献しました。)

  • PyImport_ImportModuleNoBlock(): PyImport_ImportModule() の非推奨の別名です。 (Bénédikt Tran による貢献。gh-133644。)

  • PyWeakref_GetObject() と PyWeakref_GET_OBJECT: 代わりに PyWeakref_GetRef() を使ってください。 Python 3.12 以前では pythoncapi-compat project を使うことで PyWeakref_GetRef() を利用できます。 (Bénédikt Tran による貢献。gh-133644。)

  • 非推奨の PySys_ResetWarnOptions() を削除しました。 代わりに sys.warnoptions と warnings.filters を空にしてください。

    (Nikita Sobolev が gh-138886 で貢献しました。)

次の関数は PyConfig_Get() に置き換えられ、削除されました。 Python 3.13 以前では pythoncapi-compat project を使うことで PyConfig_Get() を利用できます。

非推奨になった C API

ビルドの変更

  • 同梱の libmpdec ライブラリへの暗黙のフォールバックを削除しました。 今後は --with-system-libmpdec を no に設定するか、--without-system-libmpdec で明示的に有効にする必要があります。 (Sergey B Kirpichev による貢献。gh-115119。)

  • 新しい configure オプション --with-missing-stdlib-config=FILE により、配布者は、欠けているか別途パッケージ化されている standard library モジュールについての独自のエラーメッセージを含む JSON 設定ファイルを渡せます。 (Stan Ulbrych と Petr Viktorin による貢献。gh-139707。)

  • 新しい configure オプション --with-pymalloc-hugepages は、pymalloc のアリーナでヒュージページのサポートを有効にします。 有効にするとアリーナのサイズは 2 MiB になり、割り当てには MAP_HUGETLB (Linux) または MEM_LARGE_PAGES (Windows) を使い、通常のページへ自動的にフォールバックします。 Windows では build.bat --pymalloc-hugepages を使ってください。 実行時には、環境変数 PYTHON_PYMALLOC_HUGEPAGES を 1 に設定し、ヒュージページを明示的に有効にする必要があります。 (Pablo Galindo Salgado による貢献。gh-144319。)

  • Linux カーネルが PR_SET_VMA_ANON_NAME をサポートする場合 (Linux 5.17 以降)、匿名 mmap の用途に注釈を付けられるようになりました。 カーネルがこの機能をサポートし、Python に -X dev を渡すか、Python を デバッグモード でビルドしている場合、注釈は /proc/<pid>/maps に表示されます。 (Donghee Na による貢献。gh-141770。)

  • CPython はデフォルトでフレームポインターを有効にしてビルドされるようになりました (PEP 831)。 無効にするには --without-frame-pointers を渡してください。

    独自のビルドシステムを使う C 拡張やネイティブライブラリの作成者は、スタックを巻き戻すための連鎖が途切れないようにするべきです。 通常は CFLAGS に -fno-omit-frame-pointer などのフラグを追加することで対応します。 Python が使う具体的なフラグは --without-frame-pointers のドキュメントを参照してください。

    (Pablo Galindo Salgado と Savannah Ostrowski が gh-149201 で貢献しました。)

  • Visual Studio 2026 (MSVC 18) を使った 64 ビットビルドで、新しい 末尾呼び出し型インタープリタ を使えるようになりました。 Visual Studio 18.1.1 での結果では、AMD Ryzen 7 5800X 上の Windows x86-64 で、switch-case インタープリタに比べ、pyperformance の幾何平均で 15–20% の高速化が報告されています。 Windows では、大規模な純粋 Python ライブラリでの 14% から、長時間実行する小さな純粋 Python スクリプトでの 40% までの高速化が観測されています。 これは MSVC 18 で導入された新機能によって実現しました。 python.org の公式 Windows 64 ビットバイナリも、この機能を使うようになりました。 (Chris Eibl、Ken Jin、Brandt Bucher による gh-143068 での貢献。Steve Dower、および Hulon Jenkins を含む MSVC チームに感謝します。)

Python 3.15 への移行

この節では、前述の変更とその他のバグ修正のうち、コードの変更が必要になる可能性があるものを列挙します。

  • sqlite3.Connection API を整理しました。

    (Serhiy Storchaka が gh-133595 で貢献しました。)

  • resource.RLIM_INFINITY が常に正になりました。 以前の値に対応する負の整数 (プラットフォームにより -1 や -3 など) を resource.setrlimit() と resource.prlimit() に渡すことは非推奨になりました。 (Serhiy Storchaka による貢献。gh-137044。)

  • 基盤となるシステムコールをサポートしないプラットフォームでは、mmap.mmap.resize() が SystemError を送出する代わりに、メソッド自体が削除されました。 (An Long による貢献。gh-138205。)

  • xml.etree.ElementTree.iterparse() のイテレーターがファイルを開き、閉じられないままになった場合に、リソース警告を発するようになりました。 close() メソッドまたは contextlib.closing() コンテキストマネージャーを使って閉じてください。 (Osama Abdelkader と Serhiy Storchaka による貢献。gh-140601。)

  • argparse.ArgumentParser.add_argument() に短いオプションと単一のダッシュで始まる長いオプションを渡した場合、長いオプションから dest を推論するようになりました。 例えば add_argument('-f', '-foo') の dest は、'f' ではなく 'foo' になります。 以前の動作を保つには dest 引数を明示してください。 (Serhiy Storchaka による貢献。gh-138697。)

  • base64.urlsafe_b64decode() で入力のパディングが必須でなくなりました。 必須にするには、新しい引数 padded=True を渡すか、base64.b64decode() に引数 altchars=b'-_' を渡してください (後者は古い Python でも動作します)。 (Serhiy Storchaka による貢献。gh-73613。)

  • unittest.TestCase.assertWarns() と unittest.TestCase.assertWarnsRegex() が指定したカテゴリや正規表現に一致しない警告を握りつぶさなくなったため、従来は隠れていた警告がテストから漏れ出す可能性があります。 警告フィルターで抑制するか、追加の assertWarns*() で捕捉して検査してください。 (Serhiy Storchaka による貢献。gh-143231。)

3.15.2 の注目すべき変更

importlib

  • 複数のスレッドが同時に初めての import package.submodule を実行しても、デッドロックや誤ったインポートエラーの危険がなくなりました。 これは gh-83065 の修正により 3.15.0 で導入されたリグレッションです。 パッケージのインポートロックは、__init__ が戻るとすぐに解放されるようになりました。 複数のスレッドにまたがる循環インポートでは、importlib.import_module() は _DeadlockError を送出する代わりに、import 文と同様に初期化途中のモジュールを返すようになりました。 (Gregory P. Smith による貢献。gh-159963。)

ssl

  • ssl モジュールが、侵害された一群の eMudhra 中間 CA 証明書のいずれかを含む TLS 証明書チェーンを拒否するようになりました。 対象の証明書は公開鍵で識別するため、同じ鍵を再利用したクロス署名済みのコピーも拒否します。 これは多層防御の最後の備えとして、アプリケーションが独自のルート CA バンドルを指定していても、またプラットフォームのトラストストアが信頼を取り消しているかどうかによらず、適用されます。 (Christian Heimes による貢献。gh-160040 for CVE 2026-115557。)