What's New In Python 3.12

編集者:

Adam Turner

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

参考

PEP 693 -- Python 3.12 リリーススケジュール

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

Python 3.12 は Python プログラミング言語の安定版リリースで、言語と標準ライブラリの両方に変更が加えられています。 ライブラリの変更は、非推奨 API の整理、使いやすさ、正確性を重視しています。 特に、distutils パッケージが標準ライブラリから削除されました。 os と pathlib のファイルシステムへの対応がさまざまな点で改善され、いくつかのモジュールの性能も向上しています。

言語の変更は使いやすさを重視しており、f 文字列 の多くの制限が取り除かれ、'Did you mean ...' という候補の提示も引き続き改善されています。 新しい 型引数の構文 と type 文により、静的型チェッカーで ジェネリック型 と 型エイリアス を使いやすくなりました。

この記事は全ての新機能の完全な仕様を提供しようとするものではなく、便利な概要について説明をするものです。 全詳細については、 ライブラリリファレンス や 言語リファレンス などのドキュメントを参照してください。 変更の実装や設計原理について完全に理解したい場合は、特定の新機能の PEP を参照してください。 しかし、一旦機能が完全に実装されると、普通 PEP は最新の状態に保たれないことに注意してください。


新たな構文機能:

新たな文法機能:

インタープリタの改善:

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

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

セキュリティの改善:

  • hashlib に組み込まれた SHA1、SHA3、SHA2-384、SHA2-512、MD5 の実装を、HACL* プロジェクトの形式的に検証されたコードで置き換えました。 これらの組み込み実装は、OpenSSL が該当する実装を提供していない場合にだけ使われる代替実装として残ります。

C API の改善:

CPython の実装の改善:

  • PEP 709, 内包表記のインライン化

  • Linux perf プロファイラの CPython サポート

  • サポートされているプラットフォームでスタック・オーバーフロー保護を実装します

新しい型ヒントの機能:

重要な非推奨化、削除または制限:

  • PEP 623: Python の C API の Unicode オブジェクトから wstr を削除し、全ての str オブジェクトのサイズを少なくとも 8 バイト減らします

  • PEP 632: distutils パッケージを削除しました。 提供されていた API の置き換えについては 移行ガイド を参照してください。 Python 3.12 以降でも distutils が必要な場合は、引き続きこれを提供するサードパーティパッケージ Setuptools を利用できます。

  • gh-95299: venv で作成する仮想環境に setuptools をプリインストールしなくなりました。 そのため、distutils、setuptools、pkg_resources、easy_install はデフォルトでは利用できなくなります。 これらを使うには、有効化した 仮想環境で pip install setuptools を実行してください。

  • asynchat, asyncore, imp モジュールが、いくつかの unittest.TestCase メソッドのエイリアス と共に削除されました。

新しい機能

PEP 695: 型パラメータの構文

PEP 484 に基づくジェネリッククラスやジェネリック関数の宣言では、型引数のスコープが不明瞭で、変性を明示的に宣言する必要のある冗長な構文を使っていました。

PEP 695 は ジェネリッククラス と 関数 を作成するための、よりコンパクトで明示的な新しい方法を紹介します:

def max[T](args: Iterable[T]) -> T:
    ...

class list[T]:
    def __getitem__(self, index: int, /) -> T:
        ...

    def append(self, element: T) -> None:
        ...

さらに、 PEP では 型エイリアス を宣言する新しい方法が導入されました。 type 文を使用し、 TypeAliasType のインスタンスを作成します:

type Point = tuple[float, float]

型エイリアスは ジェネリック とすることもできます:

type Point[T] = tuple[T, T]

新しい構文では、TypeVarTuple と ParamSpec のパラメータに加えて、上限や制約を持つ TypeVar パラメータを宣言できます。

type IntFunc[**P] = Callable[P, int]  # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts]  # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T]  # 上限を持つ TypeVar
type IntOrStrSequence[T: (int, str)] = Sequence[T]  # 制約を持つ TypeVar

この構文で作成された型エイリアスの値や型変数の境界や制約はオンデマンドで評価されます (遅延評価 を参照してください)。つまり、型エイリアスはファイルの後半で定義された他の型を参照することができます。

型引数リストで宣言した型引数は、宣言のスコープとその内側のスコープで参照でき、外側のスコープでは参照できません。 例えば、ジェネリッククラスのメソッドの型アノテーションやクラス本体で使えますが、クラス定義後のモジュールスコープでは使えません。 型引数の実行時の意味について詳しくは 型パラメータリスト を参照してください。

このようなスコープの規則を実現するため、アノテーションスコープ という新しい種類のスコープを導入しました。 アノテーションスコープはほとんどの点で関数スコープと同じように動作しますが、外側のクラススコープとの関係が異なります。 Python 3.13 では アノテーション もアノテーションスコープで評価されます。

より詳しくは PEP 695 を参照してください。

(PEP は Eric Traut によって作成されました。実装は Jelle Zijlstra, Eric Traut らによって gh-103764 で行われました。)

PEP 701: f-strings の構文的な形式化

PEP 701 により f 文字列 の使用上の制限がいくつか取り除かれました。 f 文字列内の式には、正しい Python 式であれば何でも使えるようになりました。 例えば、外側の f 文字列と同じ引用符を使う文字列、複数行の式、コメント、バックスラッシュ、Unicode エスケープシーケンスなどを含められます。 以下で詳しく説明します。

  • クォートの再利用: Python 3.11 では、 f-string を囲むクォートと同じクォートを再利用すると SyntaxError が発生し、ユーザーは他の利用可能なクォート( f-string がシングルクォートを使用している場合に、ダブルクオートまたはトリプルクォートを使用するなど)を使用する必要があります。 Python 3.12 では次のようなことができるようになりました:

    >>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
    >>> f"This is the playlist: {", ".join(songs)}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    

    この変更以前は、 f-string のネスト方法に明示的な制限はありませんでしたが、 f-string の式コンポーネント内で文字列引用符を再利用できないという事実により、 f-string を任意にネストすることが不可能になったことに注意してください。実際、これは記述できる中で最もネストされた f-string です。

    >>> f"""{f'''{f'{f"{1+1}"}'}'''}"""
    '2'
    

    f-string には式コンポーネント内に任意の有効な Python 式を含めることができるため、 f-string を任意にネストできるようになりました。

    >>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}"
    '2'
    
  • 複数行の式とコメント: Python 3.11 では、f 文字列内の式は 1 行に書く必要がありました。 通常なら複数行にまたがって書ける式 (複数行に分けたリストリテラルなど) でもそうする必要があり、読みにくくなっていました。 Python 3.12 では、複数行にまたがる f 文字列を定義し、インラインコメントも追加できます。

    >>> f"This is the playlist: {", ".join([
    ...     'Take me back to Eden',  # My, my, those eyes like fire
    ...     'Alkaline',              # Not acid nor alkaline
    ...     'Ascensionism'           # Take to the broken skies at last
    ... ])}"
    'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
    
  • バックスラッシュと Unicode 文字: Python 3.12 より前は、f 文字列内の式に \ を含められませんでした。 これは Unicode の エスケープシーケンス (\N{snowman} など) にも影響していました。 こうしたエスケープシーケンスには、従来 f 文字列内の式で使えなかった \N が含まれるためです。 次のような式を定義できるようになりました。

    >>> print(f"This is the playlist: {"\n".join(songs)}")
    This is the playlist: Take me back to Eden
    Alkaline
    Ascensionism
    >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}")
    This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
    

より詳しくは PEP 701 を参照してください。

この機能を PEG パーサ で f 文字列を解析する形で実装したことにより、エラーメッセージも改善されました。 f 文字列のエラーメッセージがより正確になり、エラーの正確な位置も表示されます。 例えば Python 3.11 では、次の f 文字列が SyntaxError を送出します。

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    (x z y)
     ^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?

しかし、エラーメッセージは行内の正確なエラーの位置を含まず、また式が人為的に括弧で囲まれています。 Python 3.12 では、 f-string は PEG パーサで解析されるため、エラーメッセージはより正確になり、行全体が表示されます:

>>> my_string = f"{x z y}" + f"{1 + 1}"
  File "<stdin>", line 1
    my_string = f"{x z y}" + f"{1 + 1}"
                   ^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?

(Pablo Galindo、Batuhan Taskaya、Lysandros Nikolaou、Cristián Maureira-Fredes、Marta Gómez が gh-102856 で貢献しました。 PEP は Pablo Galindo、Batuhan Taskaya、Lysandros Nikolaou、Marta Gómez が執筆しました)。

PEP 684: インタープリタごとの GIL

PEP 684 ではインタープリタごとの GIL が導入され、インタープリタごとの固有の GIL を使用してサブインタープリタを作成できるようになりました。これにより、 Python プログラムは複数の CPU コアを最大限に活用できるようになります。これは現在 C-API を通じてのみ利用できますが、 Python API は 3.13 で利用可能になる予定です。

