What's new in Python 3.14

エディタ:

Adam Turner と Hugo van Kemenade

この記事では Python 3.13 と比較した Python 3.14 の新機能を解説します。Python 3.14 は2025年10月7日にリリースされました。全詳細については 変更履歴 をご覧ください。

参考

PEP 745 -- Python 3.14 リリーススケジュール

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

Python 3.14 は Python プログラミング言語の安定版リリースで、言語、実装、標準ライブラリにさまざまな変更が加わっています。 主な変更には、テンプレート文字列リテラル、アノテーションの遅延評価、標準ライブラリでの サブインタープリタ のサポートがあります。

ライブラリの変更内容には asyncio のイントロスペクション機能 の重要な改善、 新モジュール compression.zstd による Zstandard のサポート 、 REPL における構文ハイライトが、通常の非推奨化や削除、また利便性と正確性の向上に加えて含まれます。

本記事は、全ての新機能の仕様を網羅的に説明する代わりに、分かりやすく概要を説明するものとなっています。詳細については ライブラリリファレンス や 言語リファレンス などを参照してください。各変更点の実装や設計の理由を網羅的に理解したい方は、該当の PEP を参照してください。ただし、 PEP は機能が実装されたあとは Python の最新バージョンに合わせて更新されないことが多いので注意してください。Python を以前のバージョンからアップグレードする際の注意点は Porting to Python 3.14 を参照してください。


インタプリタの改善:

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

C API の改善:

プラットフォームのサポート:

リリースの変更:

新しい機能

PEP 649 と PEP 749: アノテーションの遅延評価

関数、クラス、モジュールの アノテーション が先行評価されなくなりました。代わりに、アノテーションは専用の annotate 関数 に格納され、必要になったときのみ評価されるようになります (from __future__ import annotations を使用している場合を除く)。

この変更により、Pythonのアノテーションのパフォーマンスと使いやすさがほとんどの状況で向上します。アノテーションを定義することで発生する実行コストはほとんどなくなりましたが、実行中にアノテーションを値として取得することは依然として可能です。また、アノテーションに前方参照が含まれている場合に、クォーテーションで囲って文字列にする必要はなくなりました。

新しく追加された annotationlib モジュールを使うことで、遅延評価となったアノテーションを取得することができます。アノテーションの評価フォーマットとして、 VALUE (以前のPythonバージョンと同様に、アノテーションの実行時の値を評価する) FORWARDREF (未定義の名前を特別なマーカーに置き換える) STRING (アノテーションを文字列として返す) があります。

各フォーマットの挙動は以下の例の通りです:

>>> from annotationlib import get_annotations, Format
>>> def func(arg: Undefined):
...     pass
>>> get_annotations(func, format=Format.VALUE)
Traceback (most recent call last):
  ...
NameError: name 'Undefined' is not defined
>>> get_annotations(func, format=Format.FORWARDREF)
{'arg': ForwardRef('Undefined', owner=<function func at 0x...>)}
>>> get_annotations(func, format=Format.STRING)
{'arg': 'Undefined'}

この変更により既存コードでどのような修正が必要になる可能性があるかを 移植 セクションで説明しています。ただし、ほとんどのコードでは修正は不要です。

(Jelle Zijlstra の貢献による PEP 749 と gh-119180 、 Larry Hastings の貢献による PEP 649 )

参考

PEP 649

デスクリプタを使ったアノテーション遅延評価

PEP 749

PEP 649 の実装

PEP 734: 複数インタープリタ機能が標準ライブラリに追加

CPython ランタイムでは、同じプロセスの中で複数の Python 環境を実行する機能が20年以上存在します。この各環境は「インタープリタ」といいます。しかしこの機能は C-API 経由でしか利用できませんでした。

Python 3.14 で concurrent.interpreters モジュールが追加されたことにより、この制限がなくなりました。

複数のインタープリタを使うことに大きな利点がある理由として、少なくとも次の二つが挙げられます。

  • (Python としては新しい) 使いやすい並行実行モデル

  • マルチコアを活用した真の並列実行

並行実行は、原理的には実行効率が上がったり設計を単純化できる用途がある一方で、非常に単純な並行実行でない限り、人間にとって実装や保守が難しいことが多いです。特に、OSレベルのスレッドを直接使用する場合は (例えば threading)、メモリがすべてのスレッド間で共有されるため、複雑になります。

互いに独立した複数インタープリタを使用することで、 Communicating Sequential Processes (CSP) やアクターモデルといった、他言語 (Smalltalk、Erlang、Haskell、Go など) で成功している並行実行モデルを取り入れることができます。複数インタープリタは、ユーザーが明示的にメモリ共有をするスレッドとみなすことができます。

マルチコアの並列実行については、Python 3.12 で、インタープリタは並列実行できるレベルにお互いに隔離されるようになりました (参照: PEP 684) 。これにより、 GIL の制限がなくなり、様々な CPU バウンドな用途に Python を用いることができるようになります。

複数インタープリタは、デフォルトでメモリ共有がされない点や、隔離された論理的な「プロセス」が並列に動作するという点で、 multiprocessing と類似しています。しかし、複数インタープリタを使うことで、システムのリソースを節約でき、処理効率もあがります (同じプロセスに存在するため) 。スレッドの処理効率とプロセス的な隔離を両立している、と考えられます。

複数インタープリタの機能は何十年も存在していましたが、認知度が低く、標準ライブラリモジュールがないことから、あまり使用されていませんでした。そのため、いくつか大きな制限事項がありますが、メイン機能になったことで今後大きく改善していくと思われます。

現状の制限事項:

  • インタープリタの起動処理がまだ最適化されていない

  • インタープリタのメモリ使用量が必要以上に大きい (インタープリタ間で内部リソースをできるだけ共有するよう改善中)

  • インタープリタ間でオブジェクトなどのデータを真の意味で共有する方法がまだ少ない (memoryview 以外)

  • PyPI 上のサードパーティ拡張モジュールの多くが複数インタープリタに対応していない (標準ライブラリの拡張モジュールはすべて対応)

  • Python 利用者はまだ複数インタープリタを使ったアプリケーション開発に慣れていない人が多い

今後 CPython がどう改善していくか、インタープリタがどう使われるか、PyPI パッケージでどこまで解決できるようになるかによって、以上の制限事項の影響度合いは変わります。用途によっては、影響は少ないかもしれません。ぜひ使ってみてください!

さらに、今後の CPython のバージョンで、オーバーヘッドは少なくなり、 PyPI パッケージとして実装するには向かない補助機能が追加される予定です。それまでの間、上記の制限事項のほとんどは拡張モジュールを作ることで解消できるので、今の時点で PyPI パッケージによって穴埋めすることもできます。これは 3.14 から 3.12 (インタープリタが隔離が完全になり、 GIL の共有がなくなったバージョン) まで可能です。同様に、インタープリタをさらに抽象化するライブラリも PyPI に現れると予想されます。

拡張モジュールの対応については、一部の PyPI プロジェクトや、Cython、pybind11、nanobind、PyO3などのツールの対応作業が進行中です。どうすれば拡張モジュールを隔離できるかについては、 拡張モジュールを分離する を参照してください。隔離のために必要な作業は、 フリースレッド の対応に必要な作業とかなり重複するため、すでにコミュニティで進められているフリースレッド対応作業により、複数インタープリタの対応も早まると思われます。

他の 3.14 追加要素: concurrent.futures.InterpreterPoolExecutor 。

(Eric Snow の貢献による gh-134939 )

参考

PEP 734

PEP 750: テンプレート文字列リテラル

テンプレート文字列とは、カスタムの文字列処理を行うための新しい仕組みです。f-string と構文が類似していますが、f-string が単に str を返すのに対し、テンプレート文字列は、文字列の固定の部分と補間された部分を表すオブジェクトを返します。

t-stringを書くには、プレフィックスとして 'f' の代わりに 't' を使用します:

>>> variety = 'Stilton'
>>> template = t'Try some {variety} cheese!'
>>> type(template)
<class 'string.templatelib.Template'>

Template オブジェクトでは、文字列の固定部分と補間部分 (波括弧で囲まれた部分) に、結合される 前に アクセスできます。 Template インスタンスを反復すると、各部分を順に取得できます。

>>> list(template)
['Try some ', Interpolation('Stilton', 'variety', None, ''), ' cheese!']

Template インスタンスを処理するコードは、簡単に書いたり呼び出したりできます。 例えば、次の関数は固定部分を小文字に、Interpolation インスタンスを大文字にして結果を生成します。

from string.templatelib import Interpolation

def lower_upper(template):
    """固定の箇所は小文字に、interpolationsは大文字に変換する"""
    parts = []
    for part in template:
        if isinstance(part, Interpolation):
            parts.append(str(part.value).upper())
        else:
            parts.append(part.lower())
    return ''.join(parts)

name = 'Wenslydale'
template = t'Mister {name}'
assert lower_upper(template) == 'mister WENSLYDALE'

Template インスタンスは、固定文字列と補間部分を実行時に区別できるので、ユーザー入力のサニタイズに役立ちます。 ユーザー入力を HTML 内でエスケープする html() 関数を書く練習は、読者の皆さんにお任せします。 テンプレートの処理コードを工夫すれば、より柔軟に対応できます。 例えば、さらに高度な html() 関数なら、HTML 属性の dict をテンプレート内で直接受け取れます。

attributes = {'src': 'limburger.jpg', 'alt': 'lovely cheese'}
template = t'<img {attributes}>'
assert html(template) == '<img src="limburger.jpg" alt="lovely cheese" />'

もちろん、テンプレートの処理コードは文字列のような結果を返す必要はありません。 さらに 高度な html() なら、DOM のような構造を表す独自の型を返すこともできます。

t-string を使うと、SQL のサニタイズ、安全なシェル操作、ログの改善、Web 開発 (HTML、CSS など) の新しい考え方への対応、軽量な独自の業務用 DSL の実装などを行うシステムを書けます。

(Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran, Pablo Galindo Salgado の貢献による gh-132661 )

参考

PEP 750

PEP 768: 安全な外部デバッガインターフェース

Python プロセスを停止したり再起動したりすることなく安全にデバッガやプロファイラを接続できる、オーバーヘッドのないデバッグインターフェースが Python 3.14 で追加されました。これは Python のデバッグ機能を大きく強化するものであり、安全でない手法をとる必要がなくなります。

このインターフェースにより、インタープリタの通常の実行パスに変更を加えることなく、実行のオーバーヘッドを生じさせることもなく、安全にデバッガを接続できるポイントが追加されます。これにより、外部ツールからリアルタイムで Python アプリケーションの状態を取得したり操作できるようになります。これは、安定稼働が必要なシステムや本番環境においては非常に重要な機能です。

利便性のため、このインターフェースは sys.remote_exec() 関数として実装されています。例えば:

import os, sys
from tempfile import NamedTemporaryFile

with NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
    script_path = f.name
    f.write(f'import my_debugger; my_debugger.connect({os.getpid()})')

# Execute in process with PID 1234
print('Behold! An offering:')
sys.remote_exec(1234, script_path)

この関数は、対象プロセスの次の安全な実行ポイントで実行する Python コードを送信できます。 ただし、ツールの作者は PEP の説明に従ってプロトコルを直接実装することもできます。 PEP には、実行中のプロセスに安全に接続するための内部の仕組みが詳しく説明されています。

このデバッグインターフェースはセキュリティを意識して慎重に設計されており、アクセス制御の仕組みがいくつか備わっています:

(Pablo Galindo Salgado, Matt Wozniski, Ivona Stojanovic による貢献 gh-131591 )

参考

PEP 768.

新しいインタープリタ

CPython に新しいインタープリタが追加されました。Python の個々の命令コードを C 言語の長い case 文で実装する代わりに、小さな C 関数に分けて末尾呼び出し (tail call) でお互いを呼び出すようになっています。一部の新しいコンパイラでビルドすれば、このインタープリタのパフォーマンスは以前のインタープリタより大きく改善します。簡易的に pyperformance 標準ベンチマークでテストした結果、プラットフォームやアーキテクチャによっては、相乗平均で 3% から 5% の速度向上がみられました。比較対象は、Clang 19 でビルドした、新しいインタープリタなしの Python 3.14 です。

このインタープリタは現状、Clang 19 以上かつ x86-64 と AArch64 アーキテクチャのみ対応しています。ただ、GCC も今後のバージョンで対応になる見込みです。

この機能は今のところ明示的に有効にする必要があります。 新しいインタープリタを使う場合は、プロファイルに基づく最適化 (PGO) を有効にすることを強く推奨します。 パフォーマンスの改善がテスト、検証されているのは、この構成だけだからです。 詳細は --with-tail-call-interp を参照してください。

