What's New In Python 3.13

編集者:

Adam Turner と Thomas Wouters

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

参考

PEP 719 -- Python 3.13 リリーススケジュール

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

Python 3.13 はプログラミング言語 Python の安定版のリリースです。言語自体への変更や、実装、標準ライブラリのアップデートが含まれます。一番大きな変更点は、新しい 対話型インタープリタ 、 フリースレッドモード (PEP 703) 実行の実験的なサポート、 Just-In-Time コンパイラ (PEP 744) です。

エラーメッセージも引き続き改善され、トレースバックがデフォルトで色付き表示になりました。また、組み込み関数 locals() の戻り値のマッピングに変更を加えた際の セマンティクスの定義 が追加されました。他にも、型引数がデフォルト値をサポートするようになりました。

ライブラリでは、従来どおり使いやすさや正確性を改善するとともに、非推奨の API やモジュールを削除しました。 Python 3.11 で非推奨となった古い標準ライブラリモジュールのいくつかが、今回 削除されました (PEP 594)。

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


インタープリタの改善点:

Python のデータモデルの改善点:

  • __static_attributes__ に、クラス本体の関数から self.X の形でアクセスされる属性の名前が格納されるようになりました。

  • クラス定義の最初の行の行番号が __firstlineno__ に格納されるようになりました。

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

  • Python の 終了処理 において処理がブロックされているときに発生する新しい例外 PythonFinalizationError が追加されました。

  • argparse モジュールでコマンドラインオプションや位置引数、サブコマンドを非推奨として指定する機能が追加されました。

  • Z85 data のエンコード・デコードを行う関数 base64.z85encode() と base64.z85decode() が追加されました。

  • 多くの組み込み型や __replace__() メソッドを定義している任意のクラスに対して使用できる関数 copy.replace() が copy モジュールに追加されました。

  • dbm.sqlite3 モジュールが追加され、 dbm のデフォルトのバックエンドがこれに変更されました。

  • Linux のタイマー通知機能をもつファイル記述子を扱うための 様々な関数 が os モジュールに追加されました。

  • random モジュールが コマンドラインインターフェース を持つようになりました。

セキュリティの改善点:

C API の改善点:

  • Py_mod_gil スロットを使って、拡張モジュールが GIL を無効にした実行をサポートすることを示せるようになりました。

  • PyTime C API が追加され、システムクロックへのアクセスが提供されるようになりました。

  • PyMutex は1バイトのみを占有する新しい軽量ミューテックスとなりました。

  • 新しい 関数群 が、C API において PEP 669 の監視イベントを生成するために追加されました。

新しい型ヒントの機能:

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

重要な削除

  • PEP 594: 残っていた 19 個の「不要なバッテリー」(旧式の標準ライブラリモジュール)が標準ライブラリから削除されました。削除されたモジュールは次のとおりです: aifc、audioop、cgi、cgitb、chunk、crypt、imghdr、mailcap、msilib、nis、nntplib、ossaudiodev、pipes、sndhdr、spwd、sunau、telnetlib、uu、xdrlib。

  • 2to3 ツールと lib2to3 モジュールが削除されました( Python 3.11 で非推奨となりました)

  • tkinter.tix モジュールが削除されました( Python 3.6 で非推奨でした)

  • locale.resetlocale() 機能が削除されました。

  • typing.io と typing.re 名前空間が削除されました。

  • 連鎖した classmethod デスクリプタが削除されました。

リリーススケジュールの変更:

PEP 602 (「Python の年間リリースサイクル」)が更新され、新しいリリースの完全サポート(バグ修正)期間が 2 年に延長されました。この更新されたポリシーにより、次のような変更が適用されます:

  • Python 3.9--3.12 は1年半のフルサポート期間ののち、3年半のセキュリティ修正期間となります。

  • Python 3.13 以降のバージョンでは2年間のフルサポート期間、その後3年間のセキュリティ修正期間となります。

新しい機能

改善された対話的インタープリタ

PyPy project のコードをベースに作られた新しい Python interactive シェルがデフォルトで使われるようになりました。これからは、ターミナル上で REPL を起動すると、以下の機能が使えます:

  • 複数行の編集。履歴機能もサポート。

  • help や exit 、 quit といったREPL 固有のコマンドが直接サポートされるようになり、関数として呼び出す必要がなくなりました。

  • デフォルトでプロンプトやトレースバックが 色付きで表示 されるようになりました。

  • インタラクティブなヘルプが F1 で閲覧できるようになり、REPLとは別にコマンド履歴が記録されるようになりました。

  • F2 で履歴を閲覧できるようになりました。出力や プロンプト内の >>> と ... は表示されません。

  • F3 で「ペーストモード」に切り替え、長いコードブロックをより簡単に貼り付けることができるようになりました (F3 をもう一度押すことで通常のプロンプトに戻ることができます)。

新しいインタラクティブシェルを無効化するには、環境変数 PYTHON_BASIC_REPL をセットします。インタラクティブモードの詳細については 対話モード を参照してください。

(gh-111201 の Pablo Galindo Salgado, Łukasz Langa, and Lysandros Nikolaou らの PyPy プロジェクトのコードに基づく貢献。 Windows へのサポートは Dino Viehland, Anthony Shaw らによる貢献。)

エラーメッセージの改善

  • インタープリタは、端末にトレースバックを表示する際に デフォルトでカラー表示を使用するようになりました。この機能は、新たに導入された PYTHON_COLORS 環境変数、および標準の NO_COLOR と FORCE_COLOR 環境変数を通じて 制御できます。(この機能は Pablo Galindo Salgado により、gh-112730 にて貢献されました。)

  • よくある間違いとして、標準ライブラリのモジュールと同じ名前のスクリプトを作成してしまうことがあります。その結果エラーが発生した場合、Python はこれまでよりわかりやすいエラーメッセージを表示するようになりました:

    $ python random.py
    Traceback (most recent call last):
      File "/home/me/random.py", line 1, in <module>
        import random
      File "/home/me/random.py", line 3, in <module>
        print(random.randint(5))
              ^^^^^^^^^^^^^^
    AttributeError: module 'random' has no attribute 'randint' (consider renaming '/home/me/random.py' since it has the same name as the standard library module named 'random' and prevents importing that standard library module)
    

    同様に、スクリプトがインポートしようとするサードパーティ製モジュールと同じ名前を持ち、それによってエラーが発生した場合にも、Python はよりわかりやすいエラーメッセージを表示するようになりました:

    $ python numpy.py
    Traceback (most recent call last):
      File "/home/me/numpy.py", line 1, in <module>
        import numpy as np
      File "/home/me/numpy.py", line 3, in <module>
        np.array([1, 2, 3])
        ^^^^^^^^
    AttributeError: module 'numpy' has no attribute 'array' (consider renaming '/home/me/numpy.py' if it has the same name as a library you intended to import)
    

    (Shantanu Jain による gh-95754 での貢献)

  • エラーメッセージは、関数に誤ったキーワード引数が渡された場合に、正しいキーワード引数を提案するようになりました:

    >>> "Better error messages!".split(max_split=1)
    Traceback (most recent call last):
      File "<python-input-0>", line 1, in <module>
        "Better error messages!".split(max_split=1)
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
    TypeError: split() got an unexpected keyword argument 'max_split'. Did you mean 'maxsplit'?
    

    (Pablo Galindo Salgado と Shantanu Jain による gh-107944 での貢献)

フリースレッドの CPython

global interpreter lock (GIL) を無効化するフリースレッドモードで CPython を実行する機能が実験的に追加されました。これは実験的機能のため、デフォルトで有効にはなっていません。フリースレッドモードで実行するには別の実行ファイルが必要で、通常 python3.13t か python3.13t.exe という名前です。入手するには、公式の Windows 版・ macOS 版インストーラで フリースレッド とラベルのついたビルド済みバイナリをインストールするか、もしくは CPython のソースコードを --disable-gil オプション付きでビルドすることもできます。

フリースレッドで実行することで、CPU コアの上で並列にスレッドを実行できるため、使用可能な処理性能をフルに活かすことができます。フリースレッドモードを使うだけでどのようなソフトウェアも恩恵を受けられるわけではないものの、スレッドを活用するように設計されたプログラムであれば、マルチコアのハードウェアでより高速に実行できることになります。ただし、 フリースレッドモードは実験的機能 であり、改善が行われている最中です。バグに遭遇したり、シングルスレッドのパフォーマンスが大きく悪化する可能性があるので、注意してください。CPython のフリースレッド版ビルドでも、GIL を有効にした実行に対応しており、環境変数 PYTHON_GIL かコマンドラインオプション -X gil=1 によって有効化できます。

使用しているインタープリタがフリースレッドに対応しているかどうかは、 python -VV を実行するか、 sys.version に 「experimental free-threading build」が含まれているかどうかで確認できます。新しく追加された sys._is_gil_enabled() 関数により、 GIL が現在のプロセスで実際に有効になっているかを確認できます。

C-API 拡張モジュールは、フリースレッド用に別にビルドする必要があります。 GIL 無効状態での実行に対応している拡張モジュールは、 Py_mod_gil を使用してください。一段階初期化を使用する C 拡張は PyUnstable_Module_SetGIL() を使用することで、 GIL 無効状態での実行に対応しているかどうかを指定してください。このような仕組みをいずれも使用しないモジュールがインポートされると、環境変数 PYTHON_GIL か -X gil=0 オプションが指定されていない限り、GIL が有効化されます。フリースレッド版の Python で C 拡張を含むパッケージをインストールするには、pip のバージョン が 24.1 以上である必要があります。