独自の GIL を持つインタープリタを作成するには、新しい Py_NewInterpreterFromConfig() 関数を使います:

PyInterpreterConfig config = {
    .check_multi_interp_extensions = 1,
    .gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) {
    return -1;
}
/* 新しいインタープリタが現在のスレッドでアクティブになりました。 */

インタープリタごとの GIL を持つサブインタープリタ向け C API の使用例については、Modules/_xxsubinterpretersmodule.c も参照してください。

(寄稿: Eric Snow, gh-104210 ほか)

PEP 669: CPython の低影響モニタリング

PEP 669 は、プロファイラーやデバッガーなどのツールが CPython のイベントを監視するための新しい API を定義します。 呼び出し、リターン、行の実行、例外、ジャンプなど、幅広いイベントを扱います。 使った機能の分だけコストがかかるため、オーバーヘッドがほぼゼロのデバッガーやカバレッジツールを実現できます。 詳しくは sys.monitoring を参照してください。

(Mark Shannon による gh-103082 での貢献)

PEP 688: バッファプロトコルを Python で利用可能にする

PEP 688 は Python のコードから バッファプロトコル を利用する方法を導入します。 __buffer__() メソッドを実装するクラスは今やバッファ型として利用可能です。

新しい ABC collections.abc.Buffer は、例えば型アノテーションでバッファオブジェクトを表す標準的な方法を提供します。 新しい列挙型 inspect.BufferFlags は、バッファの作成方法を調整するフラグを表します。 (Jelle Zijlstra が gh-102500 で貢献しました。)

PEP 709: 内包表記のインライン化

辞書、リスト、そして集合の内包表記は今やインライン化され、内包表記の毎回の実行の度に一度しか使われない関数オブジェクトが新規作成されることはなくなります。これにより内包表記の実行は最大2倍速くなります。詳しくは PEP 709 を参照してください。

内包表記の反復変数は引き続き独立しており、外側のスコープの同名の変数を上書きせず、内包表記の後からも参照できません。 ただし、インライン化により外から見える動作がいくつか変わります。

  • トレースバックに内包表記専用のフレームが表示されなくなり、トレースやプロファイリングでも内包表記が関数呼び出しとして表示されなくなりました。

  • symtable モジュールが内包表記ごとの子シンボルテーブルを生成しなくなりました。 代わりに、内包表記のローカル変数は親関数のシンボルテーブルに含まれます。

  • 内包表記の中で locals() を呼び出すと、内包表記の外側の変数も含まれるようになりました。 また、内包表記の「引数」のために生成されていた変数 .0 は含まれなくなりました。

  • locals() を直接反復する内包表記 (例えば [k for k in locals()]) は、トレース下で実行すると (コードカバレッジ測定など)、"RuntimeError: dictionary changed size during iteration" になる場合があります。 これは for k in locals(): などでも既に見られる動作と同じです。 このエラーを避けるには、先に反復するキーのリストを作成してください: keys = list(locals()); [k for k in keys]。

(Carl Meyer and Vladimir Matveev が PEP 709 で貢献しました。)

エラーメッセージの改善

  • NameError がトップレベルまで伝播した際にインタープリタが表示するエラーメッセージで、標準ライブラリのモジュールが候補として提示されるようになりました。 (Pablo Galindo が gh-98254 で貢献しました。)

    >>> sys.version_info
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    NameError: name 'sys' is not defined. Did you forget to import 'sys'?
    
  • インスタンスに関する NameError 例外の候補提示を改善しました。 メソッドで NameError が送出され、例外中の名前と完全に一致する属性をインスタンスが持つ場合、メソッドのスコープで最も近い名前の代わりに self.<NAME> を候補として提示するようになりました。 (Pablo Galindo が gh-99139 で貢献しました。)

    >>> class A:
    ...    def __init__(self):
    ...        self.blech = 1
    ...
    ...    def foo(self):
    ...        somethin = blech
    ...
    >>> A().foo()
    Traceback (most recent call last):
      File "<stdin>", line 1
        somethin = blech
                   ^^^^^
    NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
    
  • from y import x の代わりに import x from y と入力した場合の SyntaxError のエラーメッセージを改善しました。 (Pablo Galindo が gh-98931 で貢献しました。)

    >>> import a.y.z from b.y.z
    Traceback (most recent call last):
      File "<stdin>", line 1
        import a.y.z from b.y.z
        ^^^^^^^^^^^^^^^^^^^^^^^
    SyntaxError: Did you mean to use 'from ... import ...' instead?
    
  • from <module> import <name> 文の失敗時に送出される ImportError 例外で、<module> 内の利用可能な名前に基づき <name> の候補を提示するようになりました。 (Pablo Galindo が gh-91058 で貢献しました。)

    >>> from collections import chainmap
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
    

その他の言語変更

  • パーサが、ヌルバイトを含むソースコードを解析する際に SyntaxError を送出するようになりました。 (Pablo Galindo が gh-96670 で貢献しました。)

  • バックスラッシュとそれに続く文字が有効なエスケープシーケンスでない場合、DeprecationWarning の代わりに SyntaxWarning が出るようになりました。 例えば re.compile("\d+\.\d+") は SyntaxWarning を出します ("\d" は無効なエスケープシーケンスなので、正規表現には re.compile(r"\d+\.\d+") のように raw 文字列を使ってください)。 将来の Python バージョンでは、SyntaxWarning の代わりに SyntaxError が送出されるようになります。 (Victor Stinner が gh-98401 で貢献しました。)

  • Python 3.11 で非推奨になった、値が 0o377 より大きい 8 進エスケープ ("\477" など) は、DeprecationWarning の代わりに SyntaxWarning を出すようになりました。 将来の Python バージョンでは SyntaxError になります。 (Victor Stinner が gh-98401 で貢献しました。)

  • 内包表記の代入先部分で使われていても、その変数自体には代入されない変数は、代入式 (:=) で使えるようになりました。 例えば [(b := 1) for a, b.prop in some_iter] で、b への代入が認められるようになりました。 ただし、内包表記の代入先部分で実際に代入される変数 (a など) への代入は、PEP 572 に従い引き続き禁止されています。 (Nikita Sobolev が gh-100581 で貢献しました。)

  • クラスや型の __set_name__ メソッドで送出された例外が、RuntimeError で包まれなくなりました。 状況に関する情報は PEP 678 の注記として例外に追加されます。 (Irit Katriel が gh-77757 で貢献しました。)

  • try-except* 構文で ExceptionGroup 全体を処理し、別の例外を 1 つ送出した場合、その例外が ExceptionGroup で包まれなくなりました。 この変更はバージョン 3.11.4 にも適用されています。 (Irit Katriel が gh-103590 で貢献しました。)

  • ガベージコレクタは、オブジェクトの割り当て時ではなく、Python のバイトコード評価ループの eval breaker の仕組みによってのみ実行されるようになりました。 PyErr_CheckSignals() の呼び出し時にも GC を実行できるため、Python コードを実行せず長時間動作する必要のある C 拡張にも、定期的に GC を実行する機会があります。 (Pablo Galindo が gh-97922 で貢献しました。)

  • 真偽値の引数を取るすべての組み込みおよび拡張の呼び出し可能オブジェクトが、bool と int だけでなく、任意の型の引数を受け付けるようになりました。 (Serhiy Storchaka が gh-60203 で貢献しました。)

  • memoryview が半精度浮動小数点型 (書式コード "e") をサポートするようになりました。 (Donghee Na and Antoine Pitrou が gh-90751 で貢献しました。)

  • slice objects are now hashable, allowing them to be used as dict keys and set items. (Contributed by Will Bradshaw, Furkan Onder, and Raymond Hettinger in gh-101264.)

  • sum() は、浮動小数点数の和や、整数と浮動小数点数が混在する和の精度と可換性を改善するため、Neumaier の加算アルゴリズムを使うようになりました。 (Raymond Hettinger が gh-100425 で貢献しました。)

  • ast.parse() は、ヌルバイトを含むソースコードを解析する際に ValueError の代わりに SyntaxError を送出するようになりました。 (Pablo Galindo が gh-96670 で貢献しました。)

  • tarfile の展開用メソッドと shutil.unpack_archive() に、新しい filter 引数を追加しました。 展開先ディレクトリの外にファイルを作成するなど、予想外の動作や危険をもたらす可能性のある tar の機能を制限できます。 詳しくは tarfile の展開フィルター を参照してください。 Python 3.14 ではデフォルトが 'data' に変わります。 (Petr Viktorin が PEP 706 で貢献しました。)

  • 基となるマッピングがハッシュ可能な場合、types.MappingProxyType のインスタンスもハッシュ可能になりました。 (Serhiy Storchaka が gh-87995 で貢献しました。)

  • 新しい環境変数 PYTHONPERFSUPPORT とコマンドラインオプション -X perf、および新しい関数 sys.activate_stack_trampoline()、sys.deactivate_stack_trampoline()、sys.is_stack_trampoline_active() により、perf プロファイラーへの対応 を追加しました。 (Pablo Galindo が設計しました。 Pablo Galindo と Christian Heimes が、Gregory P. Smith [Google] と Mark Shannon の協力を得て gh-96123 で貢献しました。)