注釈

これは Python 関数の 末尾呼び出し最適化 と混同しないでください。 Python 関数の末尾呼び出し最適化は、現在の CPython には実装されていません。

この新しい種類のインタープリタは、CPython インタープリタ内部の実装の詳細です。 Python プログラムの外から見える動作はまったく変わりません。 パフォーマンスが向上する可能性はありますが、それ以外は何も変わりません。

(Ken Jin が gh-128563 で貢献し、Mark Shannon、Garrett Gu、Haoran Xu、Josh Haberman が CPython での実装方法についてアイデアを提供しました。)

フリースレッドモードの改善

3.13 で初めて追加された CPython のフリースレッドモード (PEP 703) は、Python 3.14 で大幅に改善されました。 C API の変更を含め、PEP 703 に記載された実装が完成し、インタープリタ内の一時的な回避策は、より恒久的な解決策に置き換わりました。 特殊化を行う適応型インタープリタ (PEP 659) がフリースレッドモードでも有効になり、ほかの多くの最適化とともにパフォーマンスを大幅に改善しています。 フリースレッドモードでシングルスレッドのコードを実行した場合の性能低下は、プラットフォームと使用する C コンパイラによりますが、現在はおよそ 5~10% です。

Python 3.14 から、Windows で CPython のフリースレッドビルド向けに拡張モジュールをコンパイルする際は、ビルドバックエンドがプリプロセッサ変数 Py_GIL_DISABLED を指定する必要があります。 C コンパイラが自動的に判定しなくなるためです。 実行中のインタープリタについて、コンパイル時に使われた設定は sysconfig.get_config_var() で調べられます。

新しい -X context_aware_warnings フラグは、並行処理で安全に使える警告の制御 を有効にするかどうかを制御します。 デフォルト値は、フリースレッドビルドでは真、GIL が有効なビルドでは偽です。

A new thread_inherit_context flag has been added, which if enabled means that threads created with threading.Thread start with a copy of the Context() of the caller of start(). Most significantly, this makes the warning filtering context established by catch_warnings be "inherited" by threads (or asyncio tasks) started within that context. It also affects other modules that use context variables, such as the decimal context manager. This flag defaults to true for the free-threaded build and false for the GIL-enabled build.

(Sam Gross、Matt Page、Neil Schemenauer、Thomas Wouters、Donghee Na、Kirill Podoprigora、Ken Jin、Itamar Oren、Brett Simmers、Dino Viehland、Nathan Goldbaum、Ralf Gommers、Lysandros Nikolaou、Kumar Aditya、Edgar Margffoy をはじめ、多くの方々が貢献しました。 一部の貢献者は Meta に所属しており、同社はこのプロジェクトの支援に多大なエンジニアリングリソースを提供し続けています。)

エラーメッセージの改善

  • インタープリタは、Python のキーワードの入力間違いを検出すると、役立つ候補を提示するようになりました。 Python のキーワードによく似た単語が現れると、エラーメッセージで正しいキーワードを提案します。 この機能により、プログラマはよくある入力間違いをすばやく見つけて修正できます。 例えば、次のようになります。

    >>> whille True:
    ...     pass
    Traceback (most recent call last):
      File "<stdin>", line 1
        whille True:
        ^^^^^^
    SyntaxError: invalid syntax. Did you mean 'while'?
    

    この機能はよくある間違いを中心に対応しているため、綴りの間違い方によっては通常の構文エラーになる場合もあります。 (Pablo Galindo が gh-132449 で貢献しました。)

  • else ブロックの後に elif 文を置くと、専用のエラーメッセージが表示されるようになりました。 (Steele Farnsworth が gh-129902 で貢献しました。)

    >>> if who == "me":
    ...     print("It's me!")
    ... else:
    ...     print("It's not me!")
    ... elif who is None:
    ...     print("Who is it?")
    File "<stdin>", line 5
      elif who is None:
      ^^^^
    SyntaxError: 'elif' block follows an 'else' block
    
  • 条件式 (Conditional Expressions) の else の後に文を書いた場合や、if の前に pass、break、continue のいずれかを書いた場合、エラーメッセージは expression が必要な位置を強調表示するようになりました。 (Sergey Miryanov が gh-129515 で貢献しました。)

    >>> x = 1 if True else pass
    Traceback (most recent call last):
      File "<string>", line 1
        x = 1 if True else pass
                           ^^^^
    SyntaxError: expected expression after 'else', but statement is given
    
    >>> x = continue if True else break
    Traceback (most recent call last):
      File "<string>", line 1
        x = continue if True else break
            ^^^^^^^^
    SyntaxError: expected expression before 'if', but statement is given
    
  • 文字列が誤った位置で閉じられていることを検出すると、エラーメッセージは、その部分も文字列の一部として書いたのではないかと指摘するようになりました。 (Pablo Galindo が gh-88535 で貢献しました。)

    >>> "The interesting object "The important object" is very important"
    Traceback (most recent call last):
    SyntaxError: invalid syntax. Is this intended to be part of the string?
    
  • 文字列に併用できない接頭辞を付けた場合、エラーにその接頭辞が表示されるようになりました。 (Nikita Sobolev が gh-133197 で貢献しました。)

    >>> ub'abc'
      File "<python-input-0>", line 1
        ub'abc'
        ^^
    SyntaxError: 'u' and 'b' prefixes are incompatible
    
  • 次の構文で as に不適切なターゲットを指定した場合のエラーメッセージを改善しました。

    • インポート: import ... as ...

    • from インポート: from ... import ... as ...

    • 例外ハンドラ: except ... as ...

    • パターンマッチの case: case ... as ...

    (Nikita Sobolev が gh-123539、gh-123562、gh-123440 で貢献しました。)

  • ハッシュ可能でない型のインスタンスを dict のキーや set の要素として追加しようとした場合のエラーメッセージを改善しました。 (CF Bolz-Tereick と Victor Stinner が gh-132828 で貢献しました。)

    >>> s = set()
    >>> s.add({'pages': 12, 'grade': 'A'})
    Traceback (most recent call last):
      File "<python-input-1>", line 1, in <module>
        s.add({'pages': 12, 'grade': 'A'})
        ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    TypeError: cannot use 'dict' as a set element (unhashable type: 'dict')
    >>> d = {}
    >>> l = [1, 2, 3]
    >>> d[l] = 12
    Traceback (most recent call last):
      File "<python-input-4>", line 1, in <module>
        d[l] = 12
        ~^^^
    TypeError: cannot use 'list' as a dict key (unhashable type: 'list')
    
  • 同期コンテキストマネージャプロトコルをサポートするオブジェクトに対し、with の代わりに async with でコンテキストに入ろうとした場合のエラーメッセージを改善しました。 非同期コンテキストマネージャプロトコルで逆の使い方をした場合も同様です。 (Bénédikt Tran が gh-128398 で貢献しました。)

PEP 784: 標準ライブラリでの Zstandard のサポート

新しい compression パッケージには、compression.lzma、compression.bz2、compression.gzip、compression.zlib モジュールが含まれます。 これらは、それぞれ lzma、bz2、gzip、zlib モジュールを再エクスポートします。 Python 3.14 から、これらの圧縮モジュールをインポートする際は、compression 配下の新しい名前を使うことを推奨します。 ただし、既存のモジュール名は非推奨にはなっていません。 既存の圧縮モジュールが非推奨になったり削除されたりするのは、早くても 3.14 のリリースから 5 年後です。

新しい compression.zstd モジュールは、Meta の zstd ライブラリ へのバインディングを通して、Zstandard 形式の圧縮・展開 API を提供します。 Zstandard は広く採用されている、高効率で高速な圧縮形式です。 compression.zstd の API に加え、tarfile、zipfile、shutil モジュールでも、Zstandard で圧縮したアーカイブの読み書きをサポートするようになりました。

新しいモジュールでデータを圧縮する例を示します。

from compression import zstd
import math

data = str(math.pi).encode() * 20
compressed = zstd.compress(data)
ratio = len(compressed) / len(data)
print(f"Achieved compression ratio of {ratio}")

このように、API は lzma や bz2 モジュールの API に似ています。

(Emma Harper Smith、Adam Turner、Gregory P. Smith、Tomas Roun、Victor Stinner、Rogdham が gh-132983 で貢献しました。)

参考

PEP 784。

asyncio のイントロスペクション機能

非同期タスクを使う実行中の Python プロセスを調べる、新しいコマンドラインインターフェースを追加しました。 python -m asyncio ps PID または python -m asyncio pstree PID で利用できます。

ps サブコマンドは指定されたプロセス ID (PID) のプロセスを調べ、現在実行中の asyncio タスクの情報を表示します。 タスクの表として、すべてのタスク、名前、コルーチンのスタック、それらを待機しているタスクを一覧表示します。

pstree サブコマンドは同じ情報を取得しますが、コルーチンの関係を階層的に示す非同期呼び出しツリーとして表示します。 このコマンドは、長時間動作する非同期プログラムや、進行が止まった非同期プログラムのデバッグに特に役立ちます。 プログラムがどこでブロックしているか、どのタスクが未完了か、コルーチンがどうつながっているかをすばやく把握できます。

例えば、次のコードを考えます。

import asyncio

async def play_track(track):
    await asyncio.sleep(5)
    print(f'🎵 Finished: {track}')

async def play_album(name, tracks):
    async with asyncio.TaskGroup() as tg:
        for track in tracks:
            tg.create_task(play_track(track), name=track)

async def main():
    async with asyncio.TaskGroup() as tg:
        tg.create_task(
          play_album('Sundowning', ['TNDNBTG', 'Levitate']),
          name='Sundowning')
        tg.create_task(
          play_album('TMBTE', ['DYWTYLM', 'Aqua Regia']),
          name='TMBTE')

if __name__ == '__main__':
    asyncio.run(main())

実行中のプロセスに対して新しいツールを実行すると、次のような表が得られます。

python -m asyncio ps 12345

tid        task id              task name            coroutine stack                                    awaiter chain                                      awaiter name    awaiter id
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1935500    0x7fc930c18050       Task-1               TaskGroup._aexit -> TaskGroup.__aexit__ -> main                                                                       0x0
1935500    0x7fc930c18230       Sundowning           TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TaskGroup._aexit -> TaskGroup.__aexit__ -> main    Task-1          0x7fc930c18050
1935500    0x7fc93173fa50       TMBTE                TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TaskGroup._aexit -> TaskGroup.__aexit__ -> main    Task-1          0x7fc930c18050
1935500    0x7fc93173fdf0       TNDNBTG              sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   Sundowning      0x7fc930c18230
1935500    0x7fc930d32510       Levitate             sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   Sundowning      0x7fc930c18230
1935500    0x7fc930d32890       DYWTYLM              sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TMBTE           0x7fc93173fa50
1935500    0x7fc93161ec30       Aqua Regia           sleep -> play                                      TaskGroup._aexit -> TaskGroup.__aexit__ -> album   TMBTE           0x7fc93173fa50

または、次のようなツリーが得られます。

python -m asyncio pstree 12345

└── (T) Task-1
    └──  main example.py:13
        └──  TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
            └──  TaskGroup._aexit Lib/asyncio/taskgroups.py:121
                ├── (T) Sundowning
                │   └──  album example.py:8
                │       └──  TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
                │           └──  TaskGroup._aexit Lib/asyncio/taskgroups.py:121
                │               ├── (T) TNDNBTG
                │               │   └──  play example.py:4
                │               │       └──  sleep Lib/asyncio/tasks.py:702
                │               └── (T) Levitate
                │                   └──  play example.py:4
                │                       └──  sleep Lib/asyncio/tasks.py:702
                └── (T) TMBTE
                    └──  album example.py:8
                        └──  TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
                            └──  TaskGroup._aexit Lib/asyncio/taskgroups.py:121
                                ├── (T) DYWTYLM
                                │   └──  play example.py:4
                                │       └──  sleep Lib/asyncio/tasks.py:702
                                └── (T) Aqua Regia
                                    └──  play example.py:4
                                        └──  sleep Lib/asyncio/tasks.py:702

非同期の待機関係のグラフに循環が見つかった場合 (プログラムの問題を示している可能性があります)、ツールはエラーを出し、ツリーの構築を妨げる循環経路を一覧表示します。

python -m asyncio pstree 12345

ERROR: await-graph contains cycles - cannot print a tree!

cycle: Task-2 → Task-3 → Task-2

(Pablo Galindo、Łukasz Langa、Yury Selivanov、Marta Gomez Macias が gh-91048 で貢献しました。)