この機能が実現に至ったのは、たくさんの個人開発者の方や組織のおかげです。Python やサードパーティのプロジェクトに貢献する開発者の巨大なコミュニティが、フリースレッドへの対応やテストを行ってくださいました。特に大きな貢献のあった方は以下です: Sam Gross、Ken Jin、Donghee Na、Itamar Oren、Matt Page、Brett Simmers、Dino Viehland、Carl Meyer、Nathan Goldbaum、Ralf Gommers、Lysandros Nikolaou、ほか多数。このうちの多くが Meta の従業員であり、Meta はこのプロジェクトに多大な技術的な支援をしてくださいました。

参考

PEP 703 "Making the Global Interpreter Lock Optional in CPython" に、この取り組みの理由や関連情報が記載されています。

Porting Extension Modules to Support Free-Threading: 拡張の開発者向けにコミュニティが保守している移植ガイド。

実験的な Just-in-time (JIT) コンパイラ:

CPython を --enable-experimental-jit オプション付きで configure してからビルドすると、just-in-time (JIT) コンパイラが追加され、Python プログラムの実行が速くなる可能性があります。Windows では PCbuild/build.bat --experimental-jit で JIT を有効化するか、 --experimental-jit-interpreter でティア2インタープリタを有効化してください。ビルドの必要事項やその他の補足情報は Tools/jit/README.md に掲載されています 。

--enable-experimental-jit オプションには、次の値を省略可能な引数として指定できます。 --enable-experimental-jit に値を指定しなければ、デフォルトは yes です。

  • no: Tier 2 と JIT の処理全体を無効にします。

  • yes: JIT を有効にします。 実行時に JIT を無効にするには、環境変数 PYTHON_JIT=0 を設定します。

  • yes-off: JIT をビルドしますが、デフォルトでは無効にします。 実行時に JIT を有効にするには、環境変数 PYTHON_JIT=1 を設定します。

  • interpreter: Tier 2 インタープリタを有効にし、JIT は無効にします。 PYTHON_JIT=0 を設定して実行すると、このインタープリタを無効にできます。

内部構成の概要は次のとおりです。

  • まず、特殊化された Tier 1 バイトコード から始めます。 詳しくは What’s New In Python 3.11 を参照してください。

  • Tier 1 バイトコードの実行頻度が十分に高くなると、Tier 2 IR と呼ばれる新しい内部専用の中間表現 (IR) に変換されます。 これはマイクロオペレーション ("uops") と呼ばれることもあります。

  • Tier 2 IR は Tier 1 と同じスタックベースの仮想マシンを使いますが、命令の形式は機械語への変換により適しています。

  • Tier 2 IR には複数の最適化パスがあり、解釈実行や機械語への変換の前に適用されます。

  • Tier 2 インタープリタもありますが、主に最適化処理の前半をデバッグするためのものです。 Python の構成時に --enable-experimental-jit=interpreter を指定すると有効になります。

  • JIT が有効な場合、最適化された Tier 2 IR は機械語に変換され、実行されます。

  • 機械語への変換には copy-and-patch という手法を使います。 実行時の依存関係はありませんが、新たにビルド時に LLVM が必要になります。

参考

PEP 744

(JIT は Haoran Xu と Fredrik Kjolstad の論文に着想を得て Brandt Bucher が作成。 Tier 2 IR は Mark Shannon と Guido van Rossum、Tier 2 オプティマイザーは Ken Jin によるもの。)

locals() の戻り値を変更した場合の意味の定義

従来、locals() の戻り値を変更したときの結果は、Python の各実装が定義することになっていました。 Python 3.13 からは PEP 667 により、ほとんどのコード実行スコープで CPython の従来の動作が標準化されます。 ただし、最適化されたスコープ (関数、ジェネレーター、コルーチン、内包表記、ジェネレーター式) では動作が変わり、現在値が代入されているローカル変数の独立したスナップショットを返すことが明確になります。 これには、そのスコープから参照する、クロージャーに取り込まれた非ローカル変数も含まれます。

最適化されたスコープでの locals() の意味の変更は、名前空間を明示的に指定しなければ暗黙に locals() を対象とするコード実行関数 (exec() や eval() など) のデフォルトの動作にも影響します。 以前のバージョンでは、コード実行関数を呼び出した後に locals() を呼び出して変更内容を取得できるかどうかは実装依存でした。 特に CPython では、通常は期待どおり動くように見えても、最適化されたスコープでは失敗する場合がありました。 デバッガーやコード実行のトレースツールなど、ほかのコードがそのスコープの共有スナップショットをリセットする可能性があったためです。 今後は、最適化されたスコープのローカル変数の独立したスナップショットに対して常にコードが実行されるため、後から locals() を呼び出しても変更は見えません。 このような場合に変更内容を取得するには、対象の関数に名前空間への参照を明示的に渡す必要があります。 また、実行後の名前空間を返す高水準のコード実行 API を使うように、対象のコードを変更する方が適切な場合もあります (例えば、ディスク上の Python ファイルを実行する場合は runpy.run_path())。

この変更の影響を受けるスコープで、デバッガーなどのツールがローカル変数を確実に更新できるよう、FrameType.f_locals は、そのフレームのローカル変数と、そこから参照する非ローカル変数に書き込みを直接反映するプロキシを返すようになりました。 従来は、更新が一貫せず実行時の意味も未定義の、共有された dict インスタンスを返していました。

関連する C API の変更や非推奨化も含め、詳しくは PEP 667 を参照してください。 影響を受ける Python API と C API の移植時の注意点も後述します。

(PEP と実装は Mark Shannon と Tian Gao による gh-74929 での貢献。 ドキュメントは Guido van Rossum と Alyssa Coghlan が更新。)

モバイルプラットフォームのサポート

PEP 730: iOS が PEP 11 のサポート対象プラットフォームになりました。 arm64-apple-ios と arm64-apple-ios-simulator を tier 3 としてサポートします (それぞれ、2013 年より後に発売された iPhone と iPad、および Apple silicon ハードウェアで動作する Xcode の iOS シミュレーター)。 x86_64-apple-ios-simulator (古い x86_64 ハードウェアで動作する Xcode の iOS シミュレーター) は tier 3 の対象ではありませんが、ベストエフォートでサポートします。 (PEP の執筆と実装は Russell Keith-Magee による gh-114099 での貢献。)

PEP 738: Android が PEP 11 のサポート対象プラットフォームになりました。 aarch64-linux-android と x86_64-linux-android を tier 3 としてサポートします。 32 ビットの arm-linux-androideabi と i686-linux-android は tier 3 の対象ではありませんが、ベストエフォートでサポートします。 (PEP の執筆と実装は Malcolm Smith による gh-116622 での貢献。)

参考

PEP 730, PEP 738

その他の言語変更

  • コンパイラは、docstring の各行の先頭に共通する空白を取り除くようになりました。 これにより、.pyc ファイルなどの バイトコードキャッシュ のサイズが小さくなります。 例えば、SQLAlchemy 2.0 の sqlalchemy.orm.session では、ファイルサイズが約 5% 小さくなります。 この変更は、doctest など docstring を使うツールに影響します。

    >>> def spam():
    ...     """
    ...         This is a docstring with
    ...           leading whitespace.
    ...
    ...         It even has multiple paragraphs!
    ...     """
    ...
    >>> spam.__doc__
    '\nThis is a docstring with\n  leading whitespace.\n\nIt even has multiple paragraphs!\n'
    

    (Inada Naoki による gh-81283 での貢献。)

  • クラススコープ内の アノテーションスコープ に、ラムダ式や内包表記を含められるようになりました。 クラススコープ内にある内包表記は、親のスコープにインライン展開されません。

    class C[T]:
        type Alias = lambda: T
    

    (Jelle Zijlstra による gh-109118 and gh-118160 での貢献。)

  • __future__ モジュールの相対インポートでは、future 文 の機能が有効にならなくなりました。 つまり、from .__future__ import ... 形式の文は通常の相対インポートとなり、特別な機能は有効になりません。 (Jeremiah Gabriel Pascual による gh-118216 での貢献。)

  • else ブロックで使うグローバル変数について、except ブロック内で global 宣言できるようになりました。 以前は、誤って SyntaxError が送出されていました。 (Irit Katriel による gh-111123 での貢献。)

  • インポートの仕組みが凍結モジュールを無視するかどうかを決める新しい環境変数 PYTHON_FROZEN_MODULES が追加されました。 コマンドラインオプション -X frozen_modules と同等です。 (Yilei Yang による gh-111374 での貢献。)

  • 新しい環境変数 PYTHON_PERF_JIT_SUPPORT とコマンドラインオプション -X perf_jit により、フレームポインター を使わずに動作する perf プロファイラーのサポート が追加されました。 (Pablo Galindo による gh-118518 での貢献。)

  • 新しい環境変数 PYTHON_HISTORY で、.python_history ファイルの場所を変更できるようになりました。 (Levi Sabah, Zackery Spytz and Hugo van Kemenade による gh-73965 での貢献。)

  • クラスに新しい __static_attributes__ 属性が追加されました。 コンパイラは、クラス本体の関数から self.<name> の形で代入される属性の名前をタプルにして、この属性に設定します。 (Irit Katriel による gh-115775 での貢献。)

  • コンパイラは、クラス定義の最初の行の番号を格納する __firstlineno__ 属性をクラスに作成するようになりました。 (Serhiy Storchaka による gh-118465 での貢献。)

  • 組み込み関数 exec() と eval() の globals と locals を、キーワード引数として渡せるようになりました。 (Raphael Gaschignard による gh-105879 での貢献。)

  • 組み込み関数 compile() に、新しいフラグ ast.PyCF_OPTIMIZED_AST が追加されました。 ast.PyCF_ONLY_AST と似ていますが、optimize 引数の値に応じて最適化した AST を返します。 (Irit Katriel による gh-108113 での貢献。)

  • property オブジェクトに __name__ 属性が追加されました。 (Eugene Toder による gh-101860 での貢献。)

  • RuntimeError の派生クラスである新しい例外 PythonFinalizationError が追加されました。 終了処理 の間に操作が阻止されたことを示します。 次の呼び出し可能オブジェクトは、RuntimeError の代わりに PythonFinalizationError を送出するようになりました。

    (Victor Stinner による gh-114570 での貢献。)

  • str.replace() の count をキーワード引数として渡せるようになりました。 (Hugo van Kemenade による gh-106487 での貢献。)

  • 多くの関数で、ファイル記述子の引数にブール値を渡すと警告が出るようになりました。 これにより、一部の間違いをより早く見つけやすくなります。 (Serhiy Storchaka による gh-82626 での貢献。)

  • bz2、lzma、tarfile、zipfile の圧縮ファイルやアーカイブのファイルライクオブジェクトに、name 属性と mode 属性が追加されました。 (Serhiy Storchaka による gh-115961 での貢献。)