新たなモジュール

  • ありません。

改良されたモジュール

array

asyncio

  • asyncio のソケットへの書き込み性能が大幅に向上しました。 asyncio はソケットに書き込む際の不要なコピーを避け、プラットフォームが対応していれば sendmsg() を使うようになりました。 (Kumar Aditya が gh-91166 で貢献しました。)

  • イベントループでタスクの即時実行を選択できる asyncio.eager_task_factory() 関数と asyncio.create_eager_task_factory() 関数を追加しました。 一部の用途で 2 倍から 5 倍高速になります。 (Jacob Bower と Itamar Oren が gh-102853、gh-104140、gh-104138 で貢献しました。)

  • Linux で os.pidfd_open() が利用可能で正常に機能する場合、asyncio はデフォルトで asyncio.ThreadedChildWatcher の代わりに asyncio.PidfdChildWatcher を使うようになりました。 (Kumar Aditya が gh-98024 で貢献しました。)

  • イベントループが、各プラットフォームで利用できる最適な子プロセスウォッチャー (対応していれば asyncio.PidfdChildWatcher、そうでなければ asyncio.ThreadedChildWatcher) を使うようになったため、子プロセスウォッチャーを手動で設定することは推奨されません。 (Kumar Aditya が gh-94597 で貢献しました。)

  • asyncio.run() に loop_factory 引数を追加し、独自のイベントループファクトリーを指定できるようにしました。 (Kumar Aditya が gh-99388 で貢献しました。)

  • asyncio.current_task() の C 実装を追加し、4 倍から 6 倍高速化しました。 (Itamar Oren and Pranav Thulasiram Bhat が gh-100344 で貢献しました。)

  • asyncio が従来のジェネレータベースのコルーチンをサポートしていないため、asyncio.iscoroutine() はジェネレータに対して False を返すようになりました。 (Kumar Aditya が gh-102748 で貢献しました。)

  • asyncio.wait() と asyncio.as_completed() が、タスクを yield するジェネレータを受け付けるようになりました。 (Kumar Aditya が gh-78530 で貢献しました。)

calendar

csv

dis

  • 擬似命令のオペコード (コンパイラーで使われるものの、実行可能なバイトコードには現れないもの) が dis モジュールで公開されました。 HAVE_ARGUMENT は実際のオペコードでは引き続き意味がありますが、擬似命令には役立ちません。 代わりに、新しい dis.hasarg コレクションを使ってください。 (Irit Katriel が gh-94216 で貢献しました。)

  • 例外ハンドラーを設定する命令を示す dis.hasexc コレクションを追加しました。 (Irit Katriel が gh-94216 で貢献しました。)

fractions

  • fractions.Fraction 型のオブジェクトが、浮動小数点数と同じ形式の書式化をサポートするようになりました。 (Mark Dickinson が gh-100161 で貢献しました。)

importlib.resources

inspect

itertools

  • 要素を同じ大きさのタプルにまとめる itertools.batched() を追加しました。 最後のバッチは他より短くなる場合があります。 (Raymond Hettinger が gh-98363 で貢献しました。)

math

  • 積の和を計算する math.sumprod() を追加しました。 (Raymond Hettinger が gh-100485 で貢献しました。)

  • math.nextafter() に steps 引数を追加し、一度に複数ステップ上下に移動できるようにしました。 (Matthias Goergens, Mark Dickinson, and Raymond Hettinger が gh-94906 で貢献しました。)

os

  • os.pidfd_open() でプロセスのファイル記述子を非ブロッキングモードで開くための os.PIDFD_NONBLOCK を追加しました。 (Kumar Aditya が gh-93312 で貢献しました。)

  • os.DirEntry に、エントリーがジャンクションかどうかを調べる os.DirEntry.is_junction() メソッドを追加しました。 (Charles Machalow が gh-99547 で貢献しました。)

  • Windows でドライブ、ボリューム、マウントポイントを列挙する os.listdrives()、os.listvolumes()、os.listmounts() 関数を追加しました。 (Steve Dower が gh-102519 で貢献しました。)

  • Windows で os.stat() と os.lstat() の結果がより正確になりました。 st_birthtime フィールドにはファイルの作成時刻が格納されるようになりました。 st_ctime は非推奨ですが、引き続き作成時刻が格納されます (将来は他のプラットフォームとの一貫性のため、メタデータの最終変更時刻を返すようになります)。 ファイルシステムによっては st_dev が最大 64 ビット、st_ino が最大 128 ビットになり、st_rdev には誤った値ではなく常にゼロが設定されます。 新しい Windows リリースでは、どちらの関数も大幅に高速になる可能性があります。 (Steve Dower が gh-99726 で貢献しました。)

os.path

  • 指定したパスがジャンクションかどうかを調べる os.path.isjunction() を追加しました。 (Charles Machalow が gh-99547 で貢献しました。)

  • パスを 3 つ組 (drive, root, tail) に分割する os.path.splitroot() を追加しました。 (Barney Gale が gh-101000 で貢献しました。)

pathlib

platform

  • Windows 11 と Windows Server 2012 より後のリリースの検出をサポートしました。 従来、Windows Server 2012 より新しい Windows Server や Windows 11 では、調べると Windows-10 が返されていました。 (Steve Dower が gh-89545 で貢献しました。)

pdb

  • デバッグセッション中に値を一時的に保持し、現在のフレームや戻り値などへ素早くアクセスできるコンビニエンス変数を追加しました。 (Tian Gao が gh-103693 で貢献しました。)

random

shutil

  • shutil.make_archive() は、対応している独自のアーカイバーに root_dir 引数を渡すようになりました。 この場合、アーカイブ作成のためにプロセスの現在の作業ディレクトリを一時的に root_dir に変更することはなくなりました。 (Serhiy Storchaka が gh-74696 で貢献しました。)

  • shutil.rmtree() が新しい引数 onexc を受け付けるようになりました。 onerror と同様のエラーハンドラーですが、(typ, val, tb) という 3 つ組の代わりに例外インスタンスを受け取ります。 onerror は非推奨になりました。 (Irit Katriel が gh-102828 で貢献しました。)

  • Windows で shutil.which() が PATH 内の一致するファイルを探す際に、指定された cmd にディレクトリ部分が含まれる場合でも、環境変数 PATHEXT を参照するようになりました。 (Charles Machalow が gh-103179 で貢献しました。)

    shutil.which() は Windows で実行ファイルを探す際に NeedCurrentDirectoryForExePathW を呼び出し、現在の作業ディレクトリを検索パスの先頭に追加すべきかを判断するようになりました。 (Charles Machalow が gh-103179 で貢献しました。)

    Windows で shutil.which() は、検索パスの他の場所にある cmd そのものと一致するパスよりも、PATHEXT の要素を cmd に付けて一致するパスを優先して返すようになりました。 (Charles Machalow が gh-103179 で貢献しました。)

sqlite3

statistics

  • statistics.correlation() に ranked という計算方法を追加し、順位データのスピアマンの相関係数を計算できるようにしました。 (Raymond Hettinger が gh-95861 で貢献しました。)

sys

  • PEP 669 の新しいモニタリング API を公開する sys.monitoring 名前空間を追加しました。 (Mark Shannon が gh-103082 で貢献しました。)

  • スタックプロファイラーのトランポリンを有効・無効にする sys.activate_stack_trampoline() と sys.deactivate_stack_trampoline()、および有効かどうかを調べる sys.is_stack_trampoline_active() を追加しました。 (Pablo Galindo and Christian Heimes with contributions from Gregory P. Smith [Google] and Mark Shannon が gh-96123 で貢献しました。)

  • 最後に送出されて未処理となった例外を保持する sys.last_exc を追加しました (事後デバッグ用)。 同じ情報を従来の形式で保持していた 3 つのフィールド、sys.last_type、sys.last_value、sys.last_traceback は非推奨になりました。 (Irit Katriel が gh-102778 で貢献しました。)

  • sys._current_exceptions() が、スレッド ID から (typ, exc, tb) タプルへのマッピングではなく、例外インスタンスへのマッピングを返すようになりました。 (Irit Katriel が gh-103176 で貢献しました。)

  • sys.setrecursionlimit() と sys.getrecursionlimit() の再帰上限は、Python コードだけに適用されるようになりました。 組み込み関数はこの再帰上限を使わず、再帰による仮想マシンのクラッシュを防ぐ別の仕組みで保護されます。

tempfile

  • tempfile.NamedTemporaryFile 関数に、省略可能な引数 delete_on_close を追加しました。 (Evgeny Zorin が gh-58451 で貢献しました。)

  • tempfile.mkdtemp() は、dir 引数に相対パスを渡した場合でも、常に絶対パスを返すようになりました。

threading