並行処理で安全に使える警告の制御

warnings.catch_warnings コンテキストマネージャは、警告フィルタにコンテキスト変数を使うよう選択できるようになりました。 -X コマンドラインオプションまたは環境変数で context_aware_warnings フラグを設定すると有効になります。 これにより、複数のスレッドや非同期タスクで catch_warnings を使う場合も、予測可能な形で警告を制御できます。 フラグのデフォルト値は、フリースレッドビルドでは真、GIL が有効なビルドでは偽です。

(Neil Schemenauer と Kumar Aditya が gh-130010 で貢献しました。)

その他の言語の変更

  • Windows で、すべての Windows コードページを 'cpXXX' コーデックとしてサポートするようになりました。 (Serhiy Storchaka が gh-123803 で貢献しました。)

  • C99 以降の C 規格で定められている、実数と複素数を組み合わせる混合演算の規則を実装しました。 (Sergey B Kirpichev が gh-69639 で貢献しました。)

  • 最適化や -O コマンドラインオプションに関係なく、より多くの構文エラーを検出するようになりました。 これには、__debug__ への書き込み、await の誤用、非同期関数の外での非同期内包表記が含まれます。 例えば、python -O -c 'assert (__debug__ := 1)' や python -O -c 'assert await 1' は SyntaxError になります。 (Irit Katriel と Jelle Zijlstra が gh-122245 と gh-121637 で貢献しました。)

  • C だけで実装された型のサブクラスを作成する際、サブクラスで明示的にオーバーライドしない限り、クラスの作成時に新しい型の C スロットがラッパーに置き換わることはなくなりました。 (Tomasz Pytel が gh-132284 で貢献しました。)

組み込み機能

  • bytes.fromhex() と bytearray.fromhex() メソッドは、ASCII の bytes と バイト列類似オブジェクト を受け付けるようになりました。 (Daniel Pope が gh-129349 で貢献しました。)

  • Add class methods float.from_number() and complex.from_number() to convert a number to float or complex type correspondingly. They raise a TypeError if the argument is not a real number. (Contributed by Serhiy Storchaka in gh-84978.)

  • (format() や f-strings を使う) 新しい形式の文字列書式化で、浮動小数点数の表示型について、小数部分でもアンダースコアとカンマによる 3 桁区切りをサポートするようになりました。 (Sergey B Kirpichev が gh-87790 で貢献しました。)

  • int() 関数は __trunc__() に処理を委譲しなくなりました。 int() への変換をサポートするクラスは、__int__() または __index__() を実装する必要があります。 (Mark Dickinson が gh-119743 で貢献しました。)

  • map() 関数に、zip() と同様の省略可能なキーワード専用フラグ strict が追加されました。 すべてのイテラブルの長さが等しいことを確認できます。 (Wannes Boeykens が gh-119793 で貢献しました。)

  • memoryview 型は添字指定をサポートし、ジェネリック型 になりました。 (Brian Schubert が gh-126012 で貢献しました。)

  • NotImplemented を真偽値の文脈で使うと、TypeError が発生するようになりました。 この使い方は Python 3.9 から DeprecationWarning の対象でした。 (Jelle Zijlstra が gh-118767 で貢献しました。)

  • 引数を三つ渡した pow() でも、必要に応じて __rpow__() の呼び出しを試みるようになりました。 以前は、引数二つの pow() と二項の累乗演算子でしか呼び出されませんでした。 (Serhiy Storchaka が gh-130104 で貢献しました。)

  • super オブジェクトが コピー と pickle 化 に対応しました。 (Serhiy Storchaka が gh-125767 で貢献しました。)

コマンドラインと環境

  • インポート時間を表示するフラグは、新しい -X importtime=2 により、すでに読み込まれた (キャッシュ済みの) モジュールも追跡できるようになりました。 そのようなモジュールをインポートすると、self と cumulative の時間の代わりに文字列 cached を表示します。

    -X importtime の 2 より大きい値は、将来の使用のために予約されました。

    (Noah Kim と Adam Turner が gh-118655 で貢献しました。)

  • コマンドラインオプション -c は、コード引数の共通のインデントを実行前に自動的に取り除くようになりました。 (Jon Crall と Steven Sun が gh-103998 で貢献しました。)

  • -J は Jython 用に予約されたフラグではなくなり、特別な意味を持たなくなりました。 (Adam Turner が gh-133336 で貢献しました。)

PEP 758: except と except* の式の括弧を省略可能に

except と except* の式で、複数の例外型を指定し、as 節を使わない場合は、括弧を省略できるようになりました。 例えば、次のように書けます。

try:
    connect_to_server()
except TimeoutError, ConnectionRefusedError:
    print('The network has ceased to be!')

(Pablo Galindo と Brett Cannon が PEP 758 と gh-131831 で貢献しました。)

PEP 765: finally ブロック内の制御フロー

return、break、continue 文によって finally ブロックを抜ける場合、コンパイラは SyntaxWarning を出すようになりました。 この変更は PEP 765 で定められています。

この変更が不便な場合 (コードの lint を行っているため警告が重複する場合など) は、警告フィルタ に ignore::SyntaxWarning を追加すると、構文の警告をすべて無効にできます。 ほかの警告をエラーに変えるフィルタと組み合わせて指定することもできます。 例えば、CLI オプションに -Werror -Wignore::SyntaxWarning を渡すか、PYTHONWARNINGS=error,ignore::SyntaxWarning を設定します。

実行時に warnings モジュールでこのようなフィルタを適用しても、警告が抑制されるのはフィルタ変更 後に コンパイルされるコードだけです。 例えばモジュールのインポート時など、フィルタ変更前にコンパイルされたコードでは、構文の警告は引き続き出ます。

(Irit Katriel が gh-130080 で貢献しました。)

ガベージコレクション

Python 3.14.5 以降:

ガベージコレクタ (GC) は Python 3.14.5 で変更されました。

Python 3.14.0~3.14.4 には、新しいインクリメンタル GC が搭載されていました。 しかし、本番環境でメモリの圧迫が深刻になるという 報告 が複数寄せられたため、3.13 の世代別 GC に戻されました。 Python 3.14.5 以降で使われるのは、この GC です。

以前の Python 3.14.0~3.14.4:

循環ガベージコレクタがインクリメンタルになりました。 これにより、大きなヒープでの最大停止時間は 10 分の 1 以下になります。

世代は若い世代と古い世代の二つだけになりました。 gc.collect() を直接呼び出さない場合、GC の実行頻度は少し低くなります。 実行時には、一つ以上の世代をまとめて回収する代わりに、若い世代と古い世代の一部分を回収します。

gc.collect() の動作は少し変わります。

  • gc.collect(1): 第 1 世代の回収ではなく、インクリメンタルなガベージコレクションを 1 回進めます。

  • gc.collect() のほかの呼び出しに変更はありません。

(Mark Shannon が gh-108362 で貢献しました。)

デフォルトの対話シェル

  • デフォルトの 対話 シェルが Python の構文を強調表示するようになりました。 PYTHON_BASIC_REPL など、色を無効にする環境変数が設定されていない限り、デフォルトで有効です。 詳細は 色の制御 を参照してください。

    構文強調表示のデフォルトの配色は、見やすいコントラストを目指し、互換性を最大限に保つため 4 ビット VGA 標準の ANSI カラーコードだけを使います。 実験的な API _colorize.set_theme() で配色をカスタマイズできます。 対話的に呼び出すことも、PYTHONSTARTUP スクリプト内で呼び出すこともできます。 この関数の安定性は保証されず、変更や削除が行われる可能性があることに注意してください。

    (Łukasz Langa が gh-131507 で貢献しました。)

  • デフォルトの 対話 シェルがインポートの自動補完をサポートするようになりました。 import co と入力して <Tab> を押すと、co で始まるモジュールが候補に表示されます。 同様に、from concurrent import i と入力すると、i で始まる concurrent のサブモジュールが候補に表示されます。 現時点ではモジュールの属性の自動補完には対応していません。 (Tomas Roun が gh-69605 で貢献しました。)

新しいモジュール

  • annotationlib: アノテーション を調べるためのモジュールです。 詳細は PEP 749 を参照してください。 (Jelle Zijlstra が gh-119180 で貢献しました。)

  • compression (compression.zstd を含む): Zstandard 圧縮形式をサポートする新しいモジュールなど、圧縮関連のモジュールをまとめたパッケージです。 詳細は PEP 784 を参照してください。 (Emma Harper Smith、Adam Turner、Gregory P. Smith、Tomas Roun、Victor Stinner、Rogdham が gh-132983 で貢献しました。)

  • concurrent.interpreters: 標準ライブラリで複数のインタープリタをサポートします。 詳細は PEP 734 を参照してください。 (Eric Snow が gh-134939 で貢献しました。)

  • string.templatelib: テンプレート文字列リテラル (t-string) をサポートします。 詳細は PEP 750 を参照してください。 (Jim Baker、Guido van Rossum、Paul Everitt、Koudai Aono、Lysandros Nikolaou、Dave Peck、Adam Turner、Jelle Zijlstra、Bénédikt Tran、Pablo Galindo Salgado が gh-132661 で貢献しました。)

改善されたモジュール

argparse

  • argparse.ArgumentParser の プログラム名 のデフォルト値は、Python インタープリタが __main__ モジュールのコードをどのように探すよう指定されたかを反映するようになりました。 (Serhiy Storchaka と Alyssa Coghlan が gh-66436 で貢献しました。)

  • argparse.ArgumentParser に、省略可能な suggest_on_error パラメータを導入しました。 ユーザーが入力を間違えた場合に、引数の選択肢やサブパーサー名の候補を提示できます。 (Savannah Ostrowski が gh-124456 で貢献しました。)

  • ヘルプテキストの色付けが有効になりました。 argparse.ArgumentParser の省略可能な color パラメータで無効にできます。 環境変数 でも制御できます。 (Hugo van Kemenade が gh-130645 で貢献しました。)

ast

  • 二つの AST を比較する compare() 関数を追加しました。 (Batuhan Taskaya and Jeremy Hylton が gh-60191 で貢献しました。)

  • AST ノードで copy.replace() をサポートするようになりました。 (Bénédikt Tran が gh-121141 で貢献しました。)

  • 最適化レベル 2 では、最適化された AST からドキュメント文字列を削除するようになりました。 (Irit Katriel が gh-123958 で貢献しました。)

  • AST ノードの repr() 結果に、より多くの情報を含めるようになりました。 (Tomas Roun が gh-116022 で貢献しました。)

  • AST を入力として呼び出した場合、parse() 関数はルートノードの型が適切かどうかを常に検証するようになりました。 (Irit Katriel が gh-130139 で貢献しました。)

  • コマンドラインインターフェースに、--feature-version、--optimize、--show-empty オプションを追加しました。 (Semyon Moroz が gh-133367 で貢献しました。)

asyncio

  • create_task() という名前の関数とメソッドが、任意のキーワード引数を受け取るようになりました。 すべてのキーワード引数は Task コンストラクタまたは独自のタスクファクトリに渡されます (詳細は set_task_factory() を参照)。 name と context キーワード引数は、特別扱いされなくなりました。 名前はファクトリの name キーワード引数で設定する必要があり、context には None を指定できます。

    この変更は、asyncio.create_task()、asyncio.loop.create_task()、asyncio.TaskGroup.create_task() に影響します。

    (Thomas Grainger が gh-128307 で貢献しました。)

  • プログラムの呼び出しグラフを調べたり表示したりする二つのユーティリティ関数、capture_call_graph() と print_call_graph() が追加されました。 詳細は asyncio のイントロスペクション機能 を参照してください。 (Yury Selivanov, Pablo Galindo Salgado, and Łukasz Langa が gh-91048 で貢献しました。)

calendar

  • calendar の コマンドライン のテキスト出力で、デフォルトでは今日の日付を色付きで強調表示するようになりました。 これは 環境変数 で制御できます。 (Hugo van Kemenade が gh-128317 で貢献しました。)