新たなモジュール

  • dbm.sqlite3: dbm 用の SQLite バックエンドです。 (Raymond Hettinger and Erlend E. Aasland による gh-100414 での貢献。)

改良されたモジュール

argparse

  • add_argument() と add_parser() に deprecated 引数が追加され、コマンドラインオプション、位置引数、サブコマンドを非推奨にできるようになりました。 (Serhiy Storchaka による gh-83648 での貢献。)

array

  • Unicode 文字用に型コード 'w' (Py_UCS4) が追加されました。 非推奨の型コード 'u' の代わりに使用してください。 (Inada Naoki による gh-80480 での貢献。)

  • clear() メソッドを実装し、array.array を MutableSequence に登録しました。 (Mike Zimin による gh-114894 での貢献。)

ast

  • ast モジュールのノード型のコンストラクターは、受け取る引数の検査がより厳密になり、引数を省略した場合の動作がより直感的になりました。

    AST ノードの省略可能なフィールドを、インスタンスの構築時に引数として指定しない場合、そのフィールドには None が設定されるようになりました。 同様に、リストのフィールドを省略した場合は空のリストが設定され、expr_context フィールドを省略した場合は Load() がデフォルトになります。 (以前は、いずれの場合も新しく構築された AST ノードのインスタンスにその属性がありませんでした。)

    それ以外の場合に必須の引数を省略すると、ノードのコンストラクターは DeprecationWarning を出すようになりました。 Python 3.15 では例外を送出します。 同様に、AST ノードのフィールドに対応しないキーワード引数をコンストラクターに渡すことも非推奨になり、Python 3.15 では例外を送出します。

    これらの変更は、ast.AST のユーザー定義サブクラスには適用されません。 ただし、そのクラスが AST._field_types マッピングを定義して、新しい動作を明示的に選択した場合を除きます。

    (Jelle Zijlstra による gh-105858, gh-117486, and gh-118851 での貢献。)

  • ast.parse() に省略可能な引数 optimize が追加され、その値が compile() に渡されるようになりました。 これにより、最適化された AST を取得できます。 (Irit Katriel による gh-108113 での貢献。)

asyncio

  • asyncio.as_completed() は、asynchronous iterator と、待機可能オブジェクト を返す通常の iterator の両方として使えるオブジェクトを返すようになりました。 非同期の反復で生成される待機可能オブジェクトには、渡した元のタスクや Future オブジェクトが含まれるため、結果と完了したタスクを対応付けやすくなります。 (Justin Arthur による gh-77714 での貢献。)

  • asyncio.loop.create_unix_server() は、サーバーを閉じると Unix ソケットを自動的に削除するようになりました。 (Pierre Ossman による gh-111246 での貢献。)

  • DatagramTransport.sendto() を空の bytes オブジェクトで呼び出すと、長さゼロのデータグラムを送信するようになりました。 トランスポートのフロー制御でも、バッファーサイズの計算にデータグラムのヘッダーを含めるようになりました。 (Jamie Phan による gh-115199 での貢献。)

  • キューの終了を管理するための Queue.shutdown と QueueShutDown が追加されました。 (Laurie Opperman and Yves Duprat による gh-104228 での貢献。)

  • asyncio のサーバーをより強制的に閉じる Server.close_clients() メソッドと Server.abort_clients() メソッドが追加されました。 (Pierre Ossman による gh-113538 での貢献。)

  • StreamReader.readuntil() に区切り文字列のタプルを渡せるようになり、そのいずれかが見つかると読み取りが止まります。 (Bruce Merry による gh-81322 での貢献。)

  • 外部からのキャンセルと内部のキャンセルが競合した場合の TaskGroup の動作が改善されました。 例えば、2 つのタスクグループが入れ子になっていて、それぞれの子タスクで同時に例外が発生した場合、内側のタスクグループが外側の内部キャンセルを取り込んでしまい、外側のタスクグループが停止したままになることがありました。

    タスクグループが外部からキャンセルされ、同時に ExceptionGroup も送出する必要がある場合は、親タスクの cancel() メソッドを呼び出すようになりました。 これにより、次の await で CancelledError が確実に送出され、キャンセルが失われなくなります。

    この変更により、タスクグループがキャンセル回数 (cancelling()) を保持するようになったという利点もあります。

    一部の特殊なケースに対応するため、キャンセル回数がゼロになると、uncancel() が非公開の _must_cancel フラグをリセットすることがあります。

    (Arthur Tacca が gh-116720 で報告した問題をきっかけとする改善。)

  • アクティブでない TaskGroup の TaskGroup.create_task() を呼び出すと、渡されたコルーチンを閉じるようになりました (これにより、そのコルーチンが一度も await されなかったという RuntimeWarning を防ぎます)。 (Arthur Tacca and Jason Zhang による gh-115957 での貢献。)

  • create_task という名前の関数やメソッドに、タスクのコンストラクターへそのまま渡す新しい **kwargs 引数が追加されました。 この変更は 3.13.3 に誤って追加され、カスタムタスクファクトリーの API の契約を破っていました。 いくつかのサードパーティー製タスクファクトリーは、これを回避する処理を実装しました。 3.13.4 以降のリリースでは、再び以前のファクトリーの契約に従います (3.14 まで)。 回避処理が引き続き動作するよう、追加された **kwargs 引数によって、Task やカスタムタスクファクトリーへ追加のキーワード引数を渡すことは引き続き可能です。

    この変更の対象は、asyncio.create_task()、asyncio.loop.create_task()、asyncio.TaskGroup.create_task() です。 (Thomas Grainger による gh-128307 での貢献。)

base64

  • bytes を Z85 data にエンコードする z85encode() と、Z85 でエンコードされたデータを bytes にデコードする z85decode() が追加されました。 (Matan Perelman による gh-75299 での貢献。)

compileall

  • ワーカースレッド数とワーカープロセス数のデフォルト値は、os.cpu_count() ではなく os.process_cpu_count() を使って選ばれるようになりました。 (Victor Stinner による gh-109649 での貢献。)

concurrent.futures

  • ワーカースレッド数とワーカープロセス数のデフォルト値は、os.cpu_count() ではなく os.process_cpu_count() を使って選ばれるようになりました。 (Victor Stinner による gh-109649 での貢献。)

configparser

  • ConfigParser が名前のないセクションをサポートし、最上位にキーと値のペアを書けるようになりました。 新しい allow_unnamed_section 引数で有効にできます。 (Pedro Sousa Lacerda による gh-66449 での貢献。)

copy

ctypes

  • 必要な内部リファクタリングに伴い、内部のメタクラスの初期化は __new__ ではなく __init__ で行われるようになりました。 これらの内部メタクラスをサブクラス化して独自の初期化を行うプロジェクトは影響を受けます。 一般には、次のように対応します。

    • __new__ 内で super().__new__ を呼び出した後に行っていた独自の処理を、__init__ に移してください。

    • クラスを作成するには、メタクラスの __new__ メソッドだけでなく、メタクラス自体を呼び出してください。

    議論や、影響を受けたプロジェクトでの変更へのリンクは gh-124520 を参照してください。

  • ctypes.Structure オブジェクトに新しい _align_ 属性が追加され、メモリと構造体の間でデータを変換する際のアラインメントを明示的に指定できるようになりました。 (Matt Sanderson による gh-112433 での貢献。)

dbm

  • SQLite バックエンドを実装する新しいモジュール dbm.sqlite3 が追加され、dbm のデフォルトのバックエンドになりました。 (Raymond Hettinger and Erlend E. Aasland による gh-100414 での貢献。)

  • GDBM と NDBM のデータベースオブジェクトに新しい clear() メソッドが追加され、データベースの全項目を削除できるようになりました。 (Donghee Na による gh-107122 での貢献。)

dis

  • dis モジュールの関数の出力が変わり、ジャンプ先や例外ハンドラーをオフセットではなく論理的なラベルで示すようになりました。 新しいコマンドラインオプション -O または show_offsets 引数で、オフセットも追加できます。 (Irit Katriel による gh-112137 での貢献。)

  • get_instructions() は、キャッシュエントリーを独立した命令として表さなくなりました。 代わりに、Instruction の新しい cache_info フィールドに含めて返します。 get_instructions() の show_caches 引数は非推奨となり、指定しても効果がなくなりました。 (Irit Katriel による gh-112962 での貢献。)

doctest

email

  • 改行を含むヘッダーは、出力時に引用符で囲まれるようになりました。 generator は、折り返しや区切りが不適切で、複数のヘッダーとして解析されたり隣接するデータと結合されたりするヘッダーの直列化 (書き出し) を拒否するようになりました。 この安全機能を無効にする必要がある場合は、verify_generated_headers を設定してください。 (Bas Bloemsaat and Petr Viktorin による gh-121650 での貢献。)

  • getaddresses() と parseaddr() は、不正なメールアドレスに遭遇した際、不正確かもしれない値ではなく ('', '') のペアを返す場合が増えました。 両関数に省略可能な strict 引数が追加されました (デフォルトは True)。 従来の動作 (形式の不正な入力を受け付ける) にするには、strict=False を指定してください。 strict 引数が利用可能かどうかは、getattr(email.utils, 'supports_strict_parsing', False) で調べられます。 (CVE 2023-27043 の修正を改善するための、Thomas Dwyer と Victor Stinner による gh-102988 での貢献。)