tkinter

  • tkinter.Canvas.coords() が引数の入れ子を平坦化するようになりました。 座標を個別の引数 (x1, y1, x2, y2, ...) やシーケンス ([x1, y1, x2, y2, ...]) として受け取るだけでなく、create_*() メソッドと同様に、ペアにまとめた座標 ((x1, y1), (x2, y2), ... や [(x1, y1), (x2, y2), ...]) も受け付けるようになりました。 (Serhiy Storchaka が gh-94473 で貢献しました。)

tokenize

  • tokenize モジュールに PEP 701 で導入された変更を反映しました。 (Marta Gómez Macías と Pablo Galindo が gh-102856 で貢献しました。) tokenize モジュールの変更について詳しくは Python 3.12 への移植 を参照してください。

types

typing

  • 実行時チェック可能なプロトコル に対する isinstance() のチェックでは、属性の存在確認に hasattr() ではなく inspect.getattr_static() を使うようになりました。 これにより、実行時チェック可能なプロトコルに対する isinstance() チェック中に、デスクリプタや __getattr__() メソッドが予期せず評価されることがなくなります。 ただし、従来は実行時チェック可能なプロトコルのインスタンスと見なされていたオブジェクトが、Python 3.12 以降ではそう見なされなくなる場合や、その逆の場合もあります。 ほとんどの利用者はこの変更の影響を受けないと考えられます。 (Alex Waygood が gh-102433 で貢献しました。)

  • 実行時チェック可能なプロトコルのメンバーは、クラスが作成された時点で「固定」されたものとして扱われるようになりました。 実行時チェック可能なプロトコルの属性をモンキーパッチで変更することは引き続きできますが、オブジェクトとそのプロトコルを比較する isinstance() チェックには影響しません。 例えば、次のとおりです。

    >>> from typing import Protocol, runtime_checkable
    >>> @runtime_checkable
    ... class HasX(Protocol):
    ...     x = 1
    ...
    >>> class Foo: ...
    ...
    >>> f = Foo()
    >>> isinstance(f, HasX)
    False
    >>> f.x = 1
    >>> isinstance(f, HasX)
    True
    >>> HasX.y = 2
    >>> isinstance(f, HasX)  # HasX に "y" 属性が加わっても結果は変わらない
    True
    

    この変更は、実行時チェック可能なプロトコルに対する isinstance() チェックを高速化するために行われました。

  • 実行時チェック可能なプロトコル に対する isinstance() チェックの性能特性が大きく変わりました。 メンバーが少ないプロトコルに対する isinstance() チェックの大半は、3.11 と比べて少なくとも 2 倍高速になり、中には 20 倍以上高速になるものもあります。 ただし、メンバーが多いプロトコルに対する isinstance() チェックは、Python 3.11 より遅くなる場合があります。 (Alex Waygood が gh-74690 and gh-103193 で貢献しました。)

  • すべての typing.TypedDict クラスと typing.NamedTuple クラスが __orig_bases__ 属性を持つようになりました。 (Adrian Garcia Badaracco が gh-103699 で貢献しました。)

  • @typing.dataclass_transform に frozen_default 引数を追加しました。 (Erik De Bonte が gh-99957 で貢献しました。)

unicodedata

  • Unicode データベースをバージョン 15.0.0 に更新しました。 (Benjamin Peterson が gh-96734 で貢献しました)。

unittest

最も時間がかかったテストケースを N 件表示するコマンドラインオプション --durations を追加しました。

python3 -m unittest --durations=3 lib.tests.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s     test_timeout (Lib.test.test_threading.BarrierTests)
1.003s     test_default_timeout (Lib.test.test_threading.BarrierTests)
0.518s     test_timeout (Lib.test.test_threading.EventTests)

(0.000 durations hidden.  Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s

OK (skipped=3)

(Giampaolo Rodola が gh-48330 で貢献しました。)

uuid

最適化

  • Unicode オブジェクトから wstr メンバーと wstr_length メンバーを削除しました。 64 ビットプラットフォームでは、オブジェクトのサイズが 8 または 16 バイト小さくなります。 (PEP 623) (Inada Naoki が gh-92536 で貢献しました。)

  • ビルド処理で BOLT バイナリオプティマイザーを使う実験的なサポートを追加しました。 性能が 1~5% 向上します。 (Kevin Modzelewski が gh-90536 で貢献し、Donghee Na が gh-101525 で調整しました。)

  • グループ参照を含む置換文字列を使う正規表現の置換 (re.sub() 関数、re.subn() 関数、および対応する re.Pattern のメソッド) を 2~3 倍高速化しました。 (Serhiy Storchaka が gh-91524 で貢献しました。)

  • コストの高い文字列の書式化を遅らせることで、asyncio.Task の作成を高速化しました。 (Itamar Oren が gh-103793 で貢献しました。)

  • tokenize モジュールで PEP 701 に対応するための変更に伴い、tokenize.tokenize() 関数と tokenize.generate_tokens() 関数が最大 64% 高速になりました。 (Marta Gómez Macías and Pablo Galindo が gh-102856 で貢献しました。)

  • 新しい LOAD_SUPER_ATTR 命令により、super() を経由したメソッド呼び出しと属性の読み込みを高速化しました。 (Carl Meyer and Vladimir Matveev が gh-103497 で貢献しました。)

CPython バイトコードの変更

  • LOAD_METHOD 命令を削除し、LOAD_ATTR に統合しました。 LOAD_ATTR は、oparg の最下位ビットがセットされている場合、従来の LOAD_METHOD 命令と同じように動作します。 (Ken Jin が gh-93429 で貢献しました。)

  • JUMP_IF_FALSE_OR_POP 命令と JUMP_IF_TRUE_OR_POP 命令を削除しました。 (Irit Katriel が gh-102859 で貢献しました。)

  • PRECALL 命令を削除しました。 (Mark Shannon が gh-92925 で貢献しました。)

  • BINARY_SLICE 命令と STORE_SLICE 命令を追加しました。 (Mark Shannon が gh-94163 で貢献しました。)

  • CALL_INTRINSIC_1 命令を追加しました。 (Mark Shannon が gh-99005 で貢献しました。)

  • CALL_INTRINSIC_2 命令を追加しました。 (Irit Katriel が gh-101799 で貢献しました。)

  • CLEANUP_THROW 命令を追加しました。 (Brandt Bucher が gh-90997 で貢献しました。)

  • END_SEND 命令を追加しました。 (Mark Shannon が gh-103082 で貢献しました。)

  • PEP 709 の実装の一部として、LOAD_FAST_AND_CLEAR 命令を追加しました。 (Carl Meyer が gh-101441 で貢献しました。)

  • LOAD_FAST_CHECK 命令を追加しました。 (Dennis Sweeney が gh-93143 で貢献しました。)

  • PEP 695 の実装の一部として、LOAD_FROM_DICT_OR_DEREF、LOAD_FROM_DICT_OR_GLOBALS、LOAD_LOCALS オペコードを追加しました。 LOAD_CLASSDEREF オペコードを削除しました。 これは LOAD_LOCALS と LOAD_FROM_DICT_OR_DEREF の組み合わせで置き換えられます。 (Jelle Zijlstra が gh-103764 で貢献しました。)

  • LOAD_SUPER_ATTR 命令を追加しました。 (Carl Meyer and Vladimir Matveev が gh-103497 で貢献しました。)

  • RETURN_CONST 命令を追加しました。 (Wenyang Wang が gh-101632 で貢献しました。)

デモとツール

  • 古いデモスクリプトを含む Tools/demo/ ディレクトリを削除しました。 コピーは old-demos プロジェクト にあります。 (Victor Stinner が gh-97681 で貢献しました。)

  • Tools/scripts/ ディレクトリの古くなったサンプルスクリプトを削除しました。 コピーは old-demos プロジェクト にあります。 (Victor Stinner が gh-97669 で貢献しました。)

非推奨

  • argparse: argparse.BooleanOptionalAction の type、choices、metavar 引数が非推奨になり、3.14 で削除される予定です。 (Nikita Sobolev が gh-92248 で貢献しました。)

  • ast: 以下の 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 and Guido van Rossum が gh-100160 で貢献しました。)

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

  • collections.abc: collections.abc.ByteString が非推奨になりました。

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

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

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

  • datetime: datetime.datetime の utcnow() と utcfromtimestamp() が非推奨になり、将来のバージョンで削除される予定です。 代わりに、UTC の日時を表すにはタイムゾーン情報を持つオブジェクトを使ってください。 それぞれ now() と fromtimestamp() を、tz 引数に datetime.UTC を指定して呼び出してください。 (Paul Ganssle が gh-103857 で貢献しました。)

  • email: email.utils.localtime() の isdst 引数が非推奨になりました。 (Alan Williams が gh-72346 で貢献しました。)

  • importlib.abc: 以下のクラスが非推奨になり、Python 3.14 で削除予定です。

    • importlib.abc.ResourceReader

    • importlib.abc.Traversable

    • importlib.abc.TraversableResources

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

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

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

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

  • pkgutil: pkgutil.find_loader() と pkgutil.get_loader() が非推奨になり、Python 3.14 で削除される予定です。 代わりに importlib.util.find_spec() を使ってください。 (Nikita Sobolev が gh-97850 で貢献しました。)

  • pty: ドキュメントに記載のない master_open() と slave_open() という 2 つの関数は Python 2 から非推奨でしたが、3.12 で初めて DeprecationWarning を出すようになりました。 3.14 で削除される予定です。 (Soumendra Ganguly and Gregory P. Smith が gh-85984 で貢献しました。)

  • os:

    • Windows で os.stat() と os.lstat() が返す st_ctime フィールドが非推奨になりました。 将来のリリースでは、他のプラットフォームと同じくメタデータの最終変更時刻が格納されるようになります。 現在は引き続き作成時刻が格納されますが、この値は新しい st_birthtime フィールドでも取得できます。 (Steve Dower が gh-99726 で貢献しました。)

    • POSIX プラットフォームでは、マルチスレッドのプロセスから呼び出されたことを検出できた場合、os.fork() が DeprecationWarning を出すことがあります。 こうした呼び出しは、たとえコードが動作している ように見えても、以前から POSIX プラットフォームと根本的に相容れないものでした。 このようなコードで問題に遭遇する機会が増えているため、注意を促す警告を追加しました。 詳細については os.fork() のドキュメントを参照してください。 また、以前からあるこのプラットフォーム互換性の問題を なぜ 今開発者に伝えるのかについては、fork とスレッドの非互換性に関する議論 を参照してください。

    multiprocessing または concurrent.futures の使用によってこの警告が出る場合は、multiprocessing の開始方式を "spawn" や "forkserver" などに変更してください。

  • shutil: shutil.rmtree() の onerror 引数が非推奨になりました。 代わりに onexc を使ってください。 (Irit Katriel が gh-102828 で貢献しました。)

  • sqlite3:

  • sys: sys.last_type、sys.last_value、sys.last_traceback フィールドが非推奨になりました。 代わりに sys.last_exc を使ってください。 (Irit Katriel が gh-102778 で貢献しました。)

  • tarfile: filter を指定せずに tar アーカイブを展開することは、'data' フィルターがデフォルトになる Python 3.14 まで非推奨です。 詳しくは 展開フィルター を参照してください。

  • typing:

  • xml.etree.ElementTree: xml.etree.ElementTree.Element の真偽値を調べると DeprecationWarning が出るようになりました。 従来は Python 実装では FutureWarning が出て、C 実装では何も出ませんでした。 (Jacob Walls が gh-83122 で貢献しました。)

  • コルーチンの throw()、ジェネレータの throw()、非同期ジェネレータの throw() の 3 引数 (type、value、traceback) のシグネチャが非推奨になり、将来の Python バージョンで削除される可能性があります。 代わりに引数が 1 つの形式を使ってください。 (Ofey Chan が gh-89874 で貢献しました。)

  • モジュールの __package__ が __spec__.parent と異なる場合、従来の ImportWarning の代わりに DeprecationWarning が出るようになりました。 (Brett Cannon が gh-65961 で貢献しました。)

  • Setting __package__ or __cached__ on a module is deprecated, and will cease to be set or taken into consideration by the import system in Python 3.14. (Contributed by Brett Cannon in gh-65961.)

  • bool に対するビット単位の反転演算子 (~) が非推奨になりました。 Python 3.16 ではエラーになります。 bool の論理否定には、代わりに not を使ってください。 元の int のビット単位の反転が本当に必要になるまれな場合には、~int(x) のように明示的に int に変換してください。 (Tim Hoffmann が gh-103487 で貢献しました。)

  • コードオブジェクトの codeobject.co_lnotab へのアクセスは PEP 626 により Python 3.10 で非推奨になりましたが、3.12 で初めて DeprecationWarning を出すようになりました。 3.15 で削除される可能性があります。 (Nikita Sobolev が gh-101866 で貢献しました。)