concurrent.futures

  • 新しい executor クラス InterpreterPoolExecutor を追加しました。 同じプロセス内の複数の Python インタープリタ (「サブインタープリタ」) を Python コードから利用できます。 独立した Python インタープリタのプールを使い、呼び出しを非同期に実行します。

    これは、PEP 734 で導入された新しい interpreters モジュールとは別のものです。 (Eric Snow が gh-124548 で貢献しました。)

  • macOS 以外の Unix プラットフォームでは、ProcessPoolExecutor のデフォルトの 開始方式 が、fork から forkserver に変わりました。 Windows と macOS には影響せず、これらでは引き続き spawn がデフォルトの開始方式です。

    スレッドとの併用に適さない fork 方式が必要な場合は、ProcessPoolExecutor に multiprocessing コンテキスト mp_context を渡して、明示的に指定する必要があります。

    fork 方式との違い、ミュータブルな共有グローバル変数や、自動的に pickle 化 できない共有オブジェクトを使う既存コードへの影響については、forkserver の制限 を参照してください。

    (Gregory P. Smith が gh-84559 で貢献しました。)

  • ProcessPoolExecutor に、terminate_workers() と kill_workers() という二つのメソッドを追加しました。 指定したプールで生存しているワーカープロセスをすべて終了、または強制終了できます。 (Charles Machalow が gh-130849 で貢献しました。)

  • Executor.map に、省略可能な buffersize パラメータを追加しました。 投入済みで、まだ結果を返していないタスクの数を制限できます。 バッファがいっぱいの場合、バッファから結果を返すまで iterables の反復を一時停止します。 (Enzo Bonnal and Josh Rosenberg が gh-74028 で貢献しました。)

configparser

  • セキュリティ向上のため、configparser は自分で読み取れない設定ファイルを書き込まなくなりました。 区切り文字を含むキーや、セクションヘッダのパターンで始まるキーを write() で書き込もうとすると、InvalidWriteError が発生します。 (Jacob Lincoln が gh-129270 で貢献しました。)

contextvars

ctypes

  • Structure と Union オブジェクトの ビットフィールド のレイアウトが、プラットフォームのデフォルト (GCC/Clang または MSVC) により近いものになりました。 特に、フィールドが重なり合わなくなりました。 (Matthias Görgens が gh-97702 で貢献しました。)

  • Structure._layout_ クラス属性を設定し、デフォルト以外の ABI にレイアウトを合わせやすくなりました。 (Petr Viktorin が gh-97702 で貢献しました。)

  • Structure と Union のフィールドデスクリプタのクラスを、CField として利用できるようになりました。 また、デバッグやイントロスペクションに役立つ新しい属性が追加されました。 (Petr Viktorin が gh-128715 で貢献しました。)

  • Windows の COMError 例外が公開されました。 (Jun Komoda が gh-126686 で貢献しました。)

  • Windows の CopyComPointer() 関数が公開されました。 (Jun Komoda が gh-127275 で貢献しました。)

  • 指定されたポインタと長さの領域を参照する memoryview オブジェクトを作成する memoryview_at() 関数を追加しました。 バッファのコピーを行わない点を除いて ctypes.string_at() と同様に動作します。 サイズが動的に決まるバッファを受け取るコールバック関数を Python だけで実装する場合などに役立ちます。 (Rian Hunter が gh-112018 で貢献しました。)

  • コンパイラと libffi ライブラリの両方が C の複素数型をサポートする場合に、複素数型 c_float_complex、c_double_complex、c_longdouble_complex を利用できるようになりました。 (Sergey B Kirpichev が gh-61103 で貢献しました。)

  • 現在のプロセスが読み込んだ共有ライブラリを一覧にする ctypes.util.dllist() を追加しました。 (Brian Ward が gh-119349 で貢献しました。)

  • ctypes.POINTER() の型のキャッシュを、グローバルな内部キャッシュ (_pointer_type_cache) から、対応する ctypes の型の _CData.__pointer_type__ 属性に移しました。 これにより、特定の状況でキャッシュが際限なく増え続けるのを防ぎます。 (Sergey Miryanov が gh-100926 で貢献しました。)

  • py_object 型は添字指定をサポートし、ジェネリック型 になりました。 (Brian Schubert が gh-132168 で貢献しました。)

  • ctypes が フリースレッドビルド をサポートするようになりました。 (Kumar Aditya and Peter Bierma が gh-127945 で貢献しました。)

curses

datetime

decimal

  • Decimal の代替コンストラクタとして Decimal.from_number() を追加しました。 (Serhiy Storchaka が gh-121798 で貢献しました。)

  • IEEE 754 (2008) の十進数交換形式に対応したコンテキストを作成できるように、IEEEContext() を公開しました。 (Sergey B Kirpichev が gh-53032 で貢献しました。)

difflib

  • HtmlDiff クラスが生成する、変更箇所を強調表示した比較ページが「ダークモード」に対応しました。 (Jiahao Li が gh-129939 で貢献しました。)

dis

  • 行番号だけでなく、命令 のソース上の位置情報をすべて表示できるようになりました。 次のインターフェースに show_positions キーワード引数として追加されています。

    この機能は dis --show-positions からも利用できます。 (Bénédikt Tran が gh-123165 で貢献しました。)

  • 特殊化されたバイトコードを表示する dis --specialized コマンドラインオプションを追加しました。 (Bénédikt Tran が gh-127413 で貢献しました。)

errno

  • エラーコード定数 EHWPOISON を追加しました。 (James Roy が gh-126585 で貢献しました。)

faulthandler

fnmatch

  • 指定されたパターンに一致する名前を除外する filterfalse() 関数を追加しました。 (Bénédikt Tran が gh-74598 で貢献しました。)

fractions

  • as_integer_ratio() メソッドを持つ任意のオブジェクトから、Fraction オブジェクトを構築できるようになりました。 (Serhiy Storchaka が gh-82017 で貢献しました。)

  • Fraction の代替コンストラクタとして Fraction.from_number() を追加しました。 (Serhiy Storchaka が gh-121797 で貢献しました。)

functools

  • 番兵値 Placeholder を追加しました。 partial() または partialmethod() 関数で、返される partial オブジェクト 内に、後から渡す位置引数の場所を確保するために使えます。 (Dominykas Grigonis が gh-119127 で貢献しました。)

  • reduce() の initial パラメータをキーワード引数として渡せるようになりました。 (Sayandip Dutta が gh-125916 で貢献しました。)

getopt

  • 引数を省略できるオプションをサポートするようになりました。 (Serhiy Storchaka が gh-126374 で貢献しました。)

  • 混在するオプションとオプション以外の引数を、元の順序で返せるようになりました。 (Serhiy Storchaka が gh-126390 で貢献しました。)

getpass

  • getpass() 関数に、キーボード入力に対する表示のフィードバックを追加しました。 省略可能なキーワード専用引数 echo_char で指定できます。 文字を入力するたびに代替の文字を表示し、文字を削除すると表示も削除します。 (Semyon Moroz が gh-77065 で貢献しました。)

graphlib

heapq

hmac

  • HACL* プロジェクトの形式検証済みのコードを使って、HMAC (RFC 2104) の組み込み実装を追加しました。 この実装は、OpenSSL の HMAC 実装が利用できない場合のフォールバックとして使われます。 (Bénédikt Tran が gh-99108 で貢献しました。)

http

  • http.server モジュールが生成するディレクトリ一覧とエラーページで、ブラウザのデフォルトのダークモードを適用できるようになりました。 (Yorik Hansen が gh-123430 で貢献しました。)

  • http.server モジュールが、http.server.HTTPSServer クラスによる HTTPS での配信をサポートするようになりました。 コマンドラインインターフェース (python -m http.server) からは、次のオプションで利用できます。

    (Semyon Moroz が gh-85162 で貢献しました。)

imaplib

  • RFC 2177 で定義された IMAP4 の IDLE コマンドを実装する IMAP4.idle() を追加しました。 (Forest が gh-55454 で貢献しました。)

inspect

io

  • read で非ブロッキングストリームからテキストを読み取る際、すぐにバイト列を返せない場合は BlockingIOError が発生することがあるようになりました。 (Giovanni Siragusa が gh-109523 で貢献しました。)

  • 疑似プロトコル typing.IO、typing.TextIO、typing.BinaryIO に代わる、より単純なプロトコルとして Reader と Writer を追加しました。 (Sebastian Rittau が gh-127648 で貢献しました。)

json

linecache

  • getline() で凍結されたモジュールのソースコードを取得できるようになりました。 (Tian Gao が gh-131638 で貢献しました。)

logging.handlers

math

  • このモジュールの定義域エラーについて、より詳しいエラーメッセージを追加しました。 (Charlie Zhao and Sergey B Kirpichev が gh-101410 で貢献しました。)

mimetypes

  • python -m mimetypes で起動する、公開の コマンドラインインターフェース を追加しました。 (Oleg Iarygin and Hugo van Kemenade が gh-93096 で貢献しました。)

  • RFC や一般的な用法に基づいて、いくつかの MIME タイプを追加しました。

    Microsoft と RFC 8081 のフォント用 MIME タイプ

    • Embedded OpenType: application/vnd.ms-fontobject

    • OpenType Layout (OTF) font/otf

    • TrueType: font/ttf

    • WOFF 1.0 font/woff

    • WOFF 2.0 font/woff2

    RFC 9559 の Matroska 音声・映像データのコンテナ構造用 MIME タイプ

    • 映像を含まない音声: audio/matroska (.mka)

    • 映像: video/matroska (.mkv)

    • 立体映像: video/matroska-3d (.mk3d)

    RFC で定義された画像形式

    • RFC 1494: CCITT Group 3 (.g3)

    • RFC 3362: リアルタイムファクシミリ、T.38 (.t38)

    • RFC 3745: JPEG 2000 (.jp2)、拡張形式 (.jpx)、複合形式 (.jpm)

    • RFC 3950: Tag Image File Format Fax eXtended, TIFF-FX (.tfx)

    • RFC 4047: Flexible Image Transport System (.fits)

    • RFC 7903: 拡張メタファイル (.emf) と Windows メタファイル (.wmf)

    その他の MIME タイプの追加と変更

    • RFC 2361: .avi の型を video/vnd.avi に、.wav の型を audio/vnd.wave に変更

    • RFC 4337: MPEG-4 audio/mp4 (.m4a) を追加

    • RFC 5334: Ogg メディア (.oga、.ogg、.ogx) を追加

    • RFC 6713: gzip application/gzip (.gz) を追加

    • RFC 9639: FLAC audio/flac (.flac) を追加

    • YAML ファイル (.yaml と .yml) 用の RFC 9512 の MIME タイプ application/yaml

    • 7z application/x-7z-compressed (.7z) を追加

    • 厳密なモードでない場合に、Android Package application/vnd.android.package-archive (.apk) を追加

    • deb application/x-debian-package (.deb) を追加

    • glTF binary model/gltf-binary (.glb) を追加

    • glTF JSON/ASCII model/gltf+json (.gltf) を追加

    • M4V video/x-m4v (.m4v) を追加

    • PHP application/x-httpd-php (.php) を追加

    • RAR application/vnd.rar (.rar) を追加

    • RPM application/x-rpm (.rpm) を追加

    • STL model/stl (.stl) を追加

    • Windows Media Video video/x-ms-wmv (.wmv) を追加

    • 事実上の標準: WebM audio/webm (.weba) を追加

    • ECMA-376: .docx、.pptx、.xlsx の型を追加

    • OASIS: OpenDocument の .odg、.odp、.ods、.odt の型を追加

    • W3C: EPUB application/epub+zip (.epub) を追加

    (Sahil Prajapati と Hugo van Kemenade が gh-84852 で、Sasha "Nelie" Chernykh と Hugo van Kemenade が gh-132056 で、Hugo van Kemenade が gh-89416、gh-85957、gh-129965 で貢献しました。)

multiprocessing

  • macOS 以外の Unix プラットフォームでは、デフォルトの 開始方式 が、fork から forkserver に変わりました。 Windows と macOS には影響せず、これらでは引き続き spawn がデフォルトの開始方式です。

    スレッドとの併用に適さない fork 方式が必要な場合は、get_context() のコンテキストで明示的に指定するか (推奨)、set_start_method() でデフォルトを変更する必要があります。

    fork 方式との違い、ミュータブルな共有グローバル変数や、自動的に pickle 化 できない共有オブジェクトを使う既存コードへの影響については、forkserver の制限 を参照してください。

    (Gregory P. Smith が gh-84559 で貢献しました。)

  • multiprocessing の forkserver 開始方式は、制御用ソケットで認証を行うようになりました。 これにより、forkserver にワーカーの生成やコードの実行を要求できる他のプロセスを制限する際に、ファイルシステムのアクセス権だけに依存しなくなりました。 (Gregory P. Smith が gh-97514 で貢献しました。)

  • list と dict 型の multiprocessing プロキシオブジェクト に、これまで見落とされていたメソッドを追加しました。

    • list のプロキシに clear() と copy()

    • dict のプロキシに fromkeys()、reversed(d)、d | {}、{} | d、d |= {'b': 2}

    (Roy Hyunjin Han が gh-103134 で貢献しました。)

  • SyncManager.set() を通して、共有の set オブジェクトをサポートするようになりました。 Manager() で作成したマネージャで set() を利用できるようになりました。 (Mingyu Park が gh-129949 で貢献しました。)

  • multiprocessing.Process オブジェクトに interrupt() を追加しました。 SIGINT を送信して子プロセスを終了させます。 これにより、finally 節で終了したプロセスのスタックトレースを表示できるようになります。 (Artem Pulkin が gh-131913 で貢献しました。)