enum

  • EnumType のサブクラス化をよりよくサポートするため、EnumDict が公開されました。

fractions

  • Fraction オブジェクトが、埋める文字、配置、符号の扱い、最小幅、桁のグループ化について、標準の 書式指定ミニ言語 の規則をサポートするようになりました。 (Mark Dickinson による gh-111320 での貢献。)

glob

  • シェル形式のワイルドカードを含むパスの指定を正規表現に変換する translate() 関数が追加されました。 (Barney Gale による gh-72904 での貢献。)

importlib

  • importlib.resources の次の関数で、複数の位置引数を使い、リソースのディレクトリ (またはツリー) にアクセスできるようになりました (テキストを読み取る関数の encoding と errors はキーワード専用引数になりました)。

    これらの関数は非推奨ではなくなり、削除の予定もなくなりました。 (Petr Viktorin による gh-116608 での貢献。)

  • contents() は、すべての機能を備えた Traversable API を推奨するため、引き続き非推奨です。 ただし、削除する予定はなくなりました。 (Petr Viktorin による gh-116608 での貢献。)

io

ipaddress

itertools

  • batched() に新しい strict 引数が追加されました。 これを指定すると、最後のバッチが指定されたバッチサイズより短い場合に ValueError を送出します。 (Raymond Hettinger による gh-113202 での貢献。)

marshal

  • モジュールの関数に allow_code 引数が追加されました。 allow_code=False を渡すと、Python のバージョン間で互換性のないコードオブジェクトの直列化と逆直列化を防げます。 (Serhiy Storchaka による gh-113626 での貢献。)

math

  • 新しい fma() 関数は、融合積和演算を行います。 x * y + z を丸め 1 回だけで計算するため、途中で精度が失われるのを避けられます。 C99 の fma() 関数をラップし、特殊なケースでは IEEE 754 の "fusedMultiplyAdd" 演算の仕様に従います。 (Mark Dickinson and Victor Stinner による gh-73468 での貢献。)

mimetypes

mmap

  • Windows でファイルシステムのエラーやアクセス違反によってマップされたメモリにアクセスできなくなっても、mmap がクラッシュしないようになりました。 (Jannis Weigend による gh-118209 での貢献。)

  • mmap に seekable() メソッドが追加され、シーク可能なファイルライクオブジェクトが必要な場合に使えるようになりました。 seek() メソッドは、移動後の絶対位置を返すようになりました。 (Donghee Na and Sylvie Liberman による gh-111835 での貢献。)

  • mmap に UNIX 専用の trackfd 引数が追加され、ファイル記述子を複製するかどうかを制御できるようになりました。 偽にすると、fileno で指定されたファイル記述子は複製されません。 (Zackery Spytz and Petr Viktorin による gh-78502 での貢献。)

multiprocessing

  • ワーカースレッド数とワーカープロセス数のデフォルト値は、os.cpu_count() ではなく os.process_cpu_count() を使って選ばれるようになりました。 (Victor Stinner による gh-109649 での貢献。)

os

os.path

  • 現在のシステムでパスが予約されているかを調べる isreserved() が追加されました。 この関数は Windows でのみ利用できます。 (Barney Gale による gh-88569 での貢献。)

  • Windows の isabs() は、スラッシュ (\ または /) ちょうど 1 個で始まるパスを、絶対パスと見なさなくなりました。 (Barney Gale and Jon Foster による gh-44626 での貢献。)

  • realpath() は、ファイルにアクセスできない場合でも MS-DOS 形式のファイル名を解決するようになりました。 (Moonsik Park による gh-82367 での貢献。)