Python 3.13 で削除予定

モジュール(PEP 594 を参照):

  • aifc

  • audioop

  • cgi

  • cgitb

  • chunk

  • crypt

  • imghdr

  • mailcap

  • msilib

  • nis

  • nntplib

  • ossaudiodev

  • pipes

  • sndhdr

  • spwd

  • sunau

  • telnetlib

  • uu

  • xdrlib

その他のモジュール:

  • lib2to3 と 2to3 プログラム (gh-84540)

API

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

削除

asynchat と asyncore

  • Python 3.6 から非推奨だったこの 2 つのモジュールを、PEP 594 の予定に従って削除しました。 代わりに asyncio を使ってください。 (Nikita Sobolev が gh-96580 で貢献しました。)

configparser

  • configparser で 3.2 の時点から非推奨だった以下の名前を、gh-89336 に従って削除しました。

distutils

  • distutils パッケージを削除しました。 これは PEP 632 「distutils モジュールの非推奨化」により Python 3.10 で非推奨になっていました。 distutils を使っていて他の仕組みに移行できないプロジェクトでは、引き続き distutils を提供する setuptools プロジェクトをインストールできます。 (Victor Stinner が gh-92584 で貢献しました。)

ensurepip

  • ensurepip に同梱していた setuptools の wheel を削除し、venv で作成する環境に setuptools をインストールしなくなりました。

    pip (>= 22.1) は、実行環境への setuptools のインストールを必要としません。 pip はパッケージのビルドに使う環境に setuptools を用意するため、setuptools ベース (および distutils ベース) のパッケージも引き続き pip install で利用できます。

    easy_install、pkg_resources、setuptools、distutils は setuptools パッケージの一部であるため、venv で作成した環境や ensurepip で初期設定した環境には、デフォルトで提供されなくなりました。 実行時にこれらに依存するプロジェクトでは、setuptools プロジェクトを依存関係として宣言し、別途インストールする必要があります (通常は pip を使います)。

    (Pradyun Gedam が gh-95299 で貢献しました。)

enum

  • enum の EnumMeta.__getattr__ を削除しました。 列挙型の属性へのアクセスに必要なくなったためです。 (Ethan Furman が gh-95083 で貢献しました。)

ftplib

  • ftplib のクラス属性 FTP_TLS.ssl_version を削除しました。 代わりに context 引数を使ってください。 (Victor Stinner が gh-94172 で貢献しました。)

gzip

  • gzip の gzip.GzipFile から、Python 2.6 から非推奨だった filename 属性を削除しました。 代わりに name 属性を使ってください。 書き込みモードでは、filename 属性はファイル拡張子 '.gz' がなければ追加していました。 (Victor Stinner が gh-94196 で貢献しました。)

hashlib

  • hashlib の hashlib.pbkdf2_hmac() から、Python 3.10 で非推奨になった純 Python 実装を削除しました。 Python 3.10 以降には OpenSSL 1.1.1 が必要です (PEP 644)。 このバージョンの OpenSSL は、より高速な pbkdf2_hmac() の C 実装を提供します。 (Victor Stinner が gh-94199 で貢献しました。)

importlib

  • importlib で以前から非推奨だった機能の整理を、多くの箇所で完了しました。

    • module_repr() への参照とサポートを削除しました。 (Barry Warsaw が gh-97850 で貢献しました。)

    • importlib.util.set_package、importlib.util.set_loader、importlib.util.module_for_loader をすべて削除しました。 (Brett Cannon and Nikita Sobolev が gh-65961 and gh-97850 で貢献しました。)

    • find_loader() API と find_module() API のサポートを削除しました。 (Barry Warsaw が gh-98040 で貢献しました。)

    • importlib.abc.Finder、pkgutil.ImpImporter、pkgutil.ImpLoader を削除しました。 (Barry Warsaw が gh-98040 で貢献しました。)

imp

  • imp モジュールを削除しました。 (Barry Warsaw が gh-98040 で貢献しました。)

    移行には、以下の対応表を参照してください。

    imp

    importlib

    imp.NullImporter

    sys.path_importer_cache に None を挿入する

    imp.cache_from_source()

    importlib.util.cache_from_source()

    imp.find_module()

    importlib.util.find_spec()

    imp.get_magic()

    importlib.util.MAGIC_NUMBER

    imp.get_suffixes()

    importlib.machinery.SOURCE_SUFFIXES、importlib.machinery.EXTENSION_SUFFIXES、importlib.machinery.BYTECODE_SUFFIXES

    imp.get_tag()

    sys.implementation.cache_tag

    imp.load_module()

    importlib.import_module()

    imp.new_module(name)

    types.ModuleType(name)

    imp.reload()

    importlib.reload()

    imp.source_from_cache()

    importlib.util.source_from_cache()

    imp.load_source()

    下記を参照

    imp.load_source() を次のコードで置き換えてください。

    import importlib.util
    import importlib.machinery
    
    def load_source(modname, filename):
        loader = importlib.machinery.SourceFileLoader(modname, filename)
        spec = importlib.util.spec_from_file_location(modname, filename, loader=loader)
        module = importlib.util.module_from_spec(spec)
        # モジュールは常に実行され、sys.modules にはキャッシュされない。
        # モジュールをキャッシュするには、次の行のコメントを外す。
        # sys.modules[module.__name__] = module
        loader.exec_module(module)
        return module
    
  • 代替のない imp の関数と属性を削除しました。

    • ドキュメント化されていない関数:

      • imp.init_builtin()

      • imp.load_compiled()

      • imp.load_dynamic()

      • imp.load_package()

    • imp.lock_held()、imp.acquire_lock()、imp.release_lock(): ロック方式は Python 3.3 でモジュールごとのロックに変わりました。

    • imp.find_module() の定数: SEARCH_ERROR、PY_SOURCE、PY_COMPILED、C_EXTENSION、PY_RESOURCE、PKG_DIRECTORY、C_BUILTIN、PY_FROZEN、PY_CODERESOURCE、IMP_HOOK。