operator

  • is_none() と is_not_none() という一組の関数を追加しました。 operator.is_none(obj) は obj is None と、operator.is_not_none(obj) は obj is not None と同じ意味になります。 (Raymond Hettinger and Nico Mexis が gh-115808 で貢献しました。)

os

os.path

  • realpath() の strict パラメータが、新しい値 ALLOW_MISSING を受け付けるようになりました。 この値を使うと、FileNotFoundError 以外のエラーは再送出されます。 結果のパスは存在しない場合がありますが、シンボリックリンクは含まなくなります。 (Petr Viktorin が CVE 2025-4517 に対応して貢献しました。)

pathlib

  • pathlib.Path に、ファイルやディレクトリを再帰的にコピー、移動するメソッドを追加しました。

    • copy() は、指定先にファイルやディレクトリツリーをコピーします。

    • copy_into() は、指定先ディレクトリの 中に コピーします。

    • move() は、指定先にファイルやディレクトリツリーを移動します。

    • move_into() は、指定先ディレクトリの 中に 移動します。

    (Barney Gale が gh-73991 で貢献しました。)

  • info 属性を追加しました。 新しい pathlib.types.PathInfo プロトコルを実装するオブジェクトを格納します。 このオブジェクトでファイルの種類を調べることができ、stat() の結果は内部でキャッシュされます。 iterdir() が生成するパスオブジェクトは、親ディレクトリの走査から得られたファイルの種類の情報で初期化されます。 (Barney Gale が gh-125413 で貢献しました。)

pdb

  • pdb モジュールが、新しい -p PID コマンドラインオプションを使って、実行中の Python プロセスに外部から接続できるようになりました。

    python -m pdb -p 1234
    

    指定された PID の Python プロセスに接続し、対話的にデバッグできるようにします。 ただし、Python インタープリタの仕組み上、接続先プロセスがシステムコールや I/O 待ちでブロックしている場合、接続が有効になるのは次のバイトコード命令が実行されるか、プロセスがシグナルを受信したときだけです。

    この機能は PEP 768 と新しい sys.remote_exec() 関数を使って、対象プロセスに接続し、PDB コマンドを送信します。

    (Matt Wozniski と Pablo Galindo が gh-131591 で貢献しました。)

  • コード内に直接記述したブレークポイント (breakpoint() と set_trace()) は、毎回新しいインスタンスを作成する代わりに、最後に set_trace() を呼び出した Pdb インスタンスを再利用するようになりました。 これにより、display や commands などのインスタンス固有のデータが、コード内のブレークポイント間で保持されます。 (Tian Gao が gh-121450 で貢献しました。)

  • pdb.Pdb に新しい引数 mode を追加しました。 pdb が inline モードの場合、restart コマンドを無効にしました。 (Tian Gao が gh-123757 で貢献しました。)

  • inline モードで pdb を終了しようとすると、確認プロンプトが表示されるようになりました。 y、Y、<Enter>、EOF で終了を確定すると、bdb.BdbQuit を送出する代わりに sys.exit() を呼び出します。 (Tian Gao が gh-124704 で貢献しました。)

  • breakpoint() や pdb.set_trace() のようなインラインのブレークポイントは、skip パターンがあっても無視し、必ず呼び出し元のフレームでプログラムを停止するようになりました。 (Tian Gao が gh-130493 で貢献しました。)

  • pdb の複数行入力で行頭の <tab> を押すと、\t 文字を挿入する代わりに、空白 4 個のインデントを挿入するようになりました。 (Tian Gao が gh-130471 で貢献しました。)

  • pdb の複数行入力に自動インデントを導入しました。 前の行のインデントを維持するか、新しいコードブロックを検出した場合は空白 4 個のインデントを挿入します。 (Tian Gao が gh-133350 で貢献しました。)

  • 現在の asyncio タスクがある場合にアクセスするための $_asynctask を追加しました。 (Tian Gao が gh-124367 で貢献しました。)

  • asyncio コルーチンのデバッグをサポートする pdb.set_trace_async() を追加しました。 この関数では await 文を使えます。 (Tian Gao が gh-132576 で貢献しました。)

  • pdb に表示されるソースコードが、構文に応じて強調表示されるようになりました。 pdb.Pdb に新しく追加した colorize 引数に加えて、デフォルトの 対話 シェルと同じ方法でもこの機能を制御できます。 (Tian Gao and Łukasz Langa が gh-133355 で貢献しました。)

pickle

  • pickle モジュールのデフォルトのプロトコルバージョンを 5 にしました。 詳細は pickle プロトコル を参照してください。

  • pickle のシリアライズエラーに、エラーの発生箇所を特定するための例外の注記を追加しました。 (Serhiy Storchaka が gh-122213 で貢献しました。)

platform

  • platform モジュールのキャッシュされた結果を無効にする invalidate_caches() 関数を追加しました。 (Bénédikt Tran が gh-122549 で貢献しました。)

pydoc

  • ヘルプ出力内の アノテーション は、通常、元のソースにより近い形式で表示されるようになりました。 (Jelle Zijlstra が gh-101552 で貢献しました。)

re

  • 正規表現 で \Z の同義として \z をサポートするようになりました。 他の多くの正規表現エンジンでも、\z は曖昧さなく解釈されます。 一方、\Z はエンジンによって動作が微妙に異なります。 (Serhiy Storchaka が gh-133306 で貢献しました。)

  • 正規表現 の \B が空の入力文字列にもマッチするようになり、常に \b の逆を表すようになりました。 (Serhiy Storchaka が gh-124130 で貢献しました。)

socket

  • Bluetooth ソケットのサポートを改善し、不具合を修正しました。

    • NetBSD と DragonFly BSD での Bluetooth ソケットのサポートを修正しました。 (Serhiy Storchaka が gh-132429 で貢献しました。)

    • FreeBSD での BTPROTO_HCI のサポートを修正しました。 (Victor Stinner が gh-111178 で貢献しました。)

    • FreeBSD で BTPROTO_SCO をサポートするようになりました。 (Serhiy Storchaka が gh-85302 で貢献しました。)

    • FreeBSD の BTPROTO_L2CAP のアドレスで、cid と bdaddr_type をサポートするようになりました。 (Serhiy Storchaka が gh-132429 で貢献しました。)

    • Linux の BTPROTO_HCI のアドレスで、channel をサポートするようになりました。 (Serhiy Storchaka が gh-70145 で貢献しました。)

    • Linux の BTPROTO_HCI のアドレスとして整数を受け付けるようになりました。 (Serhiy Storchaka が gh-132099 で貢献しました。)

    • BTPROTO_L2CAP の getsockname() で、cid を返すようになりました。 (Serhiy Storchaka が gh-132429 で貢献しました。)

    • 多数の新しい定数を追加しました。 (Serhiy Storchaka が gh-132734 で貢献しました。)

ssl

  • ssl モジュールが TLSv1.3 のハンドシェイク後のクライアント認証 (PHA) をサポートするかどうかを、真偽値 HAS_PHA で示すようになりました。 (Will Childs-Klein が gh-128036 で貢献しました。)

struct

  • struct モジュールで、C の float complex 型と double complex 型をサポートするようになりました (書式文字はそれぞれ 'F' と 'D')。 (Sergey B Kirpichev が gh-121249 で貢献しました。)

symtable

sys

  • 特殊な構成の Python ビルドにだけ存在する、これまでドキュメント化されていなかった特殊関数 sys.getobjects() が、呼び出し元とは別のインタープリタのオブジェクトを返す場合もあるようになりました。 (Eric Snow が gh-125286 で貢献しました。)

  • オブジェクトが 不死 かどうかを判定する sys._is_immortal() を追加しました。 (Peter Bierma が gh-128509 で貢献しました。)

  • FreeBSD の sys.platform は、メジャーバージョン番号を含まなくなりました。 'freebsd13' や 'freebsd14' ではなく、常に 'freebsd' になります。 (Michael Osipov が gh-129393 で貢献しました。)

  • sys._clear_type_cache() が DeprecationWarning を出すようになりました。 この関数は Python 3.13 で非推奨になりましたが、実行時の警告は出していませんでした。

  • 新しい外部デバッガインターフェースを実装する sys.remote_exec() を追加しました。 詳細は PEP 768 を参照してください。 (Pablo Galindo Salgado, Matt Wozniski, and Ivona Stojanovic が gh-131591 で貢献しました。)

  • ジャストインタイムコンパイルの状態を調べるためのユーティリティを含む、sys._jit 名前空間を追加しました。 (Brandt Bucher が gh-133231 で貢献しました。)

sys.monitoring

  • 二つの新しい監視イベント、BRANCH_LEFT と BRANCH_RIGHT を追加しました。 これらは BRANCH イベントに取って代わり、従来のイベントは非推奨になりました。 (Mark Shannon が gh-122548 で貢献しました。)

  • ツール識別子に関連付けられたすべてのイベントとコールバック関数の登録を解除する sys.monitoring.clear_tool_id() を追加しました。 sys.monitoring.free_tool_id() は、イベントとコールバックを登録したままにするのではなく、ツール識別子を解放する前にこの関数を呼び出すようになりました。 (Tian Gao が gh-116750 で貢献しました。)

sysconfig

tarfile

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

  • ディレクトリが削除されたか、別の種類のファイルに置き換えられている場合、extractall() はそのディレクトリの属性の調整をスキップするようになりました。 (Petr Viktorin が gh-127987 and 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.)

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

threading

tkinter

  • tkinter のウィジェットメソッド after() と after_idle() がキーワード引数を受け付けるようになりました。 (Zhikang Yan が gh-126899 で貢献しました。)

  • tkinter.OptionMenu と tkinter.ttk.OptionMenu に名前を指定できるようになりました。 (Zhikang Yan が gh-130482 で貢献しました。)

turtle

types

typing

  • types.UnionType と typing.Union は、互いに同じ型を表す別名になりました。 そのため、旧式のユニオン (Union[int, str] で作成) と新しい形式のユニオン (int | str) は、同じ実行時の型のインスタンスを作成します。 これにより二つの構文の動作が統一されますが、実行時に型を調べるユーザーに影響し得る、いくつかの動作の違いが生じます。

    • ユニオンを作成するどちらの構文も、repr() で同じ文字列を返すようになりました。 例えば、repr(Union[int, str]) は "typing.Union[int, str]" ではなく "int | str" になります。

    • 旧式の構文で作成したユニオンは、キャッシュされなくなりました。 以前は Union[int, str] を複数回評価すると同じオブジェクトを返していました (Union[int, str] is Union[int, str] は True でした) が、今は二つの異なるオブジェクトを返します。 ユニオンが等しいかを比較するには、is ではなく == を使ってください。 新しい形式のユニオンは、以前からこのようにはキャッシュされていません。 typing.Union への添字指定で多数のユニオンを作成するプログラムでは、この変更でメモリ使用量が増える可能性があります。 ただし、いくつかの要因がこのコストを相殺します。 PEP 649 により、Python 3.14 ではアノテーション内のユニオンはデフォルトでは評価されません。 また、types.UnionType のインスタンス自体が、以前の Python で Union[] が返していたオブジェクトよりもずっと小さく、キャッシュの削除自体もメモリを節約します。 そのため、ほとんどのユーザーにとって、この変更でメモリ使用量が大幅に増えることはないでしょう。

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

    • typing.Union 自体を isinstance() のチェックに使えるようになりました。 例えば、以前は TypeError になっていた isinstance(int | str, typing.Union) が、True を返すようになります。

    • typing.Union オブジェクトの __args__ 属性が書き込み不可になりました。

    • Union オブジェクトの属性は、どれも設定できなくなりました。 以前のバージョンでも設定できたのは二重アンダースコア付きの属性だけで、ドキュメント化された機能ではなく、多くの場合に気付きにくい不具合がありました。

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

  • TypeAliasType がアスタリスクによるアンパックをサポートするようになりました。

unicodedata

  • Unicode データベースを Unicode 16.0.0 に更新しました。