pathlib

  • パス操作がサポートされていない場合に NotImplementedError の代わりに送出する UnsupportedOperation が追加されました。 (Barney Gale による gh-89812 での貢献。)

  • 'file' URI (file:///) から Path オブジェクトを作成する新しいコンストラクター Path.from_uri() が追加されました。 (Barney Gale による gh-107465 での貢献。)

  • PurePath.full_match() が追加され、再帰的なワイルドカード「**」を含むシェル形式のワイルドカードで、パスを照合できるようになりました。 (Barney Gale による gh-73435 での貢献。)

  • 低水準のパス解析と結合に使う os.path の実装を格納するクラス属性 PurePath.parser が追加されました。 値は posixpath または ntpath です。

  • Path.glob() と rglob() にキーワード専用引数 recurse_symlinks が追加されました。 (Barney Gale による gh-77609 での貢献。)

  • Path.glob() と rglob() は、「**」で終わるパターンを指定すると、ファイルとディレクトリを返すようになりました。 以前はディレクトリだけを返していました。 (Barney Gale による gh-70303 での貢献。)

  • Path.is_file、Path.is_dir、Path.owner()、Path.group() にキーワード専用引数 follow_symlinks が追加されました。 (Barney Gale による gh-105793 and Kamil Turek in gh-107962 での貢献。)

pdb

  • breakpoint() と set_trace() は、次のコード行を実行するときではなく、直ちにデバッガーに入るようになりました。 これにより、コンテキストの末尾に breakpoint() がある場合に、コンテキストを抜けてから停止することを防ぎます。 (Tian Gao による gh-118579 での貢献。)

  • sys.flags.safe_path が設定されている場合、sys.path[0] をデバッグ対象のスクリプトのディレクトリに置き換えなくなりました。 (Tian Gao and Christian Walther による gh-111762 での貢献。)

  • zipapp をデバッグ対象にできるようになりました。 (Tian Gao による gh-118501 での貢献。)

  • Pdb に新しい exceptions [exc_number] コマンドが追加され、pm() による事後デバッグ中に、連鎖した例外の間を移動できるようになりました。 (Matthias Bussonnier による gh-106676 での貢献。)

  • pdb のコマンドと同じ文字列で始まる式や文が、正しく識別されて実行されるようになりました。 (Tian Gao による gh-108464 での貢献。)

queue

  • キューの終了を管理するための Queue.shutdown と ShutDown が追加されました。 (Laurie Opperman and Yves Duprat による gh-104750 での貢献。)

random

re

  • 意味を明確にするため、re.error の名前が PatternError に変わりました。 後方互換性のため re.error も残されています。

shutil

  • chown() でキーワード引数 dir_fd と follow_symlinks がサポートされました。 (Berker Peksag and Tahia K による gh-62308 での貢献。)

site

  • .pth ファイルは、まず UTF-8 でデコードし、失敗した場合に locale encoding でデコードするようになりました。 (Inada Naoki による gh-117802 での貢献。)

sqlite3

  • Connection オブジェクトを明示的に 閉じなかった 場合、ResourceWarning が出るようになりました。 (Erlend E. Aasland による gh-105539 での貢献。)

  • Connection.iterdump() にキーワード専用引数 filter が追加され、ダンプするデータベースオブジェクトを絞り込めるようになりました。 (Mariusz Felisiak による gh-91602 での貢献。)

ssl

  • create_default_context() API のデフォルトのフラグに、VERIFY_X509_PARTIAL_CHAIN と VERIFY_X509_STRICT が含まれるようになりました。

    注釈

    VERIFY_X509_STRICT は、基盤の OpenSSL 実装なら受け付ける場合がある RFC 5280 以前の証明書や不正な形式の証明書を拒否することがあります。 無効にすることは推奨しませんが、次のようにすれば無効にできます。

    import ssl
    
    ctx = ssl.create_default_context()
    ctx.verify_flags &= ~ssl.VERIFY_X509_STRICT
    

    (William Woodruff による gh-112389 での貢献。)

statistics

  • カーネル密度推定を行う kde() が追加されました。 これにより、一定個数の離散的な標本から、連続的な確率密度関数を推定できます。 (Raymond Hettinger による gh-115863 での貢献。)

  • kde() で推定した確率密度関数から標本を生成する kde_random() が追加されました。 (Raymond Hettinger による gh-115863 での貢献。)

subprocess

  • subprocess モジュールは、より多くの状況で posix_spawn() 関数を使うようになりました。

    特に、close_fds が True (デフォルト) の場合、C ライブラリが posix_spawn_file_actions_addclosefrom_np() を提供していれば posix_spawn() を使います。 これには最近の Linux、FreeBSD、Solaris が含まれます。 Linux では、既存の vfork() を使ったコードと同程度の性能になると見込まれます。

    subprocess に posix_spawn() を一切使わせない必要がある場合は、非公開の制御用属性 subprocess._USE_POSIX_SPAWN を False に設定できます。 設定した場合は、API の選択処理を改善できるよう、その理由とプラットフォームの詳細を 課題トラッカー で報告してください。 (Jakub Kulik による gh-113117 での貢献。)

sys

  • 文字列がインターンされているかを調べる _is_interned() 関数が追加されました。 すべての Python 実装にこの関数が存在する保証はありません。 (Serhiy Storchaka による gh-78573 での貢献。)

tempfile

  • Windows では os.mkdir() の変更により、tempfile.mkdtemp() が使うデフォルトのモード 0o700 が、新しいディレクトリへのアクセスを制限するようになりました。 これは CVE 2024-4030 の緩和策です。 (Steve Dower による gh-118486 での貢献。)

time

  • Windows の monotonic() は、分解能 15.6 ミリ秒の GetTickCount64() クロックの代わりに、分解能 1 マイクロ秒の QueryPerformanceCounter() クロックを使うようになりました。 (Victor Stinner による gh-88494 での貢献。)

  • Windows の time() は、分解能 15.6 ミリ秒の GetSystemTimeAsFileTime() クロックの代わりに、分解能 1 マイクロ秒の GetSystemTimePreciseAsFileTime() クロックを使うようになりました。 (Victor Stinner による gh-63207 での貢献。)

tkinter

  • tkinter のウィジェットに、tk_busy_hold()、tk_busy_configure()、tk_busy_cget()、tk_busy_forget()、tk_busy_current()、tk_busy_status() メソッドが追加されました。 (Miguel, klappnase and Serhiy Storchaka による gh-72684 での貢献。)

  • tkinter のウィジェットメソッド wm_attributes() で、例えば w.wm_attributes('alpha') のように、属性名の先頭のマイナスを省略してウィンドウ属性を取得できるようになりました。 また、例えば w.wm_attributes(alpha=0.5) のように、設定する属性と値をキーワード引数で指定できるようになりました。 (Serhiy Storchaka による gh-43457 での貢献。)

  • wm_attributes() に省略可能なキーワード専用引数 return_python_dict が追加され、属性を dict として返せるようになりました。 (Serhiy Storchaka による gh-43457 での貢献。)

  • Text.count() に省略可能なキーワード専用引数 return_ints が追加され、単一の int を返せるようになりました。 この引数を使わない場合、単一のカウントは 1 要素のタプルまたは None として返されます。 (Serhiy Storchaka による gh-97928 での貢献。)

  • tkinter.ttk.Style の element_create() メソッドで、要素型 "vsapi" がサポートされました。 (Serhiy Storchaka による gh-68166 での貢献。)

  • Tkinter のウィジェットに after_info() メソッドが追加されました。 (Cheryl Sabella による gh-77020 での貢献。)

  • PhotoImage に新しい copy_replace() メソッドが追加され、画像の領域を別の画像にコピーできるようになりました。 その際、ピクセルの拡大、間引き、または両方を行えます。 (Serhiy Storchaka による gh-118225 での貢献。)

  • PhotoImage の copy()、zoom()、subsample() メソッドに from_coords 引数が追加されました。 PhotoImage の copy() メソッドには zoom 引数と subsample 引数も追加されました。 (Serhiy Storchaka による gh-118225 での貢献。)

  • PhotoImage に、ファイルから画像を読み込む read() メソッドと、画像データを取得する data() メソッドが追加されました。 write() メソッドには background 引数と grayscale 引数が追加されました。 (Serhiy Storchaka による gh-118271 での貢献。)

traceback

  • TracebackException に、exc_type の表示用文字列を保持する exc_type_str 属性が追加されました。 型オブジェクト自体を保持する exc_type 属性は非推奨になりました。 exc_type を保存するかどうかを指定する save_exc_type 引数 (デフォルトは True) が追加されました。 (Irit Katriel による gh-112332 での貢献。)

  • TracebackException.format_exception_only() にキーワード専用引数 show_group が追加され、BaseExceptionGroup インスタンスに入れ子になった例外を再帰的に書式化できるようになりました。 (Irit Katriel による gh-105292 での貢献。)

types

  • SimpleNamespace に、名前空間の属性を初期化する位置引数を 1 個渡せるようになりました。 この引数は、マッピングか、キーと値のペアのイテラブルでなければなりません。 (Serhiy Storchaka による gh-108191 での貢献。)

typing

  • PEP 705: 特別な型付けの構文要素 ReadOnly が追加され、TypedDict の項目を型チェッカーに対して読み取り専用と示せるようになりました。

  • PEP 742: 型チェッカーに型の絞り込み方を伝えるための構文要素 TypeIs が追加されました。

  • typing モジュールの一部の引数のデフォルト値を表すセンチネルオブジェクト NoDefault が追加されました。 (Jelle Zijlstra による gh-116126 での貢献。)

  • typing.Protocol を定義するメンバーの集合を返す get_protocol_members() が追加されました。 (Jelle Zijlstra による gh-104873 での貢献。)

  • クラスが Protocol かどうかを調べる is_protocol() が追加されました。 (Jelle Zijlstra による gh-104873 での貢献。)

  • ClassVar を Final の中に入れ子にできるようになりました。 逆の入れ子も可能です。 (Mehdi Drissi による gh-89547 での貢献。)

unicodedata

venv

  • 仮想環境のディレクトリに、ソース管理システム (SCM) の無視するファイルの設定を作成できるようになりました。 デフォルトでは Git に対応しています。 API (EnvBuilder と create()) では明示的に有効にする方式で、ほかの SCM に対応するよう拡張できます。 CLI ではデフォルトで有効になり、--without-scm-ignore-files で無効にできます。 (Brett Cannon による gh-108125 での貢献。)

warnings

  • PEP 702: 新しい warnings.deprecated() デコレーターにより、static type checker に非推奨であることを伝え、非推奨のクラスや関数が使われた際に警告できるようになりました。 デコレートした関数やクラスを実行時に使うと、DeprecationWarning を出すこともできます。 (Jelle Zijlstra による gh-104003 での貢献。)

xml

zipimport

  • ZIP64 形式のファイルをサポートしました。 巨大なデータはみんな大好きですよね。 (Tim Hatch による gh-94146 での貢献。)

最適化

  • いくつかの標準ライブラリモジュールのインポート時間が大幅に短縮されました。 例えば typing は、re と contextlib への依存を取り除くことで、インポート時間が約 3 分の 1 短くなりました。 ほかにも、email.utils、enum、functools、importlib.metadata、threading のインポートが高速化されました。 (Alex Waygood, Shantanu Jain, Adam Turner, Daniel Hollas, and others による gh-109653 での貢献。)

  • 大きな入力に対する textwrap.indent() が、以前より約 30% 高速になりました。 (Inada Naoki による gh-107369 での貢献。)

  • subprocess モジュールは、より多くの状況で posix_spawn() 関数を使うようになりました。 多くの最近のプラットフォームでは、close_fds が True (デフォルト) の場合も使います。 これにより、FreeBSD と Solaris でのプロセス起動が大幅に高速化すると見込まれます。 詳しくは、前述の subprocess の節を参照してください。 (Jakub Kulik による gh-113117 での貢献。)

削除されたモジュールと API

PEP 594: 標準ライブラリから「使われなくなった付属モジュール」を削除

PEP 594 は、古くなったもの、廃れたもの、安全性に問題のあるものとして、俗に「dead batteries」と呼ばれる 19 個のモジュールを標準ライブラリから削除することを提案しました。 次のモジュールはすべて Python 3.11 で非推奨になり、今回削除されました。

  • aifc

    • standard-aifc: PyPI で再配布されている aifc ライブラリを使ってください。

  • audioop

    • audioop-lts: PyPI の audioop-lts ライブラリを使ってください。

  • chunk

    • standard-chunk: PyPI で再配布されている chunk ライブラリを使ってください。

  • cgi と cgitb

    • cgi.FieldStorage は通常、GET と HEAD リクエストには urllib.parse.parse_qsl()、POST と PUT リクエストには email.message モジュールか multipart ライブラリで置き換えられます。

    • cgi.parse() は、対象のクエリ文字列に対して urllib.parse.parse_qs() を直接呼び出すことで置き換えられます。 ただし、入力が multipart/form-data の場合は、後述する cgi.parse_multipart() の説明に従って置き換えてください。

    • cgi.parse_header() は、同じ MIME の RFC を実装する email パッケージの機能で置き換えられます。 例えば、email.message.EmailMessage を使うと次のようになります。

      from email.message import EmailMessage
      
      msg = EmailMessage()
      msg['content-type'] = 'application/json; charset="utf8"'
      main, params = msg.get_content_type(), msg['content-type'].params
      
    • cgi.parse_multipart() は、同じ MIME の RFC を実装する email パッケージの機能、または multipart ライブラリで置き換えられます。 例えば、email.message.EmailMessage クラスや email.message.Message クラスが使えます。

    • standard-cgi と standard-cgitb: PyPI で再配布されている cgi と cgitb ライブラリを使ってください。

  • crypt と非公開の拡張 _crypt。 単に値のハッシュを計算するだけなら、hashlib モジュールが適切な代替となる場合があります。 それ以外の場合は、PyPI の様々なサードパーティー製ライブラリが利用できます。

    • bcrypt: ソフトウェアやサーバー向けの現代的なパスワードハッシュ。

    • argon2-cffi: 安全な Argon2 パスワードハッシュアルゴリズム。

    • legacycrypt: POSIX の crypt ライブラリ呼び出しと関連機能の ctypes ラッパー。

    • crypt_r: crypt モジュールのフォークで、crypt_r(3) ライブラリ呼び出しと関連機能のラッパー。

    • standard-crypt と deprecated-crypt-alternative: PyPI で再配布されている crypt と、再実装された _crypt のライブラリを使ってください。

  • imghdr: 代わりに filetype、puremagic、python-magic のいずれかのライブラリを使ってください。 例えば、imghdr がサポートしていたすべてのファイル形式について、imghdr.what() 関数を puremagic.what() 関数で置き換えられます。

    • standard-imghdr: PyPI で再配布されている imghdr ライブラリを使ってください。

  • mailcap: 代わりに mimetypes モジュールを使ってください。

    • standard-mailcap: PyPI で再配布されている mailcap ライブラリを使ってください。

  • msilib

  • nis

  • nntplib: 代わりに PyPI の pynntp ライブラリを使ってください。

    • standard-nntplib: PyPI で再配布されている nntplib ライブラリを使ってください。

  • ossaudiodev: 音声の再生には、代わりに PyPI の pygame ライブラリを使ってください。

  • pipes: 代わりに subprocess モジュールを使ってください。 非公開の pipes.quote 関数は shlex.quote() に置き換えてください。

    • standard-pipes: PyPI で再配布されている pipes ライブラリを使ってください。

  • sndhdr: 代わりに filetype、puremagic、python-magic のいずれかのライブラリを使ってください。

    • standard-sndhdr: PyPI で再配布されている sndhdr ライブラリを使ってください。

  • spwd: 代わりに PyPI の python-pam ライブラリを使ってください。

  • sunau

    • standard-sunau: PyPI で再配布されている sunau ライブラリを使ってください。

  • telnetlib: 代わりに PyPI の telnetlib3 または Exscript ライブラリを使ってください。

    • standard-telnetlib: PyPI で再配布されている telnetlib ライブラリを使ってください。

  • uu: 現代的な代替として base64 モジュールを使ってください。

    • standard-uu: PyPI で再配布されている uu ライブラリを使ってください。

  • xdrlib

    • standard-xdrlib: PyPI で再配布されている xdrlib ライブラリを使ってください。

(Victor Stinner and Zachary Ware による gh-104773 and gh-104780 での貢献。)

2to3

  • Python 3.11 で非推奨となっていた 2to3 プログラムと lib2to3 モジュールが削除されました。 (Victor Stinner による gh-104780 での貢献。)

builtins

  • 連鎖した classmethod デスクリプター (gh-63272 で導入) のサポートが削除されました。 property などのほかのデスクリプターをラップできなくなりました。 この機能には基本的な設計上の欠陥があり、いくつもの問題を引き起こしていました。 classmethod を「通り抜けて」元のオブジェクトにアクセスするには、Python 3.10 で追加された __wrapped__ 属性の利用を検討してください。 (Raymond Hettinger による gh-89519 での貢献。)

  • 一時停止中のフレームに対して frame.clear() を呼び出すと、RuntimeError を送出するようになりました (実行中のフレームでは以前から同じ動作でした)。 (Irit Katriel による gh-79932 での貢献。)

configparser

  • Python 3.2 から docstring で、Python 3.11 から実行時にも非推奨となっていた、非公開の LegacyInterpolation クラスが削除されました。 (Hugo van Kemenade による gh-104886 での貢献。)

importlib.metadata

  • EntryPoint オブジェクトの、非推奨となっていた添字 (__getitem__()) によるアクセスが削除されました。 (Jason R. Coombs による gh-113175 での貢献。)

locale

  • Python 3.11 で非推奨になった locale.resetlocale() 関数が削除されました。 代わりに locale.setlocale(locale.LC_ALL, "") を使ってください。 (Victor Stinner による gh-104783 での貢献。)

opcode

  • opcode.ENABLE_SPECIALIZATION が _opcode.ENABLE_SPECIALIZATION に移動しました。 このフィールドは 3.12 で追加されましたが、一度も文書化されておらず、外部からの使用を意図したものではありません。 (Irit Katriel による gh-105481 での貢献。)

  • opcode.is_pseudo()、opcode.MIN_PSEUDO_OPCODE、opcode.MAX_PSEUDO_OPCODE が削除されました。 これらは Python 3.12 で追加されましたが、文書化も dis を通した公開もされておらず、外部からの使用を意図したものではありません。 (Irit Katriel による gh-105481 での貢献。)

optparse

  • このモジュールは soft deprecated ではなくなりました。 サードパーティー製のコマンドライン引数処理ライブラリを使わない新しいプロジェクトでは、引き続き argparse が推奨されます。 ただし、argparse の動作には、より低水準の optparse の方が適した基盤になり得る側面があります。 具体的には、引数処理ライブラリを 作成する 場合や、C の getopt() 関数の動作に由来する Unix の様々なコマンドライン処理の慣習に、argparse よりも厳密に従うアプリケーションを実装する場合です。 (Alyssa Coghlan and Serhiy Storchaka による gh-126180 での貢献。)

pathlib

  • Path オブジェクトをコンテキストマネージャーとして使う機能が削除されました。 この機能は Python 3.9 から非推奨で、効果もありませんでした。 (Barney Gale による gh-83863 での貢献。)

re

  • 非公開で非推奨となっていた、正しく動作しない re.template() 関数と re.TEMPLATE / re.T フラグが削除されました。 (Serhiy Storchaka and Nikita Sobolev による gh-105687 での貢献。)

tkinter.tix

  • Python 3.6 で非推奨になった tkinter.tix モジュールが削除されました。 このモジュールがラップしていたサードパーティー製の Tix ライブラリは、保守されていません。 (Zachary Ware による gh-75552 での貢献。)

turtle

  • Python 3.1 からドキュメントで、Python 3.11 から実行時にも非推奨となっていた RawTurtle.settiltangle() メソッドが削除されました。 (Hugo van Kemenade による gh-104876 での貢献。)

typing

  • Python 3.8 から非推奨となっていた typing.io と typing.re の名前空間が削除されました。 これらの名前空間の項目は、typing モジュールから直接インポートできます。 (Sebastian Rittau による gh-92871 での貢献。)

  • Python 3.11 で非推奨になった、キーワード引数で TypedDict 型を作成する方法が削除されました。 (Tomas Roun による gh-104786 での貢献。)

unittest

  • Python 3.11 で非推奨になった、次の unittest 関数が削除されました。

    • unittest.findTestCases()

    • unittest.makeSuite()

    • unittest.getTestCaseNames()

    代わりに TestLoader のメソッドを使ってください。

    (Hugo van Kemenade による gh-104835 での貢献。)

  • Python 3.11 で非推奨になった、テストも文書化もされていない TestProgram.usageExit() メソッドが削除されました。 (Hugo van Kemenade による gh-104992 での貢献。)

urllib

webbrowser

  • Python 3.11 で非推奨になった、テストも文書化もされていない MacOSX クラスが削除されました。 代わりに MacOSXOSAScript クラス (Python 3.2 で導入) を使ってください。 (Hugo van Kemenade による gh-104804 での貢献。)

  • 非推奨の MacOSXOSAScript._name 属性が削除されました。 代わりに MacOSXOSAScript.name 属性を使ってください。 (Nikita Sobolev による gh-105546 での貢献。)

新たな非推奨項目

  • ユーザー定義関数:

    • 関数の __code__ 属性に、その関数と種類が一致しないコードオブジェクトを代入することが非推奨になりました。 種類には、通常の関数、ジェネレーター、非同期ジェネレーター、コルーチンがあります。 (Irit Katriel による gh-81137 での貢献。)

  • array:

    • 書式コード 'u' (wchar_t) が、実行時にも非推奨になりました。 この書式コードは Python 3.3 からドキュメントで非推奨となっており、Python 3.16 で削除されます。 Unicode 文字には、代わりに書式コード 'w' (Py_UCS4) を使ってください。 (Hugo van Kemenade による gh-80480 での貢献。)

  • ctypes:

    • 非公開の SetPointerType() 関数が非推奨になりました。 Python 3.15 で削除されます。 (Victor Stinner による gh-105733 での貢献。)

    • ARRAY() 関数が ソフト非推奨 になりました。 代わりに type * length の乗算を使ってください。 (Victor Stinner による gh-105733 での貢献。)

  • decimal:

    • decimal モジュールの C 実装だけがサポートする、非標準で非公開の Decimal の書式指定子 'N' が非推奨になりました。 Python 3.18 で削除される予定です。 (Serhiy Storchaka による gh-89902 での貢献。)

  • dis:

    • 区切りを示す HAVE_ARGUMENT が非推奨になりました。 代わりに hasarg に含まれるかどうかを調べてください。 (Irit Katriel による gh-109319 での貢献。)

  • gettext:

    • gettext モジュールで複数形を扱う関数やメソッドの引数に、整数でない数値を渡すことは、翻訳が見つからなかった場合も非推奨になりました。 (Serhiy Storchaka による gh-88434 での貢献。)

  • glob:

    • 非公開の glob0() 関数と glob1() 関数が非推奨になりました。 代わりに glob() を使い、ルートディレクトリを指定する path-like object を root_dir 引数に渡してください。 (Barney Gale による gh-117337 での貢献。)

  • http.server:

    • CGIHTTPRequestHandler が非推奨になりました。 Python 3.15 で削除されます。 プロセスベースの CGI HTTP サーバーは、長らく使われなくなっています。 このコードは古く、保守されておらず、ほとんど使われていませんでした。 セキュリティと機能の両面で不具合が生じる可能性が高いものです。 (Gregory P. Smith による gh-109096 での貢献。)

    • python -m http.server のコマンドラインインターフェースの --cgi フラグが非推奨になりました。 Python 3.15 で削除されます。 (Gregory P. Smith による gh-109096 での貢献。)

  • mimetypes:

  • re:

    • モジュールレベルの split()、sub()、subn() に、省略可能な引数 maxsplit、count、flags を位置引数として渡すことが非推奨になりました。 これらの引数は、将来の Python で キーワード専用 になります。 (Serhiy Storchaka による gh-56166 での貢献。)

  • pathlib:

    • .PurePath.is_reserved() が非推奨になりました。 Python 3.15 で削除されます。 Windows の予約されたパスを検出するには、os.path.isreserved() を使ってください。 (Barney Gale による gh-88569 での貢献。)

  • platform:

    • platform.java_ver() が非推奨になりました。 Python 3.15 で削除されます。 この関数は Jython のサポートにしか役立たず、API が分かりにくく、ほとんどテストされていません。 (Nikita Sobolev による gh-116349 での貢献。)

  • pydoc:

    • 非公開の ispackage() 関数が非推奨になりました。 (Zackery Spytz による gh-64020 での貢献。)

  • sqlite3:

    • connect() 関数と Connection コンストラクターに、位置引数を 2 個以上渡すことが非推奨になりました。 最初の引数以外は Python 3.15 でキーワード専用になります。 (Erlend E. Aasland による gh-107948 での貢献。)

    • Connection.create_function() と Connection.create_aggregate() に、名前、引数の数、呼び出し可能オブジェクトをキーワード引数として渡すことが非推奨になりました。 これらの引数は Python 3.15 で位置専用になります。 (Erlend E. Aasland による gh-108278 での貢献。)

    • Connection の set_authorizer()、set_progress_handler()、set_trace_callback() に、コールバックの呼び出し可能オブジェクトをキーワード引数として渡すことが非推奨になりました。 コールバックは Python 3.15 で位置専用になります。 (Erlend E. Aasland による gh-108278 での貢献。)

  • sys:

  • tarfile:

    • 非公開で使われていない TarFile.tarfile 属性が非推奨になりました。 Python 3.16 で削除されます。 (gh-115256 での貢献。)

  • traceback:

  • typing:

    • NamedTuple クラスを作成する際の非公開のキーワード引数構文 (例えば Point = NamedTuple("Point", x=int, y=int)) が非推奨になりました。 Python 3.15 で削除されます。 代わりにクラスベースの構文か関数形式の構文を使ってください。 (Alex Waygood による gh-105566 での貢献。)

    • NamedTuple または typing.TypedDict クラスの作成時に fields 引数を省略することと、両方の型の fields 引数に None を渡すことが非推奨になりました。 Python 3.15 では fields 引数に有効なシーケンスが必要になります。 フィールドのない NamedTuple クラスを作るには、class NT(NamedTuple): pass または NT = NamedTuple("NT", ()) を使ってください。 フィールドのない TypedDict クラスを作るには、class TD(TypedDict): pass または TD = TypedDict("TD", {}) を使ってください。 (Alex Waygood による gh-105566 and gh-105570 での貢献。)

    • @typing.no_type_check_decorator デコレーター関数が非推奨になりました。 Python 3.15 で削除されます。 typing モジュールに追加されてから 8 年が経過しましたが、主要な型チェッカーではまだサポートされていません。 (Alex Waygood による gh-106309 での貢献。)

    • typing.AnyStr が非推奨になりました。 Python 3.16 では typing.__all__ から削除され、実行時にインポートまたはアクセスすると DeprecationWarning が出るようになります。 Python 3.18 で完全に削除されます。 代わりに新しい 型引数の構文 を使ってください。 (Michael The による gh-107116 での貢献。)

  • wave:

    • Wave_read と Wave_write の getmark()、setmark()、getmarkers() メソッドが非推奨になりました。 Python 3.15 で削除されます。 (Victor Stinner による gh-105096 での貢献。)

Python 3.14 で削除予定

  • argparse:argparse.BooleanOptionalAction の type、choices、metavar パラメータは非推奨となり、3.14 で削除されます。 (Nikita Sobolev が gh-92248 で貢献しました。)

  • ast:以下の機能は Python 3.8 からドキュメントで非推奨とされていましたが、アクセスや使用をすると実行時に DeprecationWarning が出るようになりました。 Python 3.14 で削除されます:

    • ast.Num

    • ast.Str

    • ast.Bytes

    • ast.NameConstant

    • ast.Ellipsis

    代わりに ast.Constant を使ってください。 (Serhiy Storchaka が gh-90953 で貢献しました。)

  • asyncio:

    • 子プロセスを監視するクラス asyncio.MultiLoopChildWatcher、asyncio.FastChildWatcher、asyncio.AbstractChildWatcher、asyncio.SafeChildWatcher は非推奨となり、Python 3.14 で削除されます。 (Kumar Aditya が gh-94597 で貢献しました。)

    • asyncio.set_child_watcher()、asyncio.get_child_watcher()、asyncio.AbstractEventLoopPolicy.set_child_watcher()、asyncio.AbstractEventLoopPolicy.get_child_watcher() は非推奨となり、Python 3.14 で削除されます。 (Kumar Aditya が gh-94597 で貢献しました。)

    • デフォルトのイベントループポリシーの get_event_loop() メソッドは、現在のイベントループが設定されておらず、新たに作成することにした場合に DeprecationWarning を出すようになりました。 (Serhiy Storchaka と Guido van Rossum が gh-100160 で貢献しました。)

  • email:email.utils.localtime() の isdst パラメータは非推奨になりました。 (Alan Williams が gh-72346 で貢献しました。)

  • importlib.abc の非推奨のクラス:

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

    代わりに importlib.resources.abc のクラスを使ってください:

    (Jason R. Coombs と Hugo van Kemenade が gh-93963 で貢献しました。)

  • itertools は copy、deepcopy、pickle の操作をサポートしていましたが、ドキュメント化されておらず、非効率で、以前からバグが多く、一貫性もありませんでした。 コード量と保守の負担を大幅に減らすため、このサポートは 3.14 で削除されます。 (Raymond Hettinger が gh-101588 で貢献しました。)

  • multiprocessing:Linux、BSD、および現在 'fork' がデフォルトとなっている macOS 以外の POSIX プラットフォームでは、デフォルトの開始方式がより安全なものに変わります (gh-84559)。 ほとんどのコードでは影響を受けないと考えられるため、この変更について実行時に警告を出すのは混乱が大きすぎると判断されました。 コードが 'fork' を 必要とする 場合は、get_context() または set_start_method() API で明示的に指定してください。 コンテキストと開始方式 を参照してください。

  • pathlib:is_relative_to() と relative_to() に追加の引数を渡すことは非推奨です。

  • pkgutil:pkgutil.find_loader() と pkgutil.get_loader() は DeprecationWarning を出すようになりました。 代わりに importlib.util.find_spec() を使ってください。 (Nikita Sobolev が gh-97850 で貢献しました。)

  • pty:

  • sqlite3:

  • urllib:urllib.parse.Quoter は非推奨です。 公開 API として意図されたものではありませんでした。 (Gregory P. Smith が gh-88168 で貢献しました。)

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 バイトコードの変更

  • YIELD_VALUE の oparg は、yield-from または await の一部としての yield なら 1、それ以外なら 0 になりました。 RESUME の oparg には、例外の深さが 1 かどうかを示すビットが追加されました。 これはジェネレーターを閉じる処理の最適化に必要です。 (Irit Katriel による gh-111354 での貢献。)

C API の変更

新しい機能

変更された C API

Limited C API の変更

削除された C API

  • _Py または _PY で始まる名前を持つ、非公開と見なされる関数、マクロ、変数などがいくつか削除されました。 この削除の影響を受け、削除された API を引き続き利用できるようにするべきだと考える場合は、公開 C API を求める 新しい課題を作成 してください。 その課題に cc: @vstinner を追加すると Victor Stinner に通知されます。 (Victor Stinner による gh-106320 での貢献。)

  • Python 3.0 で非推奨となった古いバッファープロトコルが削除されました。 代わりに バッファプロトコル (buffer Protocol) を使ってください。

    • PyObject_CheckReadBuffer(): オブジェクトがバッファープロトコルをサポートするかどうかは、PyObject_CheckBuffer() で調べてください。 ただし、PyObject_CheckBuffer() は PyObject_GetBuffer() の成功を保証しません。 実際にオブジェクトを読み取れるかを調べる方法は、次の PyObject_GetBuffer() の例を参照してください。

    • PyObject_AsCharBuffer()、PyObject_AsReadBuffer(): 代わりに PyObject_GetBuffer() と PyBuffer_Release() を使ってください。

      Py_buffer view;
      if (PyObject_GetBuffer(obj, &view, PyBUF_SIMPLE) < 0) {
          return NULL;
      }
      // `view.buf` と `view.len` を使ってバッファーから読み取る。
      // buf を `(const char*)view.buf` にキャストする必要がある場合もある。
      PyBuffer_Release(&view);
      
    • PyObject_AsWriteBuffer(): 代わりに PyObject_GetBuffer() と PyBuffer_Release() を使ってください。

      Py_buffer view;
      if (PyObject_GetBuffer(obj, &view, PyBUF_WRITABLE) < 0) {
          return NULL;
      }
      // `view.buf` と `view.len` を使ってバッファーに書き込む。
      PyBuffer_Release(&view);
      

    (Inada Naoki による gh-85275 での貢献。)

  • Python 3.9 で非推奨となった、次の関数が削除されました。

    • PyEval_CallObject()、PyEval_CallObjectWithKeywords(): 代わりに PyObject_CallNoArgs() または PyObject_Call() を使ってください。

      警告

      PyObject_Call() では、位置引数は tuple でなければならず、NULL は許されません。 キーワード引数は dict または NULL でなければなりません。 一方、削除された関数は引数の型を検査し、位置引数にもキーワード引数にも NULL を受け付けていました。 PyEval_CallObjectWithKeywords(func, NULL, kwargs) を PyObject_Call() に置き換えるには、PyTuple_New(0) を使い、位置引数として空のタプルを渡してください。

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

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

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

    (Victor Stinner による gh-105107 での貢献。)

  • Python 3.11 で非推奨となった、Python の初期化を設定する次の古い関数が削除されました。

    代わりに、Python 3.8 で追加された Python 初期化設定 の新しい PyConfig API (PEP 587) を使ってください。 (Victor Stinner による gh-105145 での貢献。)

  • Python 3.2 で非推奨となった PyEval_AcquireLock() 関数と PyEval_ReleaseLock() 関数が削除されました。 これらは現在のスレッド状態を更新しない関数でした。 次の組み合わせに置き換えられます。

    (Victor Stinner による gh-105182 での貢献。)

  • Python 3.9 で非推奨となった PyEval_ThreadsInitialized() 関数が削除されました。 Python 3.7 以降、Py_Initialize() は常に GIL を作成するため、PyEval_InitThreads() を呼び出しても何も起こらず、PyEval_ThreadsInitialized() は常にゼロ以外の値を返します。 (Victor Stinner による gh-105182 での貢献。)

  • Python 3.8 との後方互換性のために残されていた、PyInterpreterState_Get() の別名 _PyInterpreterState_Get() が削除されました。 pythoncapi-compat project を使えば、Python 3.8 以前でも PyInterpreterState_Get() を利用できます。 (Victor Stinner による gh-106320 での貢献。)

  • 非公開の _PyObject_FastCall() 関数が削除されました。 代わりに、Python 3.8 から利用できる PyObject_Vectorcall() を使ってください (PEP 590)。 (Victor Stinner による gh-106023 での貢献。)

  • 非公開の関数だけを含んでいたヘッダーファイル cpython/pytime.h が削除されました。 (Victor Stinner による gh-106316 での貢献。)

  • 非公開の定数 PY_TIMEOUT_MAX が Limited C API から削除されました。 (Victor Stinner による gh-110014 での貢献。)

  • 古い trashcan マクロ Py_TRASHCAN_SAFE_BEGIN と Py_TRASHCAN_SAFE_END が削除されました。 それぞれ新しいマクロ Py_TRASHCAN_BEGIN と Py_TRASHCAN_END に置き換えてください。 (Irit Katriel による gh-105111 での貢献。)

非推奨の C API

Python 3.14 で削除予定

Python 3.15 で削除予定

Python 3.16 で削除予定

  • 同梱されている libmpdec。

Python 3.18 で削除予定

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

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

ビルドの変更

  • arm64-apple-ios と arm64-apple-ios-simulator が PEP 11 の tier 3 プラットフォームになりました。 (PEP 730 の執筆と実装は Russell Keith-Magee による gh-114099 での貢献。)

  • aarch64-linux-android と x86_64-linux-android が PEP 11 の tier 3 プラットフォームになりました。 (PEP 738 の執筆と実装は Malcolm Smith による gh-116622 での貢献。)

  • wasm32-wasi が PEP 11 の tier 2 プラットフォームになりました。 (Brett Cannon による gh-115192 での貢献。)

  • wasm32-emscripten が PEP 11 のサポート対象プラットフォームではなくなりました。 (Brett Cannon による gh-115192 での貢献。)

  • CPython のビルドには、C11 のアトミックライブラリ、GCC の組み込みアトミック関数、MSVC の interlocked 組み込み関数のいずれかをサポートするコンパイラが必要になりました。

  • configure スクリプトの再生成に、Autoconf 2.71 と aclocal 1.16.5 が必要になりました。 (Christian Heimes による gh-89886 and by Victor Stinner in gh-112090 での貢献。)

  • sqlite3 拡張モジュールのビルドには、SQLite 3.15.2 以降が必要です。 (Erlend Aasland による gh-105875 での貢献。)

  • CPython はデフォルトで mimalloc library を同梱するようになりました。 これは MIT ライセンスで提供されています。 mimalloc のライセンス を参照してください。 同梱した mimalloc には独自の変更があり、詳細は gh-113141 を参照してください。 (Dino Viehland による gh-109914 での貢献。)

  • configure オプション --with-system-libmpdec のデフォルトが yes になりました。 同梱の libmpdec は Python 3.16 で削除されます。

  • configure に --with-trace-refs (参照の追跡) を指定してビルドした Python が、リリースビルドと デバッグビルド に対して ABI 互換になりました。 (Victor Stinner による gh-108634 での貢献。)

  • POSIX システムでは、pkg-config (.pc) のファイル名に ABI フラグが含まれるようになりました。 例えば、フリースレッドビルドでは python-3.13t.pc、デバッグビルドでは python-3.13d.pc が生成されます。

  • C 拡張 errno、fcntl、grp、md5、pwd、resource、termios、winsound、_ctypes_test、_multiprocessing.posixshmem、_scproxy、_stat、_statistics、_testconsole、_testimportmultiple、_uuid が、Limited C API でビルドされるようになりました。 (Victor Stinner による gh-85283 での貢献。)

Python 3.13 への移植

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

Python API の変更

  • PEP 667 により、locals() と f_locals の意味がいくつか変わります。

    • optimized scope で locals() を呼び出すと、呼び出すたびに独立したスナップショットが作成され、以前返された参照先が暗黙に更新されなくなりました。 CPython の従来の動作が必要なら、最初に返された辞書を、その後の locals() 呼び出しの結果で明示的に更新する必要があります。 locals() を暗黙の対象とするコード実行関数 (exec や eval など) の結果を最適化されたスコープから取得するには、名前空間を明示的に渡す必要があります。 (PEP 667 の一環として変更。)

    • モジュールまたはクラスのスコープの内包表記から locals() を呼び出した場合 (exec や eval を介する場合も含む)、内包表記が独立した入れ子の関数として動作するかのような挙動に戻りました。 つまり、内包表記を含むスコープのローカル変数は含まれません。 Python 3.12 では PEP 709 の実装に伴い、内包表記を含むスコープのローカル変数を含めるように変わっていました。 (PEP 667 の一環として変更。)

    • optimized scope で FrameType.f_locals にアクセスすると、更新時点が不明確なスナップショットではなく、書き込みを直接反映するプロキシを返すようになりました。 スナップショットが必要な場合は、dict またはプロキシの .copy() メソッドを使って明示的に作成する必要があります。 (PEP 667 の一環として変更。)

  • functools.partial をメソッドとして使うと、FutureWarning が出るようになりました。 将来の Python では動作が変わります。 従来の動作を保つには、staticmethod() でラップしてください。 (Serhiy Storchaka による gh-121027 での貢献。)

  • getpass.getuser() は、ユーザー名の取得に失敗した場合、常に OSError を送出するようになりました。 以前は、Unix 以外のプラットフォームでは ImportError、パスワードデータベースが空の Unix プラットフォームでは KeyError を送出していました。

  • gzip.GzipFile の mode 属性の値が、整数 (1 または 2) から文字列 ('rb' または 'wb') に変わりました。 zipfile.ZipFile.open() が返す読み取り可能なファイルライクオブジェクトの mode 属性の値は、'r' から 'rb' に変わりました。 (Serhiy Storchaka による gh-115961 での貢献。)

  • mailbox.Maildir は、ドット (.) で始まるファイルを無視するようになりました。 (Zackery Spytz による gh-65559 での貢献。)

  • pathlib.Path.glob() と rglob() は、「**」で終わるパターンを渡すと、ディレクトリだけでなくファイルも返すようになりました。 従来の動作を保ち、ディレクトリだけに一致させるには、末尾にスラッシュを追加してください。

  • threading モジュールは、_thread モジュールに _is_main_interpreter() 関数があることを前提とするようになりました。 この関数は引数を取らず、現在のインタープリタがメインインタープリタなら True を返します。

    独自の _thread モジュールを提供するライブラリやアプリケーションは、そのモジュールのほかの「非公開」属性と同じく、_is_main_interpreter() を提供する必要があります。 (gh-112826)。

C API の変更

  • Python.h は標準ヘッダー <ieeefp.h> をインクルードしなくなりました。 finite() 関数のためにインクルードしていましたが、この関数は現在 <math.h> で提供されています。 必要な場合は、明示的にインクルードしてください。 HAVE_IEEEFP_H マクロも削除されました。 (Victor Stinner による gh-108765 での貢献。)

  • Python.h は、標準ヘッダーファイル <time.h>、<sys/select.h>、<sys/time.h> をインクルードしなくなりました。 必要な場合は、明示的にインクルードしてください。 例えば、<time.h> は clock() と gmtime() を、<sys/select.h> は select() を、<sys/time.h> は futimes()、gettimeofday()、setitimer() を提供します。 (Victor Stinner による gh-108765 での貢献。)

  • Windows では、Python.h は標準ヘッダーファイル <stddef.h> をインクルードしなくなりました。 必要な場合は、明示的にインクルードしてください。 このヘッダーは、例えば offsetof() や size_t 型、ptrdiff_t 型を提供します。 ほかのすべてのプラットフォームでは、以前から <stddef.h> を明示的にインクルードする必要がありました。 HAVE_STDDEF_H マクロは Windows でのみ定義されています。 (Victor Stinner による gh-108765 での貢献。)

  • Py_LIMITED_API マクロを定義した場合、<Python.h> が Py_BUILD_CORE、Py_BUILD_CORE_BUILTIN、Py_BUILD_CORE_MODULE マクロの定義を解除するようになりました。 (Victor Stinner による gh-85283 での貢献。)

  • 古い trashcan マクロ Py_TRASHCAN_SAFE_BEGIN と Py_TRASHCAN_SAFE_END が削除されました。 それぞれ新しいマクロ Py_TRASHCAN_BEGIN と Py_TRASHCAN_END に置き換えてください。

    例えば、古いマクロを使う次のような tp_dealloc 関数は、

    static void
    mytype_dealloc(mytype *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_SAFE_BEGIN(p);
        ...
        Py_TRASHCAN_SAFE_END(p)
    }
    

    次のように新しいマクロに移行してください。

    static void
    mytype_dealloc(mytype *p)
    {
        PyObject_GC_UnTrack(p);
        Py_TRASHCAN_BEGIN(p, mytype_dealloc)
        ...
        Py_TRASHCAN_END
    }
    

    Py_TRASHCAN_BEGIN には 2 番目の引数があり、そのマクロを含む解放関数を指定する必要があります。 新しいマクロは Python 3.8 で追加され、古いマクロは Python 3.11 で非推奨になりました。 (Irit Katriel による gh-105111 での貢献。)

回帰テストの変更

  • configure に --with-pydebug を指定してビルドした Python が、コマンドラインオプション -X presite=package.module をサポートするようになりました。 指定すると、インタープリタのライフサイクルの初期、site.py の実行前にインポートするモジュールを指定できます。 (Łukasz Langa による gh-110769 での貢献。)