io

  • io の io.OpenWrapper と _pyio.OpenWrapper を削除しました。 これらは Python 3.10 で非推奨になっていました。 代わりに open() をそのまま使ってください。 open() (io.open()) は組み込み関数です。 Python 3.10 以降では _pyio.open() も静的メソッドになっています。 (Victor Stinner が gh-94169 で貢献しました。)

locale

  • locale の locale.format() 関数を削除しました。 これは Python 3.7 で非推奨になっていました。 代わりに locale.format_string() を使ってください。 (Victor Stinner が gh-94226 で貢献しました。)

smtpd

  • Python 3.4.7 と 3.5.4 で非推奨になった smtpd モジュールを、PEP 594 の予定に従って削除しました。 代わりに PyPI の aiosmtpd モジュールや、他の asyncio ベースのサーバーを使ってください。 (Oleg Iarygin が gh-93243 で貢献しました。)

sqlite3

  • Python 3.10 で非推奨になった、ドキュメントに記載のない以下の sqlite3 の機能を削除しました。

    • sqlite3.enable_shared_cache()

    • sqlite3.OptimizedUnicode

    共有キャッシュが必要な場合は、クエリーパラメータ cache=shared を指定して URI モードでデータベースを開いてください。

    テキストファクトリー sqlite3.OptimizedUnicode は、Python 3.3 から str の別名でした。 以前テキストファクトリーを OptimizedUnicode に設定していたコードでは、str を明示的に指定するか、同じく str であるデフォルト値を使えます。

    (Erlend E. Aasland が gh-92548 で貢献しました。)

ssl

  • ssl の ssl.RAND_pseudo_bytes() 関数を削除しました。 これは Python 3.6 で非推奨になっていました。 代わりに os.urandom() または ssl.RAND_bytes() を使ってください。 (Victor Stinner が gh-94199 で貢献しました。)

  • ssl.match_hostname() 関数を削除しました。 これは Python 3.7 で非推奨になっていました。 Python 3.7 以降では OpenSSL がホスト名の照合を行うため、Python は ssl.match_hostname() 関数を使わなくなりました。 (Victor Stinner が gh-94199 で貢献しました。)

  • Python 3.7 で非推奨になった ssl.wrap_socket() 関数を削除しました。 代わりに ssl.SSLContext オブジェクトを作成し、その ssl.SSLContext.wrap_socket メソッドを呼び出してください。 ssl.wrap_socket() をまだ使っているパッケージには問題があり、安全ではありません。 この関数は SNI TLS 拡張を送信せず、サーバーのホスト名も検証しません。 こうしたコードは CWE 295 (証明書の検証不備) に該当します。 (Victor Stinner が gh-94199 で貢献しました。)

unittest

webbrowser

  • webbrowser から古いブラウザーのサポートを削除しました。 対象は Grail、Mosaic、Netscape、Galeon、Skipstone、Iceape、Firebird、およびバージョン 35 以前の Firefox です (gh-102871)。

xml.etree.ElementTree

  • 純 Python 実装の ElementTree.Element.copy() メソッドを削除しました。 これは Python 3.10 で非推奨になっていました。 代わりに copy.copy() 関数を使ってください。 xml.etree.ElementTree の C 実装には copy() メソッドはなく、__copy__() メソッドだけがあります。 (Victor Stinner が gh-94383 で貢献しました。)

zipimport

  • zipimport から Python 3.10 で非推奨になった find_loader() メソッドと find_module() メソッドを削除しました。 代わりに find_spec() メソッドを使ってください。 理由は PEP 451 を参照してください。 (Victor Stinner が gh-94379 で貢献しました。)

その他

  • ドキュメント用の Makefile から suspicious ルールを削除し、Doc/tools/rstlint.py も削除しました。 どちらも sphinx-lint に置き換えられます。 (Julien Palard が gh-98179 で貢献しました。)

  • ftplib、imaplib、poplib、smtplib モジュールの keyfile 引数と certfile 引数、および http.client モジュールの key_file、cert_file、check_hostname 引数を削除しました。 これらはすべて Python 3.6 から非推奨でした。 代わりに context 引数 (imaplib では ssl_context) を使ってください。 (Victor Stinner が gh-94172 で貢献しました。)

  • いくつかの標準ライブラリモジュールとテストから、Jython との互換性のための特別な処理を削除しました。 (Nikita Sobolev が gh-99482 で貢献しました。)

  • ctypes モジュールから _use_broken_old_ctypes_structure_semantics_ フラグを削除しました。 (Nikita Sobolev が gh-99285 で貢献しました。)

Python 3.12 への移植

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

Python API の変更

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

  • Python 3.10 から非推奨だった randrange() の機能を削除しました。 以前は randrange(10.0) を情報の損失なく randrange(10) に変換していましたが、今回から TypeError を送出します。 また、randrange(10.5) や randrange('10') のような整数以外の値に対する例外を、ValueError から TypeError に変更しました。 これにより、randrange(1e25) が randrange(10**25) よりも広い範囲から、警告なしに値を選んでしまうバグも防げます。 (Serhiy Storchaka が gh-86388 で最初に提案しました。)

  • argparse.ArgumentParser がファイルから引数を読み込む際 (fromfile_prefix_chars オプションなど) のエンコーディングとエラーハンドラーを、デフォルトのテキストエンコーディング (locale.getpreferredencoding(False) など) から ファイルシステムのエンコーディングとエラーハンドラー に変更しました。 Windows では引数ファイルを ANSI コードページではなく UTF-8 でエンコードしてください。

  • Python 3.4.7 と 3.5.4 で非推奨になった、asyncore ベースの smtpd モジュールを削除しました。 代わりに、asyncio ベースの PyPI モジュール aiosmtpd を推奨します。

  • shlex.split(): s 引数に None を渡すと、sys.stdin から読み込む代わりに例外を送出するようになりました。 この機能は Python 3.9 で非推奨になっていました。 (Victor Stinner が gh-94352 で貢献しました。)

  • The os module no longer accepts bytes-like paths, like bytearray and memoryview types: only the exact bytes type is accepted for bytes strings. (Contributed by Victor Stinner in gh-98393.)

  • syslog.openlog() と syslog.closelog() をサブインタープリタで使うと失敗するようになりました。 syslog.syslog() は引き続きサブインタープリタで使えますが、メインインタープリタで syslog.openlog() を既に呼び出している場合に限られます。 これらの新しい制限はメインインタープリタには適用されないため、影響を受ける利用者はごく少数と考えられます。 この変更はインタープリタの分離に役立ちます。 さらに、syslog はプロセス全体で共有されるリソースのラッパーなので、メインインタープリタから管理するのが適切です。 (Donghee Na が gh-99127 で貢献しました。)

  • @~functools.cached_property の、ドキュメントに記載のなかったロック動作を削除しました。 クラスのすべてのインスタンスにまたがってロックを取り、強いロック競合を引き起こしていたためです。 この結果、2 つのスレッドが競合すると、同じインスタンスについてキャッシュされるプロパティの取得関数が複数回実行される可能性があります。 ほとんどの単純なキャッシュされるプロパティ (例えば冪等で、インスタンスの他の属性から値を計算するだけのもの) では問題ありません。 同期が必要なら、プロパティの取得関数内や、複数スレッドからアクセスする箇所の前後でロックを実装してください。

  • sys._current_exceptions() が、スレッド ID から (typ, exc, tb) タプルへのマッピングではなく、例外インスタンスへのマッピングを返すようになりました。 (Irit Katriel が gh-103176 で貢献しました。)

  • tarfile または shutil.unpack_archive() で tar ファイルを展開する際は、filter 引数を渡して、予想外の動作や危険をもたらす可能性のある機能を制限してください。 詳しくは 展開フィルター を参照してください。

  • PEP 701 で導入された変更により、tokenize.tokenize() 関数と tokenize.generate_tokens() 関数の出力が変わりました。 f 文字列に対して STRING トークンは生成されなくなり、代わりに PEP 701 に記載されたトークンが生成されます。 f 文字列の「文字列」部分には FSTRING_START、FSTRING_MIDDLE、FSTRING_END が生成され、式の部分にはその式に応じたトークンが生成されます。 例えば f 文字列 f"start {1+1} end" に対して、従来のトークナイザーは次を生成していました。

    1,0-1,18:           STRING         'f"start {1+1} end"'
    

    新しいバージョンでは次を生成します。

    1,0-1,2:            FSTRING_START  'f"'
    1,2-1,8:            FSTRING_MIDDLE 'start '
    1,8-1,9:            OP             '{'
    1,9-1,10:           NUMBER         '1'
    1,10-1,11:          OP             '+'
    1,11-1,12:          NUMBER         '1'
    1,12-1,13:          OP             '}'
    1,13-1,17:          FSTRING_MIDDLE ' end'
    1,17-1,18:          FSTRING_END    '"'
    

    さらに、PEP 701 への対応に必要な変更に伴い、細かな動作の違いが生じる場合があります。 以下のような変更があります。

    • ! など、Python では無効な一部の文字をトークンに分割したときに生成されるトークンの type 属性が、ERRORTOKEN から OP に変わりました。

    • 不完全な複数行文字列と同様に、不完全な単一行文字列でも tokenize.TokenError が送出されるようになりました。

    • 不完全または無効な Python コードの一部をトークンに分割すると、任意の ERRORTOKEN トークンを返す代わりに tokenize.TokenError を送出するようになりました。

    • Mixing tabs and spaces as indentation in the same file is not supported anymore and will raise a TabError.

  • threading モジュールは、_thread モジュールが _is_main_interpreter 属性を持つことを要求するようになりました。 これは引数を取らない関数で、現在のインタープリタがメインインタープリタなら True を返します。

    独自の _thread モジュールを提供するライブラリやアプリケーションは、_is_main_interpreter() も提供する必要があります。 (gh-112826 を参照。)