unittest

  • unittest の出力がデフォルトで色付きになりました。 これは 環境変数 で制御できます。 (Hugo van Kemenade が gh-127221 で貢献しました。)

  • unittest のテスト探索で、開始ディレクトリとして 名前空間パッケージ を再びサポートするようになりました。 この機能は Python 3.11 で削除されていました。 (Jacob Walls が gh-80958 で貢献しました。)

  • TestCase クラスに、特定の用途に合わせたテストを行ういくつかのメソッドを追加しました。

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

urllib

  • urllib.request が RFC 7616 で定義された SHA-256 によるダイジェスト認証をサポートし、HTTP ダイジェスト認証のアルゴリズムを強化しました。 (Calvin Bui が gh-128193 で貢献しました。)

  • file: URL の解析と生成について、使いやすさと標準への準拠を改善しました。

    url2pathname() の変更:

    • 新しい require_scheme 引数が真の場合、完全な URL を受け付けます。

    • URL の authority がローカルのホスト名と一致する場合は、その部分を取り除きます。

    • 新しい resolve_host 引数が真の場合、URL の authority がローカル IP アドレスに解決されれば、その部分を取り除きます。

    • URL のクエリとフラグメントの部分を取り除きます。

    • URL の authority がローカルでない場合は URLError を送出します。 ただし、Windows では従来どおり UNC パスを返します。

    pathname2url() の変更:

    • 新しい add_scheme 引数が真の場合、完全な URL を返します。

    • パスがスラッシュで始まる場合は、空の URL authority を含めます。 例えば、パス /etc/hosts は URL ///etc/hosts に変換されます。

    Windows でドライブ文字を大文字に変換しなくなりました。 また、ドライブ文字の直後以外に : 文字があっても OSError を送出しなくなりました。

    (Barney Gale が gh-125866 で貢献しました。)

uuid

  • RFC 9562 で定義された UUID バージョン 6、7、8 を、それぞれ uuid6()、uuid7()、uuid8() でサポートするようになりました。 (Bénédikt Tran が gh-89083 で貢献しました。)

  • RFC 9562 で定義された Nil UUID と Max UUID を表す NIL と MAX が利用できるようになりました。 (Nick Pope が gh-128427 で貢献しました。)

  • python -m uuid --count により、コマンドラインで複数の UUID を一度に生成できるようになりました。 (Simon Legner が gh-131236 で貢献しました。)

webbrowser

  • BROWSER 環境変数内の名前で、webbrowser モジュールに登録済みのブラウザを参照できるようになりました。 常に新しいブラウザのコマンドを生成するとは限らなくなります。

    これにより、macOS でサポートされるブラウザのいずれかの名前を BROWSER に設定できます。

zipfile

  • ZipFile.writestr で使う ZipInfo オブジェクトに適切なデフォルト値を設定する、ZipInfo._for_archive メソッドを追加しました。 (Bénédikt Tran が gh-123424 で貢献しました。)

  • 再現可能なビルドへの対応を改善するため、ZipFile.writestr() が SOURCE_DATE_EPOCH 環境変数を参照するようになりました。 (Jiahao Li が gh-91279 で貢献しました。)

最適化

asyncio

  • ネイティブのタスク にスレッドごとの双方向連結リストを導入したことで、標準ベンチマークの結果が 10~20% 改善し、メモリ使用量も減りました。 これにより、python -m asyncio pstree などの外部のイントロスペクションツールが、すべてのスレッドで実行中の asyncio タスクの呼び出しグラフを調べられます。 (Kumar Aditya が gh-107803 で貢献しました。)

  • このモジュールが フリースレッドビルド を正式にサポートするようになりました。 これにより複数のイベントループを別々のスレッドで並列実行でき、スレッド数に比例して処理性能が向上します。 (Kumar Aditya が gh-128002 で貢献しました。)

base64

  • b16decode() が最大 6 倍高速になりました。 (Bénédikt Tran, Chris Markiewicz, and Adam Turner が gh-118761 で貢献しました。)

bdb

  • 基本デバッガーに sys.monitoring に基づくバックエンドが追加されました。 Bdb クラスの新しい backend 引数に 'monitoring' を渡すと選択できます。 (Tian Gao が gh-124533 で貢献しました。)

difflib

  • IS_LINE_JUNK() 関数が最大 2 倍高速になりました。 (Adam Turner and Semyon Moroz が gh-130167 で貢献しました。)

gc

  • Python 3.14.5 以降:

    Python 3.14.0–3.14.4 には新しいインクリメンタルなガベージコレクタが搭載されていました。 しかし、本番環境でメモリ使用量が大幅に増加するという 報告 が複数寄せられたため、3.13 の世代別 GC に戻されました。 Python 3.14.5 以降では、この世代別 GC が使われています。

  • 以前の Python 3.14.0~3.14.4:

    新しい インクリメンタルなガベージコレクタ により、ヒープが大きい場合の最大停止時間が 10 分の 1 以下に短縮されます。

    この最適化により、get_threshold() と set_threshold() の結果の意味が、get_count() と get_stats() とともに変わりました。

    • 後方互換性のため、get_threshold() は引き続き 3 要素のタプルを返します。 最初の値は従来と同じく若い世代のコレクションの閾値です。 2 番目の値は古い世代を走査する速さを決めます (デフォルトは 10 で、値が大きいほど古い世代の走査が遅くなります)。 3 番目の値に意味はなくなり、常にゼロになります。

    • set_threshold() は 3 番目以降の引数を無視するようになりました。

    • get_count() と get_stats() は引き続き同じ形式の結果を返します。 唯一の違いは、結果が若い世代・中間世代・古い世代を指す代わりに、若い世代と、古い世代の aging 領域および collecting 領域を指すことです。

    つまり、循環 GC の動作を操作するコードは意図したとおりには動かないかもしれませんが、悪影響を及ぼす可能性は極めて低いと考えられます。 それ以外のコードは問題なく動作します。

    (Mark Shannon が gh-108362 で貢献しました。)

io

  • ファイルを開いて読み込む際のシステムコールの回数が減りました。 OS にキャッシュされた小さなファイルを丸ごと読み込む処理が最大 15% 高速になりました。 (Cody Maloney and Victor Stinner が gh-120754 and gh-90102 で貢献しました。)

pathlib

  • Path.read_bytes がバッファリングなしのモードでファイルを開くようになり、ファイル全体の読み込みが 9% から 17% 高速になりました。 (Cody Maloney が gh-120754 で貢献しました。)

pdb

  • pdb が sys.settrace() と sys.monitoring に基づく 2 つのバックエンドをサポートするようになりました。 pdb CLI または breakpoint() を使う場合は常に sys.monitoring バックエンドが使われます。 pdb.Pdb やその派生クラスを明示的にインスタンス化する場合、デフォルトでは sys.settrace() バックエンドが使われますが、設定で変更できます。 (Tian Gao が gh-124533 で貢献しました。)

textwrap

  • dedent() 関数を最適化し、平均で 2.4 倍高速化しました。 入力が大きいほど改善の幅も大きくなります。 また、スペースとタブ以外の空白文字を含む空行の正規化が不完全だったバグを修正しました。

uuid

  • uuid3() と uuid5() がともに、16 バイトの名前では約 40%、1024 バイトの名前では約 20% 高速になりました。 それより長い名前の処理性能は変わりません。 (Bénédikt Tran が gh-128150 で貢献しました。)

  • uuid4() が約 30% 高速になりました。 (Bénédikt Tran が gh-128150 で貢献しました。)

zlib

  • Windows の標準のバイナリでは、zlib モジュールの実装に zlib-ng が使われるようになりました。 zlib-ng と従来使われていた zlib の実装との間に、既知の非互換性はありません。 これにより、すべての圧縮レベルで性能が向上すると期待されます。

    ただし、zlib.Z_BEST_SPEED (1) では従来の実装より圧縮率が大幅に下がる可能性がある一方、圧縮にかかる時間も大幅に短縮されます。

    (Steve Dower が gh-91349 で貢献しました。)

削除

argparse

  • BooleanOptionalAction の type、choices、metavar 引数を削除しました。 これらは Python 3.12 から非推奨でした。 (Nikita Sobolev が gh-118805 で貢献しました。)

  • 引数グループで add_argument_group() を呼ぶと ValueError が送出されるようになりました。 同様に、相互排他グループで add_argument_group() または add_mutually_exclusive_group() を呼ぶと、どちらも ValueError が送出されます。 この「入れ子」はサポートされておらず、正しく動かないことも多く、継承により意図せず利用可能になっていたものです。 この機能は Python 3.11 から非推奨でした。 (Savannah Ostrowski が gh-127186 で貢献しました。)

ast

  • 以下のクラスを削除しました。 これらは Python 3.8 から Constant の非推奨の別名となっており、Python 3.12 から非推奨の警告を出していました。

    • Bytes

    • Ellipsis

    • NameConstant

    • Num

    • Str

    これらの削除に伴い、NodeVisitor の独自のサブクラスに定義した visit_Num、visit_Str、visit_Bytes、visit_NameConstant、visit_Ellipsis メソッドは、NodeVisitor サブクラスが AST を走査するときに呼ばれなくなりました。 代わりに visit_Constant メソッドを定義してください。

    (Alex Waygood が gh-119562 で貢献しました。)

  • ast.Constant の以下の非推奨のプロパティを削除しました。 これらは、今回削除された AST クラスとの互換性のために存在していました。

    • Constant.n

    • Constant.s

    代わりに Constant.value を使ってください。 (Alex Waygood が gh-119562 で貢献しました。)

asyncio

  • Python 3.12 から非推奨だった以下のクラス、メソッド、関数を削除しました。

    • AbstractChildWatcher

    • FastChildWatcher

    • MultiLoopChildWatcher

    • PidfdChildWatcher

    • SafeChildWatcher

    • ThreadedChildWatcher

    • AbstractEventLoopPolicy.get_child_watcher()

    • AbstractEventLoopPolicy.set_child_watcher()

    • get_child_watcher()

    • set_child_watcher()

    (Kumar Aditya が gh-120804 で貢献しました。)

  • asyncio.get_event_loop() は現在のイベントループがない場合に RuntimeError を送出するようになり、イベントループを暗黙に作成しなくなりました。

    (Kumar Aditya が gh-126353 で貢献しました。)

    asyncio.get_event_loop() を使うパターンはいくつかありますが、その大半は asyncio.run() で置き換えられます。

    非同期関数を実行するだけなら、asyncio.run() を使ってください。

    変更前:

    async def main():
        ...
    
    
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(main())
    finally:
        loop.close()
    

    変更後:

    async def main():
        ...
    
    asyncio.run(main())
    

    ソケットで待ち受けるサーバなどを起動し、その後ずっと実行し続けたい場合は、asyncio.run() と asyncio.Event を使ってください。

    変更前:

    def start_server(loop): ...
    
    loop = asyncio.get_event_loop()
    try:
        start_server(loop)
        loop.run_forever()
    finally:
        loop.close()
    

    変更後:

    def start_server(loop): ...
    
    async def main():
        start_server(asyncio.get_running_loop())
        await asyncio.Event().wait()
    
    asyncio.run(main())
    

    イベントループで処理を実行し、その前後にブロッキングするコードを実行したい場合は、asyncio.Runner を使ってください。

    変更前:

    async def operation_one(): ...
    def blocking_code(): ...
    async def operation_two(): ...
    
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(operation_one())
        blocking_code()
        loop.run_until_complete(operation_two())
    finally:
        loop.close()
    

    変更後:

    async def operation_one(): ...
    def blocking_code(): ...
    async def operation_two(): ...
    
    with asyncio.Runner() as runner:
        runner.run(operation_one())
        blocking_code()
        runner.run(operation_two())
    

email

  • email.utils.localtime() の isdst 引数を削除しました。 この引数は Python 3.12 から非推奨で、無視されていました。 (Hugo van Kemenade が gh-118798 で貢献しました。)

importlib.abc

itertools

  • itertools のイテレータから、コピー、深いコピー、pickle 化のサポートを削除しました。 これらの操作は Python 3.12 から DeprecationWarning を出していました。 (Raymond Hettinger が gh-101588 で貢献しました。)

pathlib

  • Path に追加のキーワード引数を渡す機能を削除しました。 以前のバージョンでは、こうした引数はすべて無視されていました。 (Barney Gale が gh-74033 で貢献しました。)

  • PurePath.relative_to() と is_relative_to() に追加の位置引数を渡す機能を削除しました。 以前のバージョンでは、こうした引数はすべて other に結合されていました。 (Barney Gale が gh-78707 で貢献しました。)

pkgutil

  • Python 3.12 から非推奨だった get_loader() 関数と find_loader() 関数を削除しました。 (Bénédikt Tran が gh-97850 で貢献しました。)

pty

  • Python 3.12 から非推奨だった master_open() 関数と slave_open() 関数を削除しました。 代わりに pty.openpty() を使ってください。 (Nikita Sobolev が gh-118824 で貢献しました。)

sqlite3

  • sqlite3 モジュールから version と version_info を削除しました。 実行時に使われる SQLite ライブラリの実際のバージョン番号を取得するには、sqlite_version と sqlite_version_info を使ってください。 (Hugo van Kemenade が gh-118924 で貢献しました。)

  • 名前付きプレースホルダーとともにパラメータのシーケンスを使うと、ProgrammingError が送出されるようになりました。 この使い方は Python 3.12 から非推奨でした。 (Erlend E. Aasland が gh-118928 and gh-101693 で貢献しました。)

urllib

  • Python 3.11 から非推奨だった Quoter クラスを urllib.parse から削除しました。 (Nikita Sobolev が gh-118827 で貢献しました。)

  • Python 3.3 から非推奨だった URLopener クラスと FancyURLopener クラスを urllib.request から削除しました。

    myopener.open() は urlopen() で置き換えられます。 myopener.retrieve() は urlretrieve() で置き換えられます。 オープナークラスのカスタマイズは、カスタマイズしたハンドラーを build_opener() に渡すことで置き換えられます。 (Barney Gale が gh-84850 で貢献しました。)

非推奨

新たな非推奨事項

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

  • argparse:

    • add_argument_group() メソッドに、ドキュメントに記載のないキーワード引数 prefix_chars を渡すことが非推奨になりました。 (Savannah Ostrowski が gh-125563 で貢献しました。)

    • 型変換器 argparse.FileType が非推奨になりました。 リソース管理に関わる処理はすべて、引数の解析が終わった後の処理で行ってください。 (Serhiy Storchaka が gh-58032 で貢献しました。)

  • asyncio:

  • codecs: codecs.open() 関数が非推奨になり、将来の Python バージョンで削除される予定です。 代わりに open() を使ってください。 (Inada Naoki が gh-133036 で貢献しました。)

  • ctypes:

    • Windows 以外のプラットフォームで、Structure._pack_ を設定して MSVC 互換のデフォルトのメモリレイアウトを使うことが非推奨になり、Python 3.19 で削除される予定です。 代わりに Structure._layout_ を 'ms' に設定してください。 (Petr Viktorin が gh-131747 で貢献しました。)

    • 文字列を指定して ctypes.POINTER() を呼び出すことが非推奨になりました。 自己参照する構造体には 不完全型 を使ってください。 また、内部の ctypes._pointer_type_cache も非推奨になりました。 更新された実装の詳細は ctypes.POINTER() を参照してください。 (Sergey Myrianov が gh-100926 で貢献しました。)

  • functools: functools.reduce() の Python 実装を function や sequence をキーワード引数として指定して呼び出すことが非推奨になりました。 これらの引数は Python 3.16 で位置専用になります。 (Kirill Podoprigora が gh-121676 で貢献しました。)

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

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

  • nturl2path: このモジュールが非推奨になりました。 代わりに urllib.request.url2pathname() と pathname2url() を呼び出してください。 (Barney Gale が gh-125866 で貢献しました。)

  • os: os.popen() 関数と os.spawn* 関数が ソフト非推奨 になりました。 新しいコードではこれらを使わないでください。 代わりに subprocess モジュールを推奨します。 (Victor Stinner が gh-120743 で貢献しました。)

  • pathlib: pathlib.PurePath.as_uri() が非推奨になり、Python 3.19 で削除予定です。 代わりに pathlib.Path.as_uri() を使ってください。 (Barney Gale が gh-123599 で貢献しました。)

  • pdb: ドキュメントに記載のない pdb.Pdb.curframe_locals 属性が、非推奨の読み出し専用プロパティになりました。 このプロパティは将来の Python バージョンで削除される予定です。 Python 3.13 で PEP 667 により低オーバーヘッドでフレームのローカル変数に動的にアクセスできるようになったため、この属性に保存していたフレームのローカル変数のキャッシュへの参照は不要になりました。 派生デバッガーでは、Python 3.13 以降は pdb.Pdb.curframe.f_locals に直接アクセスしてください。 (Tian Gao が gh-124369 and gh-125951 で貢献しました。)

  • symtable: 関心が寄せられていないため symtable.Class.get_methods() が非推奨になり、Python 3.16 で削除予定です。 (Bénédikt Tran が gh-119698 で貢献しました。)

  • tkinter: tkinter.Variable の trace_variable()、trace_vdelete()、trace_vinfo() メソッドが非推奨になりました。 代わりに trace_add()、trace_remove()、trace_info() を使ってください。 (Serhiy Storchaka が gh-120220 で貢献しました。)

  • urllib.parse: parse_qsl() と parse_qs() に、偽と評価されるオブジェクト (0 や [] など) を渡すことが非推奨になりました。 ただし、空文字列、バイト列類似オブジェクト、None は除きます。 (Serhiy Storchaka が gh-116897 で貢献しました。)

Python 3.15 で削除予定

  • インポートシステム:

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

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

  • ctypes:

    • ドキュメント化されていない ctypes.SetPointerType() 関数は Python 3.13 から非推奨です。

  • http.server:

    • 古く、ほとんど使われていない CGIHTTPRequestHandler は Python 3.13 から非推奨です。 直接の代替はありません。 Web サーバーとリクエストハンドラーを接続するには、CGI 以外なら どの方法でも よりよい選択です。

    • python -m http.server のコマンドラインインターフェースの --cgi フラグは Python 3.13 から非推奨です。

  • importlib:

    • load_module() メソッド:代わりに exec_module() を使ってください。

  • pathlib:

    • .PurePath.is_reserved() は Python 3.13 から非推奨です。 Windows で予約済みのパスを検出するには os.path.isreserved() を使ってください。

  • platform:

    • platform.java_ver() は Python 3.13 から非推奨です。 この関数が役立つのは Jython への対応だけで、API は分かりにくく、ほとんどテストされていません。

  • sysconfig:

  • threading:

    • RLock() は Python 3.15 から引数を受け取らなくなります。 Python 実装は引数を一切受け付けない一方、C 実装は任意の個数の位置引数やキーワード引数を受け付けてすべて無視するため、Python 3.14 から引数を渡すことは非推奨です。

  • types:

    • types.CodeType:codeobject.co_lnotab へのアクセスは、PEP 626 で 3.10 から非推奨となり、3.12 で削除予定でした。 しかし、実際に DeprecationWarning が出るようになったのは 3.12 です。 3.15 で削除される可能性があります。 (Nikita Sobolev が gh-101866 で貢献しました。)

  • typing:

    • NamedTuple クラスを作成する、ドキュメント化されていないキーワード引数による構文 (例えば Point = NamedTuple("Point", x=int, y=int)) は Python 3.13 から非推奨です。 代わりにクラスベースの構文か関数形式の構文を使ってください。

    • TypedDict の関数形式の構文で、fields パラメータを省略すること (TD = TypedDict("TD")) や None を渡すこと (TD = TypedDict("TD", None)) は Python 3.13 から非推奨です。 フィールドがない TypedDict を作成するには、class TD(TypedDict): pass または TD = TypedDict("TD", {}) を使ってください。

    • @typing.no_type_check_decorator デコレーター関数は Python 3.13 から非推奨です。 typing モジュールに追加されてから8年が経過しましたが、主要な型チェッカーではまだサポートされていません。

  • sre_compile、sre_constants、sre_parse モジュール。

  • wave:

    • Wave_read クラスと Wave_write クラスの getmark()、setmark()、getmarkers() メソッドは Python 3.13 から非推奨です。

  • zipimport:

    • zipimport.zipimporter.load_module() は Python 3.10 から非推奨です。 代わりに exec_module() を使ってください。 (gh-125746。)

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() を使ってください。

CPython バイトコードの変更

  • オペコード BINARY_SUBSCR を、NB_SUBSCR を oparg に持つ BINARY_OP オペコードで置き換えました。 (Irit Katriel が gh-100239 で貢献しました。)

  • 新しい Interpolation インスタンスと Template インスタンスをそれぞれ構築する BUILD_INTERPOLATION オペコードと BUILD_TEMPLATE オペコードを追加しました。 (Lysandros Nikolaou ほかが gh-132661 で貢献しました。 PEP 750: テンプレート文字列 も参照してください)。

  • BUILD_CONST_KEY_MAP オペコードを削除しました。 代わりに BUILD_MAP を使ってください。 (Mark Shannon が gh-122160 で貢献しました。)

  • LOAD_ASSERTION_ERROR オペコードを LOAD_COMMON_CONSTANT で置き換え、NotImplementedError の読み込みをサポートしました。

  • LOAD_FAST_BORROW オペコードと LOAD_FAST_BORROW_LOAD_FAST_BORROW オペコードを追加しました。 フレーム内の参照がスタックに読み込まれた参照より長く存続するとインタープリタが証明できる場合に、参照カウントのオーバーヘッドを削減します。 (Matt Page が gh-130704 で貢献しました。)

  • oparg と等しい小さな整数をスタックに積む LOAD_SMALL_INT オペコードを追加しました。 RETURN_CONST オペコードは使われなくなったため削除しました。 (Mark Shannon が gh-125837 で貢献しました。)

  • 新しい LOAD_SPECIAL 命令を追加しました。 with 文と async with 文のコードは、この新しい命令を使って生成されます。 BEFORE_WITH 命令と BEFORE_ASYNC_WITH 命令を削除しました。 (Mark Shannon が gh-120507 で貢献しました。)

  • 「仮想」イテレータをサポートする POP_ITER オペコードを追加しました。 (Mark Shannon が gh-132554 で貢献しました。)

擬似命令

  • アノテーションの遅延評価 で、モジュールレベルのアノテーションが一部だけ実行される場合に対応する ANNOTATIONS_PLACEHOLDER 擬似命令を追加しました。 (Jelle Zijlstra が gh-130907 で貢献しました。)

  • インラインキャッシュから取得した一組の関数 (ガード関数と特殊化関数) を実行する BINARY_OP_EXTEND 擬似命令を追加しました。 (Irit Katriel が gh-100239 で貢献しました。)

  • CALL_KW に 3 つの特殊化を追加しました。 Python 関数の呼び出し用の CALL_KW_PY、束縛メソッドの呼び出し用の CALL_KW_BOUND_METHOD、それ以外の呼び出し用の CALL_KW_NON_PY です。 (Mark Shannon が gh-118093 で貢献しました。)

  • スタックに影響を与えない条件付きジャンプである JUMP_IF_TRUE 擬似命令と JUMP_IF_FALSE 擬似命令を追加しました。 これらは COPY 1、TO_BOOL、POP_JUMP_IF_TRUE/FALSE という命令列で置き換えられます。 (Irit Katriel が gh-124285 で貢献しました。)

  • LOAD_CONST_MORTAL 擬似命令を追加しました。 (Mark Shannon が gh-128685 で貢献しました。)

  • LOAD_CONST と同じ動作を行い、不死オブジェクトではより効率のよい LOAD_CONST_IMMORTAL 擬似命令を追加しました。 (Mark Shannon が gh-125837 で貢献しました。)

  • sys.monitoring が分岐イベント (BRANCH_LEFT など) を記録するために使う NOT_TAKEN 擬似命令を追加しました。 (Mark Shannon が gh-122548 で貢献しました。)

C API の変更

Python 設定 C API

C 構造体に依存せず Python の初期化を設定でき、将来 ABI 互換性を保った変更も行える PyInitConfig C API を追加しました。

組み込み拡張モジュールを追加できる PyInitConfig_AddModule() を追加し、PEP 587 の PyConfig C API を補完しました。 この機能は従来「inittab」と呼ばれていました。

現在のランタイム設定を取得・設定する PyConfig_Get() 関数と PyConfig_Set() 関数を追加しました。

PEP 587 「Python の初期化設定」は、Python の初期化を設定するすべての方法を統合しました。 今回の PEP はさらに、Python の事前初期化と初期化の設定を単一の API に統合します。 また、API をさらに簡素化するため、Python を組み込む際の選択肢を、PEP 587 の「Python」と「Isolated」の 2 つではなく、1 つだけにしています。

CPython の実装の詳細と意図的に強く結び付く用途では、より低レベルの PEP 587 の PyConfig API を引き続き使えます。 例えば、設定の仕組みを含めた CPython の CLI の全機能を再現する場合などです。

(Victor Stinner が gh-107954 で貢献しました。)

参考

PEP 741 と PEP 587

C API の新機能

Limited C API の変更