ビルドの変更

  • Python は、共有 C 拡張モジュールのビルドに setup.py を使わなくなりました。 ヘッダーやライブラリなどのビルド設定は configure スクリプトで検出し、拡張は Makefile でビルドします。 ほとんどの拡張は pkg-config を使い、それが使えない場合は独自に検出します。 (Christian Heimes が gh-93939 で貢献しました。)

  • Python のビルドには、va_start(args, format), のような引数が 2 つの va_start() が必要になりました。 va_start() を引数 1 つで呼ぶことはなくなりました。 (Kumar Aditya が gh-93207 で貢献しました。)

  • Clang コンパイラーが対応するフラグを受け付ける場合、CPython はリンク時最適化のデフォルト方式として ThinLTO を使うようになりました。 (Donghee Na が gh-89536 で貢献しました。)

  • Makefile に変数 COMPILEALL_OPTS を追加し、make install での compileall のオプション (デフォルトは -j0) を上書きできるようにしました。 また、3 つの compileall コマンドを 1 つに統合し、すべての最適化レベル (0、1、2) の .pyc ファイルを一度にビルドするようにしました。 (Victor Stinner が gh-99289 で貢献しました。)

  • 64 ビット LoongArch 用のプラットフォームトリプレットを追加しました。

    • loongarch64-linux-gnusf

    • loongarch64-linux-gnuf32

    • loongarch64-linux-gnu

    (Zhang Na が gh-90656 で貢献しました。)

  • PYTHON_FOR_REGEN に Python 3.10 以降が必要になりました。

  • configure の再生成に Autoconf 2.71 と aclocal 1.16.4 が必要になりました。 (Christian Heimes が gh-89886 で貢献しました。)

  • python.org で配布する Windows ビルドと macOS インストーラーが OpenSSL 3.0 を使うようになりました。

C API の変更

新しい機能

  • PEP 697: Introduce the Unstable C API tier, intended for low-level tools like debuggers and JIT compilers. This API may change in each minor release of CPython without deprecation warnings. Its contents are marked by the PyUnstable_ prefix in names.

    コードオブジェクトのコンストラクター:

    • PyUnstable_Code_New() (PyCode_New から改名)

    • PyUnstable_Code_NewWithPosOnlyArgs() (PyCode_NewWithPosOnlyArgs から改名)

    コードオブジェクト用の追加ストレージ (PEP 523):

    • PyUnstable_Eval_RequestCodeExtraIndex() (_PyEval_RequestCodeExtraIndex から改名)

    • PyUnstable_Code_GetExtra() (_PyCode_GetExtra から改名)

    • PyUnstable_Code_SetExtra() (_PyCode_SetExtra から改名)

    元の名前は、それぞれの API が変更されるまで引き続き利用できます。

    (Petr Viktorin が gh-101101 で貢献しました。)

  • PEP 697: インスタンスのメモリレイアウトが不透明な型を拡張する API を追加しました。

    (Petr Viktorin が gh-103509 で貢献しました。)

  • 新しい Limited C API 関数 PyType_FromMetaclass() を追加しました。 既存の PyType_FromModuleAndSpec() を、メタクラス引数の追加によって一般化したものです。 (Wenzel Jakob が gh-93012 で貢献しました。)

  • vectorcall プロトコル で呼び出せるオブジェクトを作成する API を Limited API に追加しました。

    クラスの __call__() メソッドを再代入すると、そのクラスの Py_TPFLAGS_HAVE_VECTORCALL フラグを削除するようになりました。 これにより、ミュータブルな型 (不変フラグ Py_TPFLAGS_IMMUTABLETYPE を持たないヒープ型) でも vectorcall を安全に使えます。 tp_call をオーバーライドしないミュータブルな型は、Py_TPFLAGS_HAVE_VECTORCALL フラグを継承するようになりました。 (Petr Viktorin が gh-93274 で貢献しました。)

    Py_TPFLAGS_MANAGED_DICT フラグと Py_TPFLAGS_MANAGED_WEAKREF フラグを追加しました。 これにより、拡張クラスでの管理処理とメモリ使用量を減らし、アクセスを高速化しつつ、オブジェクトの __dict__ と弱参照をサポートできます。

  • vectorcall プロトコル で呼び出しを行う API を Limited API に追加しました。

    これにより、vectorcall プロトコルの呼び出しを受ける側と呼び出す側の両方が Limited API で利用できるようになりました。 (Wenzel Jakob が gh-98586 で貢献しました。)

  • 呼び出し元だけでなく、実行中のすべてのスレッドにプロファイル関数やトレース関数を設定する 2 つの新しい公開関数、PyEval_SetProfileAllThreads() と PyEval_SetTraceAllThreads() を追加しました。 (Pablo Galindo が gh-93503 で貢献しました。)

  • 指定した PyFunctionObject の vectorcall フィールドを設定する新しい関数 PyFunction_SetVectorcall() を C API に追加しました。 (Andrew Frost が gh-92257 で貢献しました。)

  • C API の PyDict_AddWatcher()、PyDict_Watch()、および関連 API を使って、辞書が変更されるたびに呼び出すコールバックを登録できるようになりました。 最適化を行うインタープリタ、JIT コンパイラー、デバッガーでの使用を想定しています。 (Carl Meyer が gh-91052 で貢献しました。)

  • 型の変更の通知を受け取るコールバックを登録する PyType_AddWatcher() API と PyType_Watch() API を追加しました。 (Carl Meyer が gh-91051 で貢献しました。)

  • コードオブジェクトの作成と破棄の通知を受け取るコールバックを登録するため、PyCode_AddWatcher() API と PyCode_ClearWatcher() API を追加しました。 (Itamar Oren が gh-91054 で貢献しました。)

  • 名前を指定してフレームの変数を取得する PyFrame_GetVar() 関数と PyFrame_GetVarString() 関数を追加しました。 (Victor Stinner が gh-91248 で貢献しました。)

  • 現在の例外を保存・復元する PyErr_GetRaisedException() と PyErr_SetRaisedException() を追加しました。 これらの関数は、非推奨になった PyErr_Fetch() と PyErr_Restore() のような 3 つの引数の代わりに、単一の例外オブジェクトを返したり受け取ったりします。 これにより間違いを起こしにくくなり、効率も少し向上します。 (Mark Shannon が gh-101578 で貢献しました。)

  • 例外インスタンスを受け取る _PyErr_ChainExceptions1 を追加しました。 これは、非推奨になった従来の API _PyErr_ChainExceptions を置き換えるものです。 (Mark Shannon が gh-101578 で貢献しました。)

  • 例外のコンストラクターに渡された args を取得・変更する便利な関数として、PyException_GetArgs() と PyException_SetArgs() を追加しました。 (Mark Shannon が gh-101578 で貢献しました。)

  • 従来の API PyErr_Display() を置き換える、例外インスタンスを受け取る PyErr_DisplayException() を追加しました。 (Irit Katriel が gh-102755 で貢献しました)。

  • PEP 683: オブジェクトの参照カウント操作を省略できる 不死オブジェクト を導入し、関連する C API の変更を行いました。

    • _Py_IMMORTAL_REFCNT: The reference count that defines an object as immortal.

    • _Py_IsImmortal: オブジェクトが不死の参照カウントを持つかどうかを調べます。

    • PyObject_HEAD_INIT This will now initialize reference count to _Py_IMMORTAL_REFCNT when used with Py_BUILD_CORE.

    • SSTATE_INTERNED_IMMORTAL An identifier for interned unicode objects that are immortal.

    • SSTATE_INTERNED_IMMORTAL_STATIC An identifier for interned unicode objects that are immortal and static

    • sys.getunicodeinternedsize This returns the total number of unicode objects that have been interned. This is now needed for refleak.py to correctly track reference counts and allocated blocks

    (Eddie Elizondo が gh-84436 で貢献しました。)

  • PEP 684: 新しい関数 Py_NewInterpreterFromConfig() と PyInterpreterConfig を追加しました。 独自の GIL を持つサブインタープリタを作成できます。 (詳しくは PEP 684: インタープリタごとの GIL を参照してください。) (Eric Snow が gh-104110 で貢献しました。)

  • Limited C API バージョン 3.12 では、Py_INCREF() 関数と Py_DECREF() 関数を、実装の詳細を隠す不透明な関数呼び出しとして実装するようになりました。 (Victor Stinner が gh-105387 で貢献しました。)