削除された C API

  • ミュータブルな基底型を持つ イミュータブルな型 の作成は Python 3.12 で非推奨になり、今回から TypeError が送出されます。 (Nikita Sobolev が gh-119775 で貢献しました。)

  • Python 3.12 で非推奨になった PyDictObject.ma_version_tag メンバーを削除しました。 代わりに PyDict_AddWatcher() API を使ってください。 (Sam Gross が gh-124296 で貢献しました。)

  • 非公開関数 _Py_InitializeMain() を削除しました。 これは PEP 587 により Python 3.8 に追加された 暫定 API でした。 (Victor Stinner が gh-129033 で貢献しました。)

  • ドキュメントに記載のない API Py_C_RECURSION_LIMIT と PyThreadState.c_recursion_remaining を削除しました。 これらは 3.13 で追加されたもので、非推奨期間を設けずに削除されました。 C コードで再帰の暴走を防ぐには Py_EnterRecursiveCall() を使ってください。 (Petr Viktorin が gh-133079 で削除しました。 gh-130396 も参照してください。)

非推奨の C API

Python 3.15 で削除予定

Python 3.16 で削除予定

  • 同梱されている libmpdec。

Python 3.18 で削除予定

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

以下の API は非推奨となり、削除される予定ですが、現時点では削除時期は決まっていません。

ビルドの変更

  • PEP 776: Emscripten が ティア 3 の正式なサポート対象プラットフォームになりました。 この取り組みの一環として、Emscripten libc のバグを 25 件以上修正しました。 Emscripten が ctypes、termios、fcntl をサポートするようになり、新しい デフォルトの対話シェル も実験的にサポートするようになりました。 (R. Hood Chatham が gh-127146, gh-127683, and gh-136931 で貢献しました。)

  • 公式の Android バイナリリリースが python.org で提供されるようになりました。

  • configure の生成に GNU Autoconf 2.72 が必要になりました。 (Erlend Aasland が gh-115765 で貢献しました。)

  • wasm32-unknown-emscripten が PEP 11 のティア 3 プラットフォームになりました。 (R. Hood Chatham が gh-127146, gh-127683, and gh-136931 で貢献しました。)

  • #pragma による python3*.lib とのリンクを Py_NO_LINK_LIB で無効にできるようになりました。 (Jean-Christophe Fillion-Robin が gh-82909 で貢献しました。)

  • CPython はセキュリティ向上のため、推奨されるコンパイラーオプションの組をデフォルトで有効にするようになりました。 無効にするには configure の --disable-safety オプションを使ってください。 性能を犠牲にしてさらに多くのコンパイラーオプションを有効にするには、--enable-slower-safety オプションを使ってください。

  • WITH_FREELISTS マクロと configure の --without-freelists オプションを削除しました。

  • configure の新しいオプション --with-tail-call-interp を使うと、実験的な末尾呼び出しインタープリタを有効にできます。 詳しくは 新しいインタープリタ を参照してください。

  • 新しいリモートデバッグのサポートを無効にするには、configure の --without-remote-debug オプションを使ってください。 セキュリティ上の理由で無効にしたい場合に役立ちます。

  • iOS および macOS のアプリで、stdout と stderr の内容をシステムログにリダイレクトするよう設定できるようになりました。 (Russell Keith-Magee が gh-127592 で貢献しました。)

  • iOS のテスト環境で、テストの実行中に出力を逐次転送できるようになりました。 また、このテスト環境は CPython 自体以外のプロジェクトのテストスイートを実行するためにも使えます。 (Russell Keith-Magee が gh-127592 で貢献しました。)

build-details.json

Python のインストールに新しいファイル build-details.json が含まれるようになりました。 これは CPython のビルド情報を含む静的な JSON ドキュメントで、コードを実行せずに情報を調べられます。 Python ランチャーやクロスコンパイルなどの用途に役立ちます。

build-details.json は、プラットフォームに依存しない標準ライブラリのディレクトリにインストールしなければなりません。 これは sysconfig のインストールパス 'stdlib' に対応し、sysconfig.get_path('stdlib') を実行して取得できます。

参考

PEP 739 -- build-details.json 1.0 -- Python のビルド情報を記述する静的なファイル

PGP 署名の提供終了

Python 3.14 以降のリリースでは PGP (Pretty Good Privacy) 署名を提供しません。 CPython の配布物を検証するには、Sigstore の検証資料 を使う必要があります。 Python 3.11 以降、リリースは Sigstore を使って署名されています。

このリリース手順の変更は PEP 761 で規定されました。

フリースレッド版 Python の正式サポート

Python のフリースレッドビルドがサポート対象となり、実験段階ではなくなりました。 これは、フリースレッド版 Python を正式にサポートしつつ、引き続き任意の選択肢とする フェーズ II の開始に当たります。

フリースレッド化チームは、このプロジェクトが正しい方向に進んでいると確信しています。 Python コミュニティ全体でフリースレッド化をより広く採用できるよう、継続的に尽力してくださっている皆さんに感謝します。

これらの提言とこの PEP の採択を受け、Python 開発者コミュニティは、フリースレッド化が現在も将来もサポートされる Python のビルドオプションであり、適切な非推奨の計画なしには削除されないことを広く伝えていくべきです。

フリースレッド版を Python のデフォルトまたは唯一のビルドとする フェーズ III への移行は、まだ決まっていません。 この判断は CPython 自体とコミュニティの双方の多くの要因に左右され、将来に委ねられています。

実験的な JIT コンパイラーを含むバイナリリリース

macOS と Windows の公式リリースバイナリに、実験的な Just-In-Time (JIT) コンパイラーが含まれるようになりました。 本番環境での使用は 推奨しません が、環境変数 PYTHON_JIT=1 を設定すると試せます。 ソースからビルドする利用者や再配布者は、設定オプション --enable-experimental-jit=yes-off で同様の動作にできます。

JIT はまだ初期段階にあり、活発に開発が進められています。 そのため、有効にした場合の典型的な性能変化は、ワークロードに応じて 10% の低速化から 20% の高速化まで幅があります。 テストや評価を助けるため、sys._jit 名前空間に状態を調べる関数を用意しました。 sys._jit.is_available() で現在の実行ファイルが JIT コンパイルに対応しているかを調べ、sys._jit.is_enabled() で現在のプロセスで JIT コンパイルが有効になっているかを調べられます。

現在の最も大きな機能上の制約は、gdb や perf などのネイティブデバッガーやプロファイラーが JIT フレームをたどってスタックを巻き戻せないことです (pdb や profile などの Python のデバッガーやプロファイラーは、変更せずに引き続き動作します)。 フリースレッドビルドは JIT コンパイルをサポートしていません。

バグや大きな性能低下に遭遇した場合は、ぜひ報告してください。

参考

PEP 744

Python 3.14 への移行

このセクションでは前述の変更とバグフィックスにより必要となるかもしれないコードの変更を列挙します:

Python API の変更

  • macOS 以外の Unix プラットフォームでは、multiprocessing と ProcessPoolExecutor のデフォルトの 開始方式 が fork から forkserver に変わりました。

    詳しくは (1) と (2) を参照してください。

    multiprocessing や concurrent.futures で NameError や pickle 化のエラーが発生する場合は、forkserver の制約 を参照してください。

    この変更は Windows と macOS には影響せず、デフォルトの開始方式は引き続き 'spawn' です。

  • functools.partial がメソッドデスクリプタになりました。 以前の動作を保ちたい場合は staticmethod() で包んでください。 (Serhiy Storchaka and Dominykas Grigonis が gh-121027 で貢献しました。)

  • ガベージコレクタがインクリメンタルになった ため、gc.collect() の動作が少し変わります。

    • gc.collect(1): 第 1 世代の回収ではなく、インクリメンタルなガベージコレクションを 1 回進めます。

    • gc.collect() のほかの呼び出しに変更はありません。

  • locale.nl_langinfo() 関数が、場合によって LC_CTYPE ロケールを一時的に設定するようになりました。 この一時的な変更は他のスレッドにも影響します。 (Serhiy Storchaka が gh-69998 で貢献しました。)

  • pickle.dump() と pickle.dumps() が、一部の失敗に対して PicklingError を送出するようになりました。 従来は実装によって AttributeError、ImportError、ValueError、UnicodeEncodeError、PicklingError が送出されていた失敗です (例えばローカルオブジェクトや、所属するモジュールをインポートできないオブジェクトの pickle 化など)。 元の例外は PicklingError に連鎖されます。 これらの例外を捕捉していたコードでは、PicklingError も捕捉してください。 (Serhiy Storchaka が gh-122311 で貢献しました。)

  • types.UnionType が typing.Union の別名となり、一部の動作が変わりました。 詳しくは 前述の説明 を参照してください。 (Jelle Zijlstra が gh-105499 で貢献しました。)

  • アノテーションの実行時の動作がさまざまな点で変わりました。 詳しくは 前述の説明 を参照してください。 アノテーションを扱う大半のコードは引き続き動作するはずですが、ドキュメントに記載のない細部の動作は変わっている場合があります。

  • mimetypes の CLI の公開に伴い、失敗時の終了ステータスが 0 から 1 に、コマンドライン引数が不正な場合の終了ステータスが 1 から 2 に変わりました。 エラーメッセージは stderr に出力されるようになりました。

  • 正規表現のパターン全体が \B の場合、空文字列にもマッチするようになりました。 これにより動作が変わる可能性があります。

  • FreeBSD では sys.platform にメジャーバージョン番号が含まれなくなりました。

アノテーションの変更 (PEP 649 と PEP 749)

この節では、アノテーションの遅延評価 に関する変更に伴い、アノテーションや、それを扱ったり調べたりする Python コードに必要となり得る変更を説明します。

ほとんどの場合、以前の Python バージョンで動作していたコードを変更する必要はありません。

アノテーションを付けたコードへの影響

例えば静的型チェッカーのためにコードにアノテーションを書いている場合、この変更はおそらく影響しません。 以前の Python バージョンと同じようにアノテーションを書き続けられます。

前方参照のためによく使われる、アノテーション内の文字列を囲む引用符は取り除ける可能性があります。 同様に、アノテーションを文字列で書かずに済むよう from __future__ import annotations を使っている場合も、対応するバージョンを Python 3.14 以降だけにすれば、そのインポートを削除できる可能性があります。 ただし、アノテーションを読み取るサードパーティライブラリに依存している場合は、引用符で囲まないアノテーションを期待どおりに扱えるよう、そのライブラリ側の変更が必要になるかもしれません。

__annotations__ を読み取るコードへの影響

オブジェクトの __annotations__ 属性を読み取るコードでは、アノテーションの遅延評価に依存するコードに対応するため、変更を加えたほうがよい場合があります。 例えば、dataclasses モジュールが採用したように、annotationlib.get_annotations() を FORWARDREF 形式で使う方法があります。

外部パッケージ typing_extensions では、Format 列挙型や get_annotations() 関数など、annotationlib モジュールの一部の機能の部分的なバックポートを提供しています。 これらを使うと、Python 3.14 の新しい動作を活用しながら複数のバージョンに対応するコードを書けます。

from __future__ import annotations

Python 3.7 で PEP 563 により導入された future 文 from __future__ import annotations は、すべてのアノテーションを文字列に変換します。

しかし、この文は現在非推奨であり、将来の Python バージョンで削除される見込みです。 アノテーションの遅延評価をサポートしない最後のバージョンである Python 3.13 が、2029 年にサポート終了を迎えるまでは削除されません。

Python 3.14 でも、from __future__ import annotations を使うコードの動作は変わりません。

C API の変更

  • Py_Finalize() がすべてのインターンされた文字列を削除するようになりました。 そのため、Py_Finalize() の呼び出し後もインターンされた文字列を保持し、その後 Py_Initialize() を呼び出して再利用する C 拡張に対して、後方互換性のない変更になります。 この動作による問題は通常、その後の Py_Initialize() の実行中に未初期化メモリへアクセスし、クラッシュする形で現れます。 修正するには、AddressSanitizer を使ってインターンされた文字列に由来する解放後の使用を特定し、モジュール終了時にその文字列を解放してください。 (Eddie Elizondo が gh-113601 で貢献しました。)

  • Unicode 例外オブジェクト の C API は、例外引数が UnicodeError オブジェクトでない場合に TypeError を送出するようになりました。 (Bénédikt Tran が gh-127691 で貢献しました。)

3.14.5 の主な変更

gc

  • 本番環境でメモリ使用量が大幅に増加するという 報告 が複数寄せられたため、Python 3.14.0–3.14.4 に搭載されていたインクリメンタルなガベージコレクタを、3.13 の世代別ガベージコレクタに戻しました。 詳しくは ガベージコレクション を参照してください。