Python 3.12 への移植

  • Py_UNICODE* 表現に基づく従来の Unicode API を削除しました。 UTF-8 または wchar_t* に基づく API に移行してください。

  • PyArg_ParseTuple() などの引数解析関数は、Py_UNICODE* に基づく書式 (u、Z など) をサポートしなくなりました。 s、z、es、U など、他の Unicode 用の書式に移行してください。

  • すべての静的な組み込み型の tp_weaklist は、常に NULL になりました。 これは PyTypeObject の内部専用フィールドですが、直接アクセスしているコードがある場合に備えて、この変更を記載しています。 問題を避けるには、代わりに既存の公開 C API を使うことを検討してください。 必要であれば、内部専用の _PyObject_GET_WEAKREFS_LISTPTR() マクロも使えます。

  • 内部専用の PyTypeObject.tp_subclasses は、有効なオブジェクトポインターとは限らなくなりました。 これを反映するため、型を void* に変更しました。 この内部専用フィールドに直接アクセスしているコードがある場合に備えて記載しています。

    サブクラスのリストを取得するには、例えば PyObject_CallMethod() を使って、Python の __subclasses__() メソッドを呼び出してください。

  • PyUnicode_FromFormat() と PyUnicode_FromFormatV() に、より多くの書式化オプション (左揃え、8 進数、大文字の 16 進数、intmax_t、ptrdiff_t、wchar_t の C 文字列、可変の幅と精度) を追加しました。 (Serhiy Storchaka が gh-98836 で貢献しました。)

  • PyUnicode_FromFormat() と PyUnicode_FromFormatV() で認識できない書式文字があると、SystemError を設定するようになりました。 以前のバージョンでは、書式文字列の残りすべてをそのまま結果の文字列にコピーし、余分な引数をすべて無視していました。 (Serhiy Storchaka が gh-95781 で貢献しました。)

  • PyUnicode_FromFormat() と PyUnicode_FromFormatV() の符号の位置が誤っていた問題を修正しました。 (Philip Georgi が gh-95504 で貢献しました。)

  • __dict__ や弱参照のスロットを追加する拡張クラスでは、それぞれ tp_dictoffset と tp_weaklistoffset の代わりに Py_TPFLAGS_MANAGED_DICT と Py_TPFLAGS_MANAGED_WEAKREF を使ってください。 tp_dictoffset と tp_weaklistoffset は引き続きサポートされますが、多重継承を完全にはサポートせず (gh-95589)、性能が劣る可能性もあります。 Py_TPFLAGS_MANAGED_DICT を宣言するクラスは、インスタンスの辞書を走査・クリアするために _PyObject_VisitManagedDict() と _PyObject_ClearManagedDict() を呼び出す必要があります。 弱参照をクリアするには、従来どおり PyObject_ClearWeakRefs() を呼び出してください。

  • The PyUnicode_FSDecoder() function no longer accepts bytes-like paths, like bytearray and memoryview types: only the exact bytes type is accepted for bytes strings. (Contributed by Victor Stinner in gh-98393.)

  • Py_CLEAR、Py_SETREF、Py_XSETREF マクロは、引数を 1 回だけ評価するようになりました。 引数に副作用があっても、それが重複して起こることはなくなりました。 (Victor Stinner が gh-98724 で貢献しました。)

  • インタープリタのエラーインジケーターは、常に正規化された状態になりました。 PyErr_SetObject()、PyErr_SetString()、およびエラーインジケーターを設定する他の関数は、例外を保存する前に正規化するようになりました。 (Mark Shannon が gh-101578 で貢献しました。)

  • _Py_RefTotal は正確な総数を示すものではなくなり、ABI 互換性のためだけに残されています。 これは内部のグローバル変数で、デバッグビルドでしか利用できません。 使っている場合は、_Py_GetGlobalRefTotal() に切り替える必要があります。

  • 以下の関数が、新しく作成する型に適したメタクラスを選択するようになりました。

    メタクラスが tp_new をオーバーライドするクラスの作成は非推奨となり、Python 3.14 以降では認められなくなります。 これらの関数はメタクラスの tp_new を無視するため、初期化が不完全になる可能性があることに注意してください。

    PyType_FromMetaclass() (Python 3.12 で追加) は、メタクラスが tp_new (Python の __new__()) をオーバーライドするクラスの作成を、既に禁止しています。

    tp_new は PyType_From* 関数が行う処理のほぼすべてをオーバーライドするため、両者には互換性がありません。 クラス作成のいくつかの手順でメタクラスを無視する従来の動作は、一般に安全ではありません。 クラスやメタクラスは、tp_new が呼び出されたことを前提とするためです。 単純で汎用的な回避策はありませんが、以下のいずれかが役立つ場合があります。

    • メタクラスを変更できる場合は、そこで tp_new を使わないようにしてください。

      • 初期化を省略しても構わない場合は、代わりに tp_init で行えます。

      • メタクラスを Python からインスタンス化する必要がない場合は、Py_TPFLAGS_DISALLOW_INSTANTIATION フラグを使って、その tp_new を NULL に設定してください。 これにより PyType_From* 関数で使用可能になります。

    • PyType_From* 関数を使わない方法もあります。 C 固有の機能 (スロットやインスタンスサイズの設定) が不要なら、メタクラスを 呼び出して 型を作成してください。

    • tp_new を安全に省略できると 分かっている 場合は、Python から warnings.catch_warnings() を使って非推奨の警告を抑制してください。

  • PyOS_InputHook と PyOS_ReadlineFunctionPointer が サブインタープリタ で呼ばれなくなりました。 これらのコールバックは拡張モジュールの状態を取得する方法がなく、その利用側は一般にプロセス全体のグローバルな状態に依存しているためです。

    これにより、拡張が対応していないサブインタープリタや、まだ読み込まれていないサブインタープリタで動作してしまう状況も避けられます。 詳しくは gh-104668 を参照してください。

  • 性能向上のため、PyLongObject の内部構造を変更しました。 PyLongObject の内部は非公開ですが、一部の拡張モジュールで使われています。 内部フィールドに直接アクセスせず、代わりに PyLong_... で始まる API 関数を使ってください。 単一のマシンワードに収まる PyLongObject の値に効率よくアクセスするため、2 つの新しい 不安定な API 関数を提供します。

  • PyMem_SetAllocator() で設定するカスタムアロケーターは、メモリドメインにかかわらずスレッドセーフであることが必要になりました。 「フック」を含め、独自の状態を持たないアロケーターは影響を受けません。 カスタムアロケーターがまだスレッドセーフでなく、助言が必要な場合は、新しい GitHub issue を作成して @ericsnowcurrently に知らせてください。

非推奨

Python 3.14 で削除予定

Python 3.15 で削除予定

Python 3.16 で削除予定

  • 同梱されている libmpdec。

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

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

削除

  • token.h ヘッダーファイルを削除しました。 公開されたトークナイザーの C API は、これまで一度もありませんでした。 token.h ヘッダーファイルは Python 内部での使用だけを想定して設計されていました。 (Victor Stinner が gh-92651 で貢献しました。)

  • 従来の Unicode API を削除しました。 詳しくは PEP 623 を参照してください。

    • PyUnicode_WCHAR_KIND

    • PyUnicode_AS_UNICODE()

    • PyUnicode_AsUnicode()

    • PyUnicode_AsUnicodeAndSize()

    • PyUnicode_AS_DATA()

    • PyUnicode_FromUnicode()

    • PyUnicode_GET_SIZE()

    • PyUnicode_GetSize()

    • PyUnicode_GET_DATA_SIZE()

  • 関数マクロ PyUnicode_InternImmortal() を削除しました。 (Victor Stinner が gh-85858 で貢献しました。)