What's New In Python 3.11
*************************

編集者:
   Pablo Galindo Salgado

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


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

* Python 3.11 は Python 3.10 とくらべて 10-60% 高速です。平均的には、
  標準ベンチマークスイートでは 1.25倍の高速化を計測しました。詳細につ
  いては Faster CPython を見てください。

新たな文法機能:

* PEP 654: 例外グループと except*

新たな組み込み機能:

* PEP 678: ノートによって例外を充実させる

新しい標準ライブラリのモジュール：

* **PEP 680**: "tomllib" — TOML のパースを標準ライブラリでサポート

インタープリタの改善:

* PEP 657: トレースバックのエラー位置の詳細化

* 新しい "-P" コマンドライン引数と "PYTHONSAFEPATH" 環境変数により、
  安全でない可能性のあるパス を "sys.path" に自動的に先頭に付加しない
  ようにします。

新しい型ヒントの機能:

* PEP 646: 可変長ジェネリック

* PEP 655: TypedDict の各項目を必須または省略可能と指定

* PEP 673: Self 型

* PEP 675: 任意のリテラル文字列の型

* PEP 681: データクラス変換

重要な非推奨化、削除と制限：

* **PEP 594**: たくさんのレガシーの標準ライブラリのモジュールが非推奨
  になり Python 3.13 で削除されます

* **PEP 624**: Py_UNICODE エンコーダー API は削除されました

* **PEP 670**: 静的インライン関数に変換されたマクロ


新しい機能
==========


PEP 657: トレースバックのエラー位置の詳細化
-------------------------------------------

トレースバックの出力時に、インタープリタはエラーを送出した行だけでなく
正確な式を指し示すようになりました。たとえば:

   Traceback (most recent call last):
     File "distance.py", line 11, in <module>
       print(manhattan_distance(p1, p2))
             ^^^^^^^^^^^^^^^^^^^^^^^^^^
     File "distance.py", line 6, in manhattan_distance
       return abs(point_1.x - point_2.x) + abs(point_1.y - point_2.y)
                              ^^^^^^^^^
   AttributeError: 'NoneType' object has no attribute 'x'

以前のバージョンのインタープリタはその行だけを指していたため、どのオブ
ジェクトが "None" であるかが曖昧でした。これらの強化されたエラーは、深
くネストされた "dict" オブジェクトや複数の関数呼び出しを処理するときに
も役立ちます:

   Traceback (most recent call last):
     File "query.py", line 37, in <module>
       magic_arithmetic('foo')
     File "query.py", line 18, in magic_arithmetic
       return add_counts(x) / 25
              ^^^^^^^^^^^^^
     File "query.py", line 24, in add_counts
       return 25 + query_user(user1) + query_user(user2)
                   ^^^^^^^^^^^^^^^^^
     File "query.py", line 32, in query_user
       return 1 + query_count(db, response['a']['b']['c']['user'], retry=True)
                                  ~~~~~~~~~~~~~~~~~~^^^^^
   TypeError: 'NoneType' object is not subscriptable

複雑な算術式でも役立ちます。

   Traceback (most recent call last):
     File "calculation.py", line 54, in <module>
       result = (x / y / z) * (a / b / c)
                 ~~~~~~^~~
   ZeroDivisionError: division by zero

さらに、強化されたトレースバック機能で使用される情報は、一般的な API
を介して利用可能になり、 *bytecode* 命令 とソースコードの場所を関連付
けるために使用できます。この情報は次を使用して取得できます:

* Python の "codeobject.co_positions()" メソッド。

* C API の "PyCode_Addr2Location()" 関数。

詳細は **PEP 657** を参照してください。(Pablo Galindo, Batuhan
Taskaya, Ammar Askar の貢献による bpo-43950)

注釈:

  この機能は コードオブジェクト に桁位置を保存するため、インタープリタ
  のメモリ使用量と、コンパイル済み Python ファイルのディスク使用量が少
  し増える可能性があります。 追加情報を保存せず、トレースバックにも表
  示しないようにするには、コマンドラインオプション "-X
  no_debug_ranges" または環境変数 "PYTHONNODEBUGRANGES" を使ってくださ
  い。


PEP 654: 例外グループと "except*"
---------------------------------

**PEP 654** では、プログラムが無関係な複数の例外を同時に送出させて処理
できるようにする言語機能が導入されています。組み込み型
"ExceptionGroup" と "BaseExceptionGroup" を使用すると、例外をグループ
化して一緒に送出することができます。また、新しい "except*" 構文は、
"except" を例外グループのサブグループにマッチするように一般化したもの
です。

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

(Irit Katriel の貢献による bpo-45292。PEP はIrit Katriel, Yury
Selivanov, Guido van Rossum によって作成されました。)


PEP 678: ノートによって例外を充実させる
---------------------------------------

"BaseException" に "add_note()" メソッドが追加されました。これは例外が
送出された時点では利用できないコンテキスト情報を例外に付与するために使
用できます。追加された注釈はデフォルトのトレースバックに表示されます。

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

(Irit Katriel の貢献による bpo-45607。PEP は Zac Hatfield-Dodds によっ
て作成されました。)


Windows "py.exe" ランチャーの改善
---------------------------------

Python 3.11 に含まれる Python インストールマネージャ のコピーが大幅に
更新されました。 **PEP 514** で定義されているように、制限付きの
"-*<major>*.*<minor>*" の代わりに "-V:*<company>*/*<tag>*" 引数を使用
した company/tag 構文をサポートするようになりました。これにより、
python.org でホストされている "PythonCore" 以外のディストリビューショ
ンを起動できるようになります。

"-V:" 形式で選択する場合、company と tag のどちらかを省略できますが、
インストール済みのすべての Python が検索対象になります。 例えば
"-V:OtherPython/" は、"OtherPython" に登録された「最適な」タグを選び、
"-V:3.11" または "-V:/3.11" は、タグ "3.11" を持つ「最適な」ディストリ
ビューションを選びます。

従来の "-*<major>*"、"-*<major>*.*<minor>*"、"-*<major>*-*<bitness>*"
、"-*<major>*.*<minor>*-*<bitness>*" 引数を使う場合は、以前のバージョ
ンの動作が維持され、"PythonCore" のリリースだけが選ばれます。 ただし、
サポートする 64 ビットプラットフォームが複数あるため、接尾辞 "-64" は
「32 ビットではない」という意味になりました (必ずしも x86-64 ではあり
ません)。 32 ビットのランタイムは、タグの接尾辞 "-32" で判別されます。
Python 3.5 以降のすべてのリリースでは、32 ビットビルドにこの接尾辞が含
まれています。


型ヒントに関連する新しい機能
============================

この節では、**PEP 484** の型ヒントと "typing" モジュールに関する主な変
更を説明します。


PEP 646: 可変長ジェネリック
---------------------------

従来の **PEP 484** では "TypeVar" が導入され、単一の型をパラメーターと
するジェネリックを作れるようになりました。 **PEP 646** では
"TypeVarTuple" が追加され、*任意の個数* の型をパラメーターにできます。
つまり、"TypeVarTuple" は *可変長* の型変数であり、*可変長* ジェネリッ
クを可能にします。

これにより、様々な用途に対応できます。 特に、NumPy や TensorFlow など
の数値計算ライブラリの配列に似た構造の型を、配列の *形状* でパラメータ
ー化できます。 静的型チェッカーが、これらのライブラリを使うコードの形
状に関する不具合を検出できるようになります。

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

(Matthew Rahtz による bpo-43224 での貢献。 Serhiy Storchaka と Jelle
Zijlstra も貢献。 PEP は Mark Mendoza、Matthew Rahtz、Pradeep Kumar
Srinivasan、Vincent Siles が執筆。)


PEP 655: "TypedDict" の各項目を必須または省略可能と指定
-------------------------------------------------------

"Required" と "NotRequired" により、"TypedDict" の個々の項目が必須かど
うかを簡単に指定できるようになりました。 以前は、継承を使わないと指定
できませんでした。

デフォルトでは、引き続きすべてのフィールドが必須です。 ただし、*total*
引数を "False" に設定した場合は、引き続きすべてのフィールドがデフォル
トで省略可能になります。 例えば、次のコードは、必須のキーと省略可能な
キーを 1 個ずつ持つ "TypedDict" を指定します。

   class Movie(TypedDict):
      title: str
      year: NotRequired[int]

   m1: Movie = {"title": "Black Panther", "year": 2018}  # OK
   m2: Movie = {"title": "Star Wars"}  # OK (year は省略可能)
   m3: Movie = {"year": 2022}  # エラー (必須フィールド title がない)

次の定義も同等です。

   class Movie(TypedDict, total=False):
      title: Required[str]
      year: int

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

(David Foster と Jelle Zijlstra による bpo-47087 での貢献。 PEP は
David Foster が執筆。)


PEP 673: "Self" 型
------------------

新しいアノテーション "Self" は、自身のクラスのインスタンスを返すメソッ
ドに、簡潔で直感的に型を注釈する方法です。 **PEP 484 で規定された**
"TypeVar" を使う方法と同じ動作ですが、より簡潔で理解しやすくなっていま
す。

よくある用途として、"classmethod" で提供する別のコンストラクターや、
"self" を返す "__enter__()" メソッドがあります。

   class MyLock:
       def __enter__(self) -> Self:
           self.lock()
           return self

       ...

   class MyInt:
       @classmethod
       def fromhex(cls, s: str) -> Self:
           return cls(int(s, 16))

       ...

"Self" は、メソッドの引数や属性が、それを含むクラスと同じ型であること
を注釈するためにも使えます。

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

(James Hilton-Balfe による bpo-46534 での貢献。 PEP は Pradeep Kumar
Srinivasan と James Hilton-Balfe が執筆。)


PEP 675: 任意のリテラル文字列の型
---------------------------------

新しいアノテーション "LiteralString" を使うと、関数の引数が任意のリテ
ラル文字列型でよいことを示せます。 これにより、任意のリテラル文字列や
、ほかのリテラル文字列から作られた文字列を関数が受け取れます。 型チェ
ッカーは、SQL 文やシェルコマンドを実行する関数など、注意を要する関数が
静的な引数だけで呼び出されることを検査し、インジェクション攻撃を防げま
す。

例えば、SQL クエリを実行する関数には、次のように注釈できます。

   def run_query(sql: LiteralString) -> ...:
       ...

   def caller(
       arbitrary_string: str,
       query_string: LiteralString,
       table_name: LiteralString,
   ) -> None:
       run_query("SELECT * FROM students")       # ok
       run_query(query_string)                   # ok
       run_query("SELECT * FROM " + table_name)  # ok
       run_query(arbitrary_string)               # type checker error
       run_query(                                # type checker error
           f"SELECT * FROM students WHERE name = {arbitrary_string}"
       )

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

(Jelle Zijlstra による bpo-47088 での貢献。 PEP は Pradeep Kumar
Srinivasan と Graham Bleaney が執筆。)


PEP 681: データクラス変換
-------------------------

"@~typing.dataclass_transform" は、クラス、メタクラス、またはデコレー
ターとして働く関数をデコレートするために使えます。
"@dataclass_transform()" があると、デコレートされたオブジェクトが実行
時にクラスを変換する「仕掛け」を実行し、"dataclass" のような動作を与え
ることを、静的型チェッカーに伝えます。

例えば:

   # create_model デコレーターはライブラリで定義される。
   @typing.dataclass_transform()
   def create_model(cls: Type[T]) -> Type[T]:
       cls.__init__ = ...
       cls.__eq__ = ...
       cls.__ne__ = ...
       return cls

   # create_model デコレーターを使って新しいモデルクラスを作成できる。
   @create_model
   class CustomerModel:
       id: int
       name: str

   c = CustomerModel(id=327, name="Eric Idle")

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

(Jelle Zijlstra による gh-91860 での貢献。 PEP は Erik De Bonte と
Eric Traut が執筆。)


PEP 563 は将来の標準にならないかもしれない
------------------------------------------

**PEP 563** Postponed Evaluation of Annotations (the "from __future__
import annotations" future statement) that was originally planned for
release in Python 3.10 has been put on hold indefinitely. See this
message from the Steering Council for more information.


その他の言語変更
================

* "for" 文で、アスタリスク付きのアンパック式を使えるようになりました。
  (詳しくは bpo-46725 を参照してください。)

* 非同期関数 内の内包表記で、非同期の 内包表記 を使えるようになりまし
  た。 この場合、外側の内包表記も暗黙的に非同期になります。 (Serhiy
  Storchaka による bpo-33346 での貢献。)

* *context manager* プロトコルをサポートしないオブジェクトを "with" 文
  や "contextlib.ExitStack.enter_context()" で使った場合、
  "AttributeError" の代わりに "TypeError" を送出するようになりました。
  *asynchronous context manager* プロトコルをサポートしないオブジェク
  トを "async with" 文や
  "contextlib.AsyncExitStack.enter_async_context()" で使った場合も同様
  です。 (Serhiy Storchaka による bpo-12022 and bpo-44471 での貢献。)

* "__getstate__()" メソッドのデフォルト実装を提供する
  "object.__getstate__()" が追加されました。 組み込み型 "bytearray"、
  "set"、"frozenset"、"collections.OrderedDict"、"collections.deque"、
  "weakref.WeakSet"、"datetime.tzinfo" のサブクラスのインスタンスを
  "copy" や "pickle" で処理すると、*スロット* として実装されたインスタ
  ンス属性もコピーや pickle 化の対象になりました。 この変更には、意図
  しない副作用があります。 "object.__getstate__()" が存在しないことを
  前提とする少数の既存の Python プロジェクトで、問題を引き起こします。
  そのようなコードで必要になる回避策については、gh-70766 の後半のコメ
  ントを参照してください。 (Serhiy Storchaka による bpo-26579 での貢献
  。)

* Added a "-P" command line option and a "PYTHONSAFEPATH" environment
  variable, which disable the automatic prepending to "sys.path" of
  the script's directory when running a script, or the current
  directory when using "-c" and "-m". This ensures only stdlib and
  installed modules are picked up by "import", and avoids
  unintentionally or maliciously shadowing modules with those in a
  local (and typically user-writable) directory. (Contributed by
  Victor Stinner in gh-57684.)

* 書式指定ミニ言語 に ""z"" オプションが追加されました。 指定した精度
  に丸めた後、負のゼロを正のゼロに変換します。 詳しくは **PEP 682** を
  参照してください。 (John Belmonte による gh-90153 での貢献。)

* "sys.path" に bytes を指定することはサポートされなくなりました。 こ
  の機能は Python 3.2 から 3.6 の間に動かなくなっていましたが、Python
  3.10.0 のリリース後まで誰も気付きませんでした。 また、"str" と
  "bytes" のキーが混在する場合の "-b" と "sys.path_importer_cache" の
  相互作用に問題があるため、サポートを復活させることも困難です。
  (Thomas Grainger による gh-91181 での貢献。)


その他の CPython の実装の変更
=============================

* "typing.SupportsComplex" と "typing.SupportsBytes" プロトコルに対応
  するため、"complex" に特殊メソッド "__complex__()"、"bytes" に
  "__bytes__()" が実装されました。 (Mark Dickinson and Donghee Na によ
  る bpo-24234 での貢献。)

* 内部のハッシュアルゴリズムに "siphash13" が追加されました。
  "siphash24" と似た安全性を持ち、長い入力では少し高速です。 "str"、
  "bytes" などの型は、"hash()" のデフォルトのアルゴリズムとしてこれを
  使うようになりました。 **PEP 552** の ハッシュベースの .pyc ファイル
  も "siphash13" を使うようになりました。 (Inada Naoki による
  bpo-29410 での貢献。)

* 引数のない "raise" 文で処理中の例外を再送出すると、その例外に付随す
  るトレースバックは常に "sys.exc_info()[1].__traceback__" になりまし
  た。 つまり、現在の "except" 節でトレースバックを変更すると、再送出
  された例外にその変更が反映されます。 (Irit Katriel による bpo-45711
  での貢献。)

* インタープリタ状態内で、処理中の例外を表す構造 ("exc_info" または
  "_PyErr_StackItem") は、"exc_value" フィールドだけを持つようになりま
  した。 "exc_type" と "exc_traceback" は "exc_value" から求められるた
  め、削除されました。 (Irit Katriel による bpo-45711 での貢献。)

* Windows インストーラーに、新しい コマンドラインオプション
  "AppendPath" が追加されました。 "PrependPath" と似ていますが、インス
  トールディレクトリとスクリプトディレクトリを先頭ではなく末尾に追加し
  ます。 (Bastian Neuburger による bpo-44934 での貢献。)

* 初期化時に "PyConfig.module_search_paths" を使って "sys.path" を初期
  化するには、"PyConfig.module_search_paths_set" フィールドを "1" に設
  定する必要があります。 そうしないと、初期化処理はパスを再計算し、
  "module_search_paths" に追加した値を置き換えます。

* "--help" オプションの出力が、50 行、80 桁に収まるようになりました。
  Python の環境変数 と "-X" オプションの情報は、それぞれ "--help-env"
  と "--help-xoptions"、および新しい "--help-all" フラグで取得できます
  。 (Éric Araujo による bpo-46142 での貢献。)

* 2 (2 進数)、4、8 (8 進数)、16 (16 進数)、32 以外の基数、例えば 10
  (10 進数) で "int" と "str" を相互変換する際、文字列表記の桁数が上限
  を超えると "ValueError" を送出するようになりました。 アルゴリズムの
  計算量を悪用したサービス拒否攻撃を防ぐためで、**CVE 2020-10735** の
  緩和策です。 この上限は、環境変数、コマンドラインフラグ、"sys" の
  API で設定または無効化できます。 整数の文字列変換の長さ制限 のドキュ
  メントを参照してください。 デフォルトの上限は文字列表記で 4300 桁で
  す。


新たなモジュール
================

* "tomllib": TOML を解析するためのモジュールです。 詳しくは **PEP
  680** を参照してください。 (Taneli Hukkinen による bpo-40059 での貢
  献。)

* "wsgiref.types": 静的型チェック用の **WSGI** 固有の型です。
  (Sebastian Rittau による bpo-42012 での貢献。)


改良されたモジュール
====================


asyncio
-------

* "TaskGroup" クラスが追加されました。 タスクのグループを保持し、終了
  時にすべてのタスクを待つ 非同期コンテキストマネージャー です。 新し
  いコードでは、"create_task()" や "gather()" を直接使うよりも、こちら
  を推奨します。 (Yury Selivanov and others による gh-90908 での貢献。
  )

* 非同期処理にタイムアウトを設定する非同期コンテキストマネージャー
  "timeout()" が追加されました。 新しいコードでは、"wait_for()" を直接
  使うよりも、こちらを推奨します。 (Andrew Svetlov による gh-90927 で
  の貢献。)

* "run()" で使う仕組みを公開する "Runner" クラスが追加されました。
  (Andrew Svetlov による gh-91218 での貢献。)

* asyncio ライブラリの同期プリミティブに "Barrier" クラスと、関連する
  例外 "BrokenBarrierError" が追加されました。 (Yves Duprat and Andrew
  Svetlov による gh-87518 での貢献。)

* "asyncio.loop.create_connection()" にキーワード引数 *all_errors* が
  追加され、複数の接続エラーを "ExceptionGroup" として送出できるように
  なりました。

* 既存のストリームベースの接続を TLS にアップグレードする
  "asyncio.StreamWriter.start_tls()" メソッドが追加されました。 (Ian
  Good による bpo-34975 での貢献。)

* 生のデータグラムソケットを扱う関数 "sock_sendto()"、
  "sock_recvfrom()"、"sock_recvfrom_into()" がイベントループに追加され
  ました。 "SelectorEventLoop" と "ProactorEventLoop" に実装されていま
  す。 (Alex Grönholm による bpo-46805 での貢献。)

* "Task" に "cancelling()" メソッドと "uncancel()" メソッドが追加され
  ました。 主に内部での使用、特に "TaskGroup" での使用を意図しています
  。


contextlib
----------

* カレントワーキングディレクトリを変更し、終了時に元に戻すコンテキスト
  マネージャー "chdir()" が追加されました。 並列実行時に安全に使えるも
  のではありません。 "chdir()" の単純なラッパーです。 (Filipe Laíns に
  よる bpo-25625 での貢献。)


dataclasses
-----------

* フィールドのデフォルト値のミュータビリティーの検査が変更されました。
  従来は "dict"、"list"、"set" のインスタンスでなければ許されていまし
  たが、*hashable* なデフォルト値だけを許すようになりました。 (Eric V.
  Smith による bpo-44674 での貢献。)


datetime
--------

* "datetime.timezone.utc" の便利な別名として "datetime.UTC" が追加され
  ました。 (Kabir Kwatra による gh-91973 での貢献。)

* "datetime.date.fromisoformat()", "datetime.time.fromisoformat()" and
  "datetime.datetime.fromisoformat()" can now be used to parse most
  ISO 8601 formats (barring only those that support fractional hours
  and minutes). (Contributed by Paul Ganssle in gh-80010.)


enum
----

* "EnumMeta" の名前が "EnumType" に変わりました ("EnumMeta" は別名とし
  て残されています)。

* メンバーを文字列として使える (かつ文字列でなければならない)
  "StrEnum" が追加されました。

* "ReprEnum" が追加されました。 メンバーの "__repr__()" だけを変更し、
  "__str__()" と "__format__()" ("str()"、"format()"、*f-string* で使
  用) には、名前ではなく元の値の表現を返します。

* "Enum.__format__()" ("format()"、"str.format()"、*f-string* のデフォ
  ルト) は、常に "Enum.__str__()" と同じ結果を返すようになりました。
  "ReprEnum" を継承する列挙型ではメンバーの値、それ以外では列挙型とメ
  ンバーの名前 (例えば "Color.RED") になります。

* 範囲外のフラグ値の扱いを制御するため、"Flag" 列挙型にクラス引数
  *boundary* が追加され、その選択肢を持つ "FlagBoundary" 列挙型も追加
  されました。

* 列挙型クラスが特定の制約を満たすか検査するため、"verify()" 列挙型デ
  コレーターと、その選択肢を持つ "EnumCheck" 列挙型が追加されました。

* デコレートしたオブジェクトを列挙型のメンバーにするかどうかを明示する
  "member()" デコレーターと "nonmember()" デコレーターが追加されました
  。

* 列挙型向けに "@property" のように動作する "@~enum.property" デコレー
  ターが追加されました。 "types.DynamicClassAttribute()" の代わりに使
  ってください。

* "global_enum()" 列挙型デコレーターが追加されました。 "__repr__()" と
  "__str__()" を調整し、値を列挙型クラスではなくモジュールのメンバーと
  して表示します。 例えば、"re.RegexFlag" の "ASCII" メンバーは
  "'RegexFlag.ASCII'" ではなく "'re.ASCII'" になります。

* Enhanced "Flag" to support "len()", iteration and "in"/"not in" on
  its members. For example, the following now works: "len(AFlag(3)) ==
  2 and list(AFlag(3)) == (AFlag.ONE, AFlag.TWO)"

* "Enum" と "Flag" で、"__init_subclass__()" の呼び出し前にメンバーが
  定義されるようになりました。 "dir()" の結果には、ミックスインしたデ
  ータ型のメソッドなども含まれるようになりました。

* "Flag" は、基本の値 (2 の累乗) だけを正規のメンバーとし、合成された
  値 ("3"、"6"、"10" など) は別名として扱うようになりました。 反転した
  フラグは、同等の正の値に変換されます。


fcntl
-----

* FreeBSD で "F_DUP2FD" と "F_DUP2FD_CLOEXEC" フラグがサポートされまし
  た。 前者は "dup2" と同等で、後者はさらに "FD_CLOEXEC" フラグを設定
  します。


fractions
---------

* 文字列からの "Fraction" の初期化で、**PEP 515** の形式がサポートされ
  ました。 (Sergey B Kirpichev による bpo-44258 での貢献。)

* "Fraction" に "__int__" メソッドが実装され、
  "isinstance(some_fraction, typing.SupportsInt)" による検査が真になる
  ようになりました。 (Mark Dickinson による bpo-44547 での貢献。)


functools
---------

* "@functools.singledispatch" が、ディスパッチに使う引数のアノテーショ
  ンとして "types.UnionType" と "typing.Union" をサポートするようにな
  りました。

     >>> from functools import singledispatch
     >>> @singledispatch
     ... def fun(arg, verbose=False):
     ...     if verbose:
     ...         print("Let me just say,", end=" ")
     ...     print(arg)
     ...
     >>> @fun.register
     ... def _(arg: int | float, verbose=False):
     ...     if verbose:
     ...         print("Strength in numbers, eh?", end=" ")
     ...     print(arg)
     ...
     >>> from typing import Union
     >>> @fun.register
     ... def _(arg: Union[list, set], verbose=False):
     ...     if verbose:
     ...         print("Enumerate this:")
     ...     for i, elem in enumerate(arg):
     ...         print(i, elem)
     ...

  (Yurii Karabas による bpo-46014 での貢献。)


gzip
----

* "gzip.compress()" は **mtime=0** を指定した場合、圧縮全体を
  "zlib.compress()" の 1 回の処理に委ねることで高速になりました。 この
  変更には副作用が 1 つあります。 gzip ファイルのヘッダーには "OS" バ
  イトがあり、従来 "gzip" は常に「不明」を表す 255 を設定していました
  。 今後は **mtime=0** を指定して "compress()" を使うと、Python がリ
  ンクされた基盤の zlib C ライブラリによって、別の値が設定されることが
  あります。 (この副作用の詳細は gh-112346 を参照してください。)


hashlib
-------

* "hashlib.blake2b()" と "hashlib.blake2s()" は、Python に同梱された実
  装よりも libb2 を優先するようになりました。 (Christian Heimes による
  bpo-47095 での貢献。)

* SHA3 と SHAKE のアルゴリズムを実装する内部モジュール "_sha3" は、コ
  ードとバイナリのサイズを削減するため、*Keccak Code Package* の代わり
  に *tiny_sha3* を使うようになりました。 "hashlib" モジュールは、
  OpenSSL の最適化された SHA3 と SHAKE の実装を優先します。 この変更の
  影響を受けるのは、OpenSSL をサポートしないインストールだけです。
  (Christian Heimes による bpo-47098 での貢献。)

* ファイルやファイルライクオブジェクトのハッシュを効率よく計算する補助
  関数 "hashlib.file_digest()" が追加されました。 (Christian Heimes に
  よる gh-89313 での貢献。)


IDLE と idlelib
---------------

* ".pyi" ファイルに構文強調表示を適用するようになりました。 (Alex
  Waygood and Terry Jan Reedy による bpo-45447 での貢献。)

* 入力と出力を含む Shell の内容を保存する際、プロンプトも含めるように
  なりました。 (Terry Jan Reedy による gh-95191 での貢献。)


inspect
-------

* デスクリプタープロトコルによる動的な属性検索を発生させずに、すべての
  メンバーを返す "getmembers_static()" が追加されました。 (Weipeng
  Hong による bpo-30533 での貢献。)

* オブジェクトの型が "MethodWrapperType" かどうかを調べる
  "ismethodwrapper()" が追加されました。 (Hakan Çelik による bpo-29418
  での貢献。)

* "inspect" モジュールのフレーム関連の関数は、新しい "FrameInfo" と
  "Traceback" のインスタンスを返すようになりました。 これらは従来の
  *named tuple* のようなインターフェースと後方互換性があり、**PEP
  657** で拡張された位置情報 (終了行番号、開始桁、終了桁) を含みます。
  対象の関数は次のとおりです。

  * "inspect.getframeinfo()"

  * "inspect.getouterframes()"

  * "inspect.getinnerframes()",

  * "inspect.stack()"

  * "inspect.trace()"

  (Pablo Galindo による gh-88116 での貢献。)


locale
------

* 現在のロケールのエンコーディングを取得する "locale.getencoding()" が
  追加されました。 "locale.getpreferredencoding(False)" と似ていますが
  、Python UTF-8 モード を無視します。


logging
-------

* ログレベル名 (例えば "'CRITICAL'") から、対応する レベル の値 (デフ
  ォルトでは例えば "50") へのマッピングを返す "getLevelNamesMapping()"
  が追加されました。 (Andrei Kulakovin による gh-88024 での貢献。)

* "SocketHandler.createSocket()" に合わせて、"SysLogHandler" に
  "createSocket()" メソッドが追加されました。 ハンドラーの初期化時と、
  イベントを送出する際に有効なソケットがない場合に、自動的に呼び出され
  ます。 (Kirill Pinchuk による gh-88457 での貢献。)


math
----

* 2 の "x" 乗を返す "math.exp2()" が追加されました。 (Gideon Mitchell
  による bpo-45917 での貢献。)

* "x" の立方根を返す "math.cbrt()" が追加されました。 (Ajith
  Ramachandran による bpo-44357 での貢献。)

* IEEE 754 の仕様と整合させるため、"math.pow()" の特殊な 2 つのケース
  の動作が変わりました。 "math.pow(0.0, -math.inf)" と "math.pow(-0.0,
  -math.inf)" は、"inf" を返すようになりました。 以前は "ValueError"
  を送出していました。 (Mark Dickinson による bpo-44339 での貢献。)

* "math.nan" の値が常に利用できるようになりました。 (Victor Stinner に
  よる bpo-46917 での貢献。)


operator
--------

* "operator.call(obj, *args, **kwargs) == obj(*args, **kwargs)" となる
  、新しい関数 "operator.call" が追加されました。 (Antony Lee による
  bpo-44019 での貢献。)


os
--

* Windows の "os.urandom()" は、非推奨の "CryptGenRandom()" の代わりに
  "BCryptGenRandom()" を使うようになりました。 (Donghee Na による
  bpo-44611 での貢献。)


pathlib
-------

* "glob()" と "rglob()" は、*pattern* がパス要素の区切り文字 ("sep" ま
  たは "altsep") で終わる場合、ディレクトリだけを返すようになりました
  。 (Eisuke Kawasima による bpo-22276 and bpo-33392 での貢献。)


re
--

* 正規表現で、アトミックグループ ("(?>...)") と所有型の数量詞 ("*+"、
  "++"、"?+"、"{m,n}+") がサポートされました。 (Jeffrey C. Jacobs and
  Serhiy Storchaka による bpo-433030 での貢献。)


shutil
------

* "shutil.rmtree()" に省略可能な引数 *dir_fd* が追加されました。
  (Serhiy Storchaka による bpo-46245 での貢献。)


socket
------

* NetBSD で CAN ソケットがサポートされました。 (Thomas Klausner による
  bpo-30512 での貢献。)

* "create_connection()" に、接続失敗時に最後のエラーだけを送出する代わ
  りに、すべてのエラーを含む "ExceptionGroup" を送出するオプションが追
  加されました。 (Irit Katriel による bpo-29980 での貢献。)


sqlite3
-------

* "set_authorizer()" に "None" を渡すことで、認可処理を無効にできるよ
  うになりました。 (Erlend E. Aasland による bpo-44491 での貢献。)

* "create_collation()" の照合順序名に、任意の Unicode 文字を含められる
  ようになりました。 不正な文字を含む照合順序名は、
  "sqlite3.ProgrammingError" の代わりに "UnicodeEncodeError" を送出す
  るようになりました。 (Erlend E. Aasland による bpo-44688 での貢献。)

* "sqlite3" の例外に、SQLite の拡張エラーコードを格納する
  "sqlite_errorcode" と、SQLite のエラー名を格納する
  "sqlite_errorname" が追加されました。 (Aviv Palivoda, Daniel Shahaf,
  and Erlend E. Aasland による bpo-16379 and bpo-24139 での貢献。)

* "sqlite3.Connection" に "setlimit()" と "getlimit()" が追加され、接
  続ごとに SQLite の上限値を設定・取得できるようになりました。 (Erlend
  E. Aasland による bpo-45243 での貢献。)

* "sqlite3" は、基盤の SQLite ライブラリがコンパイルされたときのデフォ
  ルトのスレッドモードに基づいて、"sqlite3.threadsafety" を設定するよ
  うになりました。 (Erlend E. Aasland による bpo-45613 での貢献。)

* "sqlite3" の C コールバックでは、コールバックのトレースバックを有効
  にしている場合、送出できない例外として処理するようになりました。 "送
  出できない例外のフックハンドラー" を登録し、デバッグに役立てられるよ
  うになりました。 (Erlend E. Aasland による bpo-45828 での貢献。)

* ロールバックをまたいで行を取得しても、"InterfaceError" を送出しなく
  なりました。 代わりに、こうしたケースの処理を SQLite ライブラリに委
  ねます。 (Erlend E. Aasland による bpo-44092 での貢献。)

* データベースを直列化・逆直列化するため、"sqlite3.Connection" に
  "serialize()" と "deserialize()" が追加されました。 (Erlend E.
  Aasland による bpo-41930 での貢献。)

* 集約ウィンドウ関数を作成するため、"sqlite3.Connection" に
  "create_window_function()" が追加されました。 (Erlend E. Aasland に
  よる bpo-34916 での貢献。)

* "sqlite3.Connection" に "blobopen()" が追加されました。
  "sqlite3.Blob" により、BLOB を少しずつ読み書きできます。 (Aviv
  Palivoda and Erlend E. Aasland による bpo-24905 での貢献。)


string
------

* "string.Template" に "get_identifiers()" と "is_valid()" が追加され
  ました。 それぞれ、有効なプレースホルダーをすべて返し、不正なプレー
  スホルダーが含まれているかどうかを判定します。 (Ben Kehoe による
  gh-90465 での貢献。)


sys
---

* "sys.exc_info()" は、"value" (例外インスタンス) から "type" と
  "traceback" フィールドを求めるようになりました。 そのため、例外の処
  理中に例外を変更すると、その後の "exc_info()" の結果にも変更が反映さ
  れます。 (Irit Katriel による bpo-45711 での貢献。)

* 処理中の例外インスタンスを返す "sys.exception()" が追加されました
  ("sys.exc_info()[1]" と同等です)。 (Irit Katriel による bpo-46328 で
  の貢献。)

* "sys.flags.safe_path" フラグが追加されました。 (Victor Stinner によ
  る gh-57684 での貢献。)


sysconfig
---------

* 新しい インストールスキーム *posix_venv*、*nt_venv*、*venv* が追加さ
  れました。 Python が新しい仮想環境を作成するときや、仮想環境内で実行
  されているときに使われます。 最初の 2 つ (*posix_venv* と *nt_venv*)
  は、それぞれ Windows 以外と Windows 用の OS 固有のスキームです。
  *venv* は実質的に、Python が動作する OS に応じたどちらかの別名です。
  これは "sysconfig.get_preferred_scheme()" を変更する配布者に役立ちま
  す。 新しい仮想環境を作成するサードパーティーのコードは、"venv" と同
  様に、新しい *venv* インストールスキームを使ってパスを決めるべきです
  。 (Miro Hrončok による bpo-45413 での貢献。)


tempfile
--------

* "SpooledTemporaryFile" オブジェクトが、ファイルモードに応じて
  "io.BufferedIOBase" または "io.TextIOBase" のメソッドを完全に実装す
  るようになりました。 これにより、圧縮モジュールなど、ファイルライク
  オブジェクトを想定する API で正しく動作します。 (Carey Metcalfe によ
  る gh-70363 での貢献。)


threading
---------

* Unix では、C ライブラリに "sem_clockwait()" 関数がある場合 (glibc
  2.30 以降)、"threading.Lock.acquire()" はタイムアウトにシステムクロ
  ック ("time.CLOCK_REALTIME") ではなく単調増加クロック
  ("time.CLOCK_MONOTONIC") を使うようになりました。 システムクロックの
  変更の影響を受けないようにするためです。 (Victor Stinner による
  bpo-41710 での貢献。)


time
----

* Unix の "time.sleep()" は、利用可能なら "clock_nanosleep()" または
  "nanosleep()" を使うようになりました。 これらの分解能は 1 ナノ秒
  (10^-9 秒) で、従来使っていた "select()" の 1 マイクロ秒 (10^-6 秒)
  より細かくなっています。 (Benjamin Szőke and Victor Stinner による
  bpo-21302 での貢献。)

* Windows 8.1 以降の "time.sleep()" は、高分解能タイマー に基づく待機
  可能タイマーを使うようになりました。 その分解能は 100 ナノ秒 (10^-7
  秒) です。 以前の分解能は 1 ミリ秒 (10^-3 秒) でした。 (Benjamin
  Szőke, Donghee Na, Eryk Sun and Victor Stinner による bpo-21302 and
  bpo-45429 での貢献。)


tkinter
-------

* Tcl ライブラリの正確なバージョンを、"sys.version_info" に似た名前付
  きタプルで返す "info_patchlevel()" メソッドが追加されました。
  (Serhiy Storchaka による gh-91827 での貢献。)


traceback
---------

* トレースバックに表示するフレームとその書式を上書きできるようにする
  "traceback.StackSummary.format_frame_summary()" が追加されました。
  (Ammar Askar による bpo-44569 での貢献。)

* 書式化した "TracebackException" インスタンスをファイルに出力する
  "traceback.TracebackException.print()" が追加されました。 (Irit
  Katriel による bpo-33809 での貢献。)


typing
------

主な変更については 型ヒントに関連する新しい機能 を参照してください。

* "typing.assert_never()" と "typing.Never" が追加されました。
  "typing.assert_never()" は、あるコード行に到達し得ないことを型チェッ
  カーに確認させるために役立ちます。 実行時には "AssertionError" を送
  出します。 (Jelle Zijlstra による gh-90633 での貢献。)

* "typing.reveal_type()" が追加されました。 指定した式の型をどう推論し
  たか、型チェッカーに尋ねるために役立ちます。 実行時には、受け取った
  値の型を表示します。 (Jelle Zijlstra による gh-90572 での貢献。)

* "typing.assert_type()" が追加されました。 指定した式について推論した
  型が指定した型と一致することを、型チェッカーに確認させるために役立ち
  ます。 実行時には、受け取った値をそのまま返します。 (Jelle Zijlstra
  による gh-90638 での貢献。)

* "typing.TypedDict" 型をジェネリックにできるようになりました。
  (Samodya Abeysiriwardane による gh-89026 での貢献。)

* "NamedTuple" 型をジェネリックにできるようになりました。 (Serhiy
  Storchaka による bpo-43923 での貢献。)

* "typing.Any" をサブクラス化できるようになりました。 モックなど、動的
  に振る舞うクラスに関する型チェッカーのエラーを避けるために役立ちます
  。 (Shantanu Jain による gh-91154 での貢献。)

* "@typing.final" デコレーターは、デコレートしたオブジェクトに
  "__final__" 属性を設定するようになりました。 (Jelle Zijlstra による
  gh-90500 での貢献。)

* The "typing.get_overloads()" function can be used for introspecting
  the overloads of a function. "typing.clear_overloads()" can be used
  to clear all registered overloads of a function. (Contributed by
  Jelle Zijlstra in gh-89263.)

* "Protocol" のサブクラスの "__init__()" メソッドが保持されるようにな
  りました。 (Adrian Garcia Badarasco による gh-88970 での貢献。)

* 空のタプル型 ("Tuple[()]") の表現が単純化されました。 イントロスペク
  ションに影響し、例えば "get_args(Tuple[()])" は "((),)" ではなく
  "()" と評価されるようになりました。 (Serhiy Storchaka による
  gh-91137 での貢献。)

* 非公開関数 "typing._type_check" から呼び出し可能かどうかの検査を取り
  除き、型アノテーションの実行時の要件を緩和しました。 (Gregory
  Beauregard による gh-90802 での貢献。)

* "typing.get_type_hints()" が、PEP 585 のジェネリックエイリアス 内の
  文字列を前方参照として評価できるようになりました。 (Niklas
  Rosenstein による gh-85542 での貢献。)

* "typing.get_type_hints()" は、デフォルト値が "None" の引数に
  "Optional" を追加しなくなりました。 (Nikita Sobolev による gh-90353
  での貢献。)

* "typing.get_type_hints()" が、型引数を指定せずに文字列化された
  "ClassVar" アノテーションを評価できるようになりました。 (Gregory
  Beauregard による gh-90711 での貢献。)

* "@typing.no_type_check" は、外部のクラスや関数を変更しなくなりました
  。 クラスメソッドにも、型チェックの対象外であることを正しく設定する
  ようになりました。 (Nikita Sobolev による gh-90729 での貢献。)


unicodedata
-----------

* Unicode データベースがバージョン 14.0.0 に更新されました。 (Benjamin
  Peterson による bpo-45190 での貢献。)


unittest
--------

* "TestCase" に "enterContext()" と "enterClassContext()"、
  "IsolatedAsyncioTestCase" に "enterAsyncContext()"、および
  "unittest.enterModuleContext()" 関数が追加されました。 (Serhiy
  Storchaka による bpo-45046 での貢献。)


venv
----

* 新しい Python 仮想環境を作成する際、環境内のパスを決めるために
  *venv* sysconfig インストールスキーム を使うようになりました。
  Python を仮想環境内で実行する際も、同じインストールスキームがデフォ
  ルトになります。 これにより、配布者は仮想環境の動作を変えずに、
  sysconfig のデフォルトのインストールスキームを変更できます。 新しい
  仮想環境を作成するサードパーティーのコードも、同じようにするべきです
  。 (Miro Hrončok による bpo-45413 での貢献。)


warnings
--------

* "warnings.catch_warnings()" が "warnings.simplefilter()" 用の引数を
  受け取るようになり、特定の範囲だけで警告を無視したり、エラーに変えた
  りする処理を簡潔に書けるようになりました。 (Zac Hatfield-Dodds によ
  る bpo-47074 での貢献。)


zipfile
-------

* "ZipFile" のディレクトリヘッダーやファイルヘッダーのメタデータを読み
  取る際、メンバー名のエンコーディングを指定できるようになりました。
  (Stephen J. Turnbull and Serhiy Storchaka による bpo-28080 での貢献
  。)

* ZIP アーカイブ内に新しいディレクトリを作成する "ZipFile.mkdir()" が
  追加されました。 (Sam Ezeh による gh-49083 での貢献。)

* "zipfile.Path" に "stem"、"suffix"、"suffixes" が追加されました。
  (Miguel Brito による gh-88261 での貢献。)


最適化
======

この節では、別の節で説明する Faster CPython プロジェクトとは独立した、
個別の最適化を扱います。

* コンパイラは、書式コード "%s"、"%r"、"%a" だけを含む文字列リテラルの
  単純な printf 形式の % 書式化 を最適化し、対応する *f-string* 式と同
  じ速さで実行するようになりました。 (Serhiy Storchaka による
  bpo-28307 での貢献。)

* 整数の除算 ("//") をコンパイラが最適化しやすいように調整しました。
  x86-64 で "int" を "2**30" 未満の値で割る場合、約 20% 高速になりまし
  た。 (Gregory P. Smith and Tim Peters による gh-90564 での貢献。)

* "2**30" 未満の整数に対する "sum()" が、約 30% 高速になりました。
  (Stefan Behnel による gh-68264 での貢献。)

* よくある場合のリストのサイズ変更を効率化し、"list.append()" が約 15%
  、単純な *list comprehension* が最大 20～30% 高速になりました。
  (Dennis Sweeney による gh-91165 での貢献。)

* キーがすべて Unicode オブジェクトである辞書はハッシュ値を保存しなく
  なり、"dict" のサイズが小さくなりました。 例えば、64 ビットプラット
  フォームでの "sys.getsizeof(dict.fromkeys("abcdefg"))" は、352 バイ
  トから 272 バイトに減りました (23% 削減)。 (Inada Naoki による
  bpo-46845 での貢献。)

* "asyncio.DatagramProtocol" を使った UDP による大きなファイルの転送が
  、桁違いに高速になりました。 約 60 MiB のファイルでは、100 倍を超え
  る速度になりました。 (msoxzw による gh-91487 での貢献。)

* "math" の "comb()" と "perm()" が、大きな引数に対して約 10 倍高速に
  なりました (*k* が大きいほど高速化の度合いも大きくなります)。
  (Serhiy Storchaka による bpo-37295 での貢献。)

* "statistics" の "mean()"、"variance()"、"stdev()" は、イテレーターを
  最初に "list" に変換する代わりに、1 回の走査で消費するようになりまし
  た。 これにより、2 倍高速になり、メモリ使用量も大幅に削減できます。
  (Raymond Hettinger による gh-90415 での貢献。)

* "unicodedata.normalize()" が、ASCII 文字だけを含む文字列を定数時間で
  正規化するようになりました。 (Donghee Na による bpo-44987 での貢献。
  )


Faster CPython
==============

Ubuntu Linux 上で GCC を使ってコンパイルし、pyperformance ベンチマーク
スイートで計測したところ、CPython 3.11 は CPython 3.10 より平均 25% 高
速 になりました。 処理内容によって、全体で 10～60% の高速化が見込まれ
ます。

このプロジェクトは、Python の主な 2 つの領域、起動の高速化 と 実行の高
速化 に重点を置いています。 このプロジェクト以外の最適化は、最適化 に
別途記載しています。


起動の高速化
------------


凍結インポート / 静的コードオブジェクト
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Python はモジュールの読み込みを高速化するため、__pycache__ ディレクト
リに *bytecode* をキャッシュします。

以前の Python 3.10 では、モジュールの実行は次の手順でした。

   __pycache__ を読み込む -> marshal 形式から復元する -> ヒープに確保したコードオブジェクト -> 評価する

Python 3.11 では、起動に欠かせない中核のモジュールが「凍結」されていま
す。 つまり、それらの コードオブジェクト (とバイトコード) は、インター
プリタによって静的に確保されます。 これにより、モジュールの実行手順は
次のように短くなります。

   静的に確保したコードオブジェクト -> 評価する

Python 3.11 では、インタープリタの起動が 10～15% 高速になりました。 こ
れは、短時間で終了する Python プログラムに大きな効果があります。

(多数の課題における Eric Snow、Guido van Rossum、Kumar Aditya の貢献。
) (Eric Snow, Guido van Rossum and Kumar Aditya による many issues で
の貢献。)


実行の高速化
------------


低コストで必要時に生成する Python フレーム
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Python が Python 関数を呼び出すたびに、実行情報を保持する Python フレ
ームが作成されます。 フレームに次の最適化が加わりました。

* フレームの作成処理を効率化しました。

* Avoided memory allocation by generously re-using frame space on the
  C stack.

* 内部のフレーム構造体を簡素化し、必須の情報だけを保持するようにしまし
  た。 以前のフレームには、デバッグやメモリ管理のための追加情報が含ま
  れていました。

従来の フレームオブジェクト は、デバッガーや "sys._getframe()"、
"inspect.currentframe()" などのイントロスペクション関数から要求された
ときだけ、作成されるようになりました。 ほとんどのユーザーコードでは、
フレームオブジェクトは一切作成されません。 その結果、ほぼすべての
Python 関数呼び出しが大幅に高速になりました。 pyperformance では 3～7%
の高速化が計測されました。

(Mark Shannon による bpo-44590 での貢献。)


Python 関数呼び出しのインライン化
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Python 関数の呼び出しでは、その関数のコードを解釈する C の評価関数を呼
び出します。 そのため、純粋な Python の再帰でも、実質的に C スタックに
とって安全な範囲に制限されます。

3.11 では、Python コードが別の Python 関数を呼び出すのを CPython が検
出すると、新しいフレームを準備し、その中の新しいコードへ「ジャンプ」し
ます。 これにより、C の解釈実行関数を呼び出さずに済みます。

ほとんどの Python 関数呼び出しは C スタックの領域を消費しなくなり、高
速になりました。 フィボナッチ数や階乗を計算する単純な再帰関数では、1.7
倍の高速化が確認されました。 また、"sys.setrecursionlimit()" で再帰の
上限を増やせば、再帰関数をはるかに深く再帰させられるようになりました。
pyperformance では 1～3% の改善が計測されました。

(Pablo Galindo and Mark Shannon による bpo-45256 での貢献。)


PEP 659: 特殊化を行う適応型インタープリタ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

**PEP 659** は Faster CPython プロジェクトの重要な構成要素の 1 つです
。 基本的な考え方は、Python は動的な言語でも、ほとんどのコードにはオブ
ジェクトや型がめったに変わらない部分がある、というものです。 この性質
を *型の安定性* と呼びます。

実行時に Python は、実行中のコードによくあるパターンや型の安定性を探し
ます。 そして、現在の操作を、より特殊化した操作に置き換えます。 特殊化
した操作は、その用途や型だけで使える高速な処理経路を利用し、一般に汎用
的な操作より高速です。 ここでは *インラインキャッシュ* という考え方も
使われ、コストの高い操作の結果を *bytecode* 内に直接キャッシュします。

特殊化の処理は、よく現れる特定の命令のペアを 1 つのスーパー命令にまと
め、実行時のオーバーヘッドも減らします。

Python が特殊化を行うのは、「ホット」なコード (複数回実行されるコード)
だけです。 これにより、1 回しか実行しないコードに時間を浪費するのを防
ぎます。 コードが動的すぎる場合や使われ方が変わった場合は、特殊化を解
除することもできます。 特殊化は定期的に試みられ、そのコストも高くない
ため、新しい状況に適応できます。

(Stefan Brunthaler の着想を参考に、Mark Shannon が PEP を執筆。 詳しく
は **PEP 659** を参照してください。 実装は Mark Shannon と Brandt
Bucher によるもので、Irit Katriel と Dennis Sweeney も協力。)

+-----------------+----------------------+---------------------------------------------------------+---------------------+---------------------+
| 演算            | 形式                 | 特殊化                                                  | 操作の高速化率 (最  | 貢献者              |
|                 |                      |                                                         | 大)                 |                     |
|=================|======================|=========================================================|=====================|=====================|
| 二項演算        | "x + x"  "x - x"  "x | "int"、"float"、"str" などのよく使う型に対する加算、乗  | 10%                 | Mark Shannon,       |
|                 | * x"                 | 算、減算は、それ ぞれの型に合わせた高速な処理経路を使い |                     | Donghee Na, Brandt  |
|                 |                      | ます。                                                  |                     | Bucher, Dennis      |
|                 |                      |                                                         |                     | Sweeney             |
+-----------------+----------------------+---------------------------------------------------------+---------------------+---------------------+
| 添字によるアク  | "a[i]"               | "list"、"tuple"、"dict" などのコンテナ型への添字アクセ  | 10-25%              | Irit Katriel, Mark  |
| セス            |                      | スでは、内部のデ ータ構造を直接参照します。  独自の     |                     | Shannon             |
|                 |                      | "__getitem__()" を使う添字アクセスも、Python 関数呼び出 |                     |                     |
|                 |                      | しのイン ライン化 と同様にインライン化されます。        |                     |                     |
+-----------------+----------------------+---------------------------------------------------------+---------------------+---------------------+
| 添字による代入  | "a[i] = z"           | 上の添字アクセスの特殊化と同様です。                    | 10-25%              | Dennis Sweeney      |
+-----------------+----------------------+---------------------------------------------------------+---------------------+---------------------+
| 呼び出し (call) | "f(arg)"  "C(arg)"   | "len()" や "str" など、よく使う組み込みの C 関数や型を  | 20%                 | Mark Shannon, Ken   |
|                 |                      | 呼び出す際は、内 部の呼び出し規約を経由せず、対応する C |                     | Jin                 |
|                 |                      | の実装を直接呼び出します。                              |                     |                     |
+-----------------+----------------------+---------------------------------------------------------+---------------------+---------------------+
| グローバル変数  | "print"  "len"       | globals/builtins 名前空間内でのオブジェクトのインデック | [1]                 | Mark Shannon        |
| の読み込み      |                      | スをキャッシュ します。 グローバル変数や組み込みの名前  |                     |                     |
|                 |                      | を読み込む際、名前空間を検索す る必要がなくなります。   |                     |                     |
+-----------------+----------------------+---------------------------------------------------------+---------------------+---------------------+
| 属性の読み込み  | "o.attr"             | グローバル変数の読み込みと同様に、クラスやオブジェクト  | [2]                 | Mark Shannon        |
|                 |                      | の名前空間内での 属性のインデックスをキャッシュします。 |                     |                     |
|                 |                      | ほとんどの場合、属性の読み込み 時に名前空間を検索する必 |                     |                     |
|                 |                      | 要がなくなります。                                      |                     |                     |
+-----------------+----------------------+---------------------------------------------------------+---------------------+---------------------+
| 呼び出すメソッ  | "o.meth()"           | メソッドの実際のアドレスをキャッシュします。 継承の連鎖 | 10-20%              | Ken Jin, Mark       |
| ドの読み込み    |                      | が長いクラスで も、メソッドの読み込み時に名前空間を検索 |                     | Shannon             |
|                 |                      | する必要がなくなります。                                |                     |                     |
+-----------------+----------------------+---------------------------------------------------------+---------------------+---------------------+
| 属性への代入    | "o.attr = z"         | 属性の読み込みの最適化と同様です。                      | pyperformance で 2% | Mark Shannon        |
+-----------------+----------------------+---------------------------------------------------------+---------------------+---------------------+
| シーケンスのア  | "*seq"               | "list" や "tuple" など、よく使うコンテナに特殊化し、内  | 8%                  | Brandt Bucher       |
| ンパック        |                      | 部の呼び出し規約 を経由しないようにします。             |                     |                     |
+-----------------+----------------------+---------------------------------------------------------+---------------------+---------------------+

[1] 同様の最適化は Python 3.8 から存在していました。 3.11 では、より多
    くの形式に特殊化し、一部のオーバーヘッドも削減しています。

[2] 同様の最適化は Python 3.10 から存在していました。 3.11 では、より
    多くの形式に特殊化します。 さらに、bpo-45947 により、すべての属性
    の読み込みが高速化すると見込まれます。


その他
------

* オブジェクトの名前空間を必要時に作成することで、オブジェクトに必要な
  メモリが減りました。 名前空間の辞書は、より多くの場合にキーを共有す
  るようにもなりました。 (Mark Shannon による bpo-45340 と bpo-40116
  での貢献。)

* 「ゼロコスト」の例外が実装され、例外が送出されない場合の "try" 文の
  コストがなくなりました。 (Mark Shannon による bpo-40222 での貢献。)

* インタープリタ内部の例外の表現を簡素化したことで、例外の捕捉にかかる
  時間が約 10% 短くなりました。 (Irit Katriel による bpo-45711 での貢
  献。)

* "re" の正規表現照合エンジンが一部リファクタリングされ、対応するプラ
  ットフォームでは計算型 goto (または「スレッデッドコード」) を使うよ
  うになりました。 その結果、Python 3.11 は Python 3.10 よりも
  pyperformance の正規表現ベンチマーク を最大 10% 高速に実行します。
  (Brandt Bucher による gh-91404 での貢献。)


よくある質問
------------


この高速化を活用するには、コードをどのように書けばよいですか？
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

一般的なベストプラクティスに従って Python らしいコードを書いてください
。 既存のコードを変更する必要はありません。 Faster CPython プロジェク
トは、よく見られるコードのパターンを最適化します。


CPython 3.11 は、より多くのメモリを使いますか？
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

そうとは限りません。 3.10 と比べたメモリ使用量の増加は 20% を超えない
と見込んでいます。 この増加は、前述のフレームオブジェクトやオブジェク
トの辞書のメモリ最適化によって相殺されます。


自分の処理では高速化が見られません。
なぜですか？
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

コードによっては、目立った効果が得られません。 大部分の時間を I/O に費
やしている場合や、NumPy のような C 拡張ライブラリですでに計算の大半を
行っている場合は、大きな高速化はありません。 現時点では、純粋な Python
の処理に最も効果があります。

また、pyperformance の数値は幾何平均です。 pyperformance のベンチマー
クの中でも、少し遅くなったものもあれば、ほぼ 2 倍速くなったものもあり
ます。


JIT コンパイラーはありますか？
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ありません。 まだ、ほかの最適化を検討している段階です。


プロジェクトについて
--------------------

Faster CPython は *CPython* の最適化を探求しています。 主なチームは
Microsoft の資金援助により、フルタイムで取り組んでいます。 Pablo
Galindo Salgado も Bloomberg LP の資金援助により、パートタイムでプロジ
ェクトに取り組んでいます。 また、多くの貢献者はコミュニティのボランテ
ィアです。


CPython バイトコードの変更
==========================

バイトコードに、新しい "CACHE" 命令の形式でインラインキャッシュエント
リーが含まれるようになりました。 多くのオペコードは、直後に決まった個
数のキャッシュが続くことを前提とし、実行時にはインタープリタにそれらを
飛ばさせます。 値を格納したキャッシュは任意の命令に見えることがあるた
め、高速化用のデータを含む適応型バイトコードを直接読み取ったり変更した
りする際は、十分注意する必要があります。


新しいオペコード
----------------

* ジェネレーターやコルーチンで使う "ASYNC_GEN_WRAP"、
  "RETURN_GENERATOR"、"SEND"。

* クロージャーの呼び出し元に特別なコードが不要になる "COPY_FREE_VARS"
  。

* 割り込みの処理が望ましくない特定のループで使う
  "JUMP_BACKWARD_NO_INTERRUPT"。

* セルオブジェクト (cell object) を作成する "MAKE_CELL"。

* **PEP 654** で追加された 新しい例外グループと except* を処理する
  "CHECK_EG_MATCH" と "PREP_RERAISE_STAR"。

* 例外ハンドラーで使う "PUSH_EXC_INFO"。

* 内部のトレース、デバッグ、最適化の検査に使う、何も操作しない命令
  "RESUME"。


置き換えられたオペコード
------------------------

+--------------------------------------+--------------------------------------+-------------------------------------------+
| 置換前のオペコード                   | 新しいオペコード                     | 注釈                                      |
|======================================|======================================|===========================================|
| "BINARY_*" "INPLACE_*"               | "BINARY_OP"                          | 数値の二項演算とインプレース演算のオペコ  |
|                                      |                                      | ードを、すべて単一のオペコード に置き換え |
|                                      |                                      | ました                                    |
+--------------------------------------+--------------------------------------+-------------------------------------------+
| "CALL_FUNCTION" "CALL_FUNCTION_KW"   | "CALL" "KW_NAMES" "PRECALL"          | メソッド呼び出しの引数の移動と、キーワー  |
| "CALL_METHOD"                        | "PUSH_NULL"                          | ド引数の処理を切り離し、呼び出 しをより適 |
|                                      |                                      | 切に特殊化できるようにします              |
+--------------------------------------+--------------------------------------+-------------------------------------------+
| "DUP_TOP" "DUP_TOP_TWO" "ROT_TWO"    | "COPY" "SWAP"                        | スタックを操作する命令                    |
| "ROT_THREE" "ROT_FOUR" "ROT_N"       |                                      |                                           |
+--------------------------------------+--------------------------------------+-------------------------------------------+
| "JUMP_IF_NOT_EXC_MATCH"              | "CHECK_EXC_MATCH"                    | 検査だけを行い、ジャンプしなくなりました  |
+--------------------------------------+--------------------------------------+-------------------------------------------+
| "JUMP_ABSOLUTE" "POP_JUMP_IF_FALSE"  | "JUMP_BACKWARD"                      | [3] を参照。 各方向について "TRUE"、      |
| "POP_JUMP_IF_TRUE"                   | "POP_JUMP_BACKWARD_IF_*"             | "FALSE"、"NONE"、"NOT_NONE" の種類 があり |
|                                      | "POP_JUMP_FORWARD_IF_*"              | ます                                      |
+--------------------------------------+--------------------------------------+-------------------------------------------+
| "SETUP_WITH" "SETUP_ASYNC_WITH"      | "BEFORE_WITH"                        | "with" ブロックの準備                     |
+--------------------------------------+--------------------------------------+-------------------------------------------+

[3] 既存の "JUMP_IF_TRUE_OR_POP" と "JUMP_IF_FALSE_OR_POP" を含め、す
    べてのジャンプオペコードが相対ジャンプになりました。 引数は、絶対
    位置ではなく現在の命令からのオフセットです。


変更・削除されたオペコード
--------------------------

* "MATCH_CLASS" と "MATCH_KEYS" は、成功や失敗を示す追加のブール値をプ
  ッシュしなくなりました。 代わりに、失敗時には取り出した値のタプルで
  はなく "None" をプッシュします。

* 例外を扱うオペコードが、スタック上の例外の表現が 3 項目から 1 項目に
  なったことに合わせて変更されました (gh-89874 を参照)。

* "COPY_DICT_WITHOUT_KEYS"、"GEN_START"、"POP_BLOCK"、"SETUP_FINALLY"
  、"YIELD_FROM" が削除されました。


非推奨
======

この節では、Python 3.11 で非推奨となった Python API を挙げます。

非推奨の C API は 別の節に記載しています。


言語と組み込み機能
------------------

* Chaining "classmethod" descriptors (introduced in bpo-19072) is now
  deprecated.  It can no longer be used to wrap other descriptors such
  as "property".  The core design of this feature was flawed and
  caused a number of downstream problems.  To "pass-through" a
  "classmethod", consider using the "__wrapped__" attribute that was
  added in Python 3.10. (Contributed by Raymond Hettinger in
  gh-89519.)

* 文字列リテラルや bytes リテラルの 8 進エスケープの値が "0o377" (10
  進数で 255) を超えると、"DeprecationWarning" が出るようになりました
  。 将来の Python では "SyntaxWarning"、最終的には "SyntaxError" にな
  ります。 (Serhiy Storchaka による gh-81548 での貢献。)

* "int()" が "__trunc__()" に処理を委ねることが非推奨になりました。
  "type(a)" が "__trunc__()" を実装していても、"__int__()" や
  "__index__()" を実装していない場合、"int(a)" を呼び出すと
  "DeprecationWarning" が出るようになりました。 (Zackery Spytz による
  bpo-44977 での貢献。)


モジュール
----------

* **PEP 594** により、Python 3.13 で削除予定の次のモジュールが非推奨に
  なりました。

  +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
  | "aifc"                | "chunk"               | "msilib"              | "pipes"               | "telnetlib"           |
  +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
  | "audioop"             | "crypt"               | "nis"                 | "sndhdr"              | "uu"                  |
  +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
  | "cgi"                 | "imghdr"              | "nntplib"             | "spwd"                | "xdrlib"              |
  +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+
  | "cgitb"               | "mailcap"             | "ossaudiodev"         | "sunau"               |                       |
  +-----------------------+-----------------------+-----------------------+-----------------------+-----------------------+

  (Brett Cannon による bpo-47061 and Victor Stinner in gh-68966 での貢
  献。)

* "asynchat"、"asyncore"、"smtpd" は、遅くとも Python 3.6 から非推奨と
  なっています。 ドキュメントと非推奨の警告が更新され、Python 3.12 で
  削除されることが明記されました。 (Hugo van Kemenade による bpo-47022
  での貢献。)

* "lib2to3" パッケージと "2to3" ツールが非推奨になりました。 Python
  3.10 以降のコードを解析できない場合があります。 詳しくは、新しい PEG
  パーサーを導入した **PEP 617** を参照してください。 (Victor Stinner
  による bpo-40360 での貢献。)

* 非公開のモジュール "sre_compile"、"sre_constants"、"sre_parse" が非
  推奨になりました。 (Serhiy Storchaka による bpo-47152 での貢献。)


標準ライブラリ
--------------

* "configparser" の次の機能は Python 3.2 から非推奨となっています。 非
  推奨の警告が更新され、Python 3.12 で削除されることが明記されました。

  * "configparser.SafeConfigParser" クラス

  * "configparser.ParsingError.filename" プロパティ

  * "configparser.RawConfigParser.readfp()" メソッド

  (Hugo van Kemenade による bpo-45173 での貢献。)

* "configparser.LegacyInterpolation" は Python 3.2 から docstring で非
  推奨とされ、"configparser" のドキュメントにも記載されていません。 今
  回から "DeprecationWarning" を出すようになり、Python 3.13 で削除され
  ます。 代わりに "configparser.BasicInterpolation" または
  "configparser.ExtendedInterpolation" を使ってください。 (Hugo van
  Kemenade による bpo-46607 での貢献。)

* "importlib.resources" の従来の関数は、パッケージのサブディレクトリ内
  にあるリソースに対応していないため、Python 3.9 で追加された代替の機
  能を推奨する形で非推奨になりました。 将来の Python で削除されます。

  * "importlib.resources.contents()"

  * "importlib.resources.is_resource()"

  * "importlib.resources.open_binary()"

  * "importlib.resources.open_text()"

  * "importlib.resources.read_binary()"

  * "importlib.resources.read_text()"

  * "importlib.resources.path()"

* "locale.getdefaultlocale()" 関数が非推奨になりました。 Python 3.15
  で削除されます。 代わりに "locale.setlocale()"、
  "locale.getpreferredencoding(False)"、"locale.getlocale()" を使って
  ください。 (Victor Stinner による gh-90817 での貢献。)

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

* 正規表現 の番号によるグループ参照とグループ名に、より厳密な規則が適
  用されるようになりました。 番号による参照には ASCII の数字の並びだけ
  を使えます。 "bytes" パターンと置換文字列のグループ名に使えるのは、
  ASCII の英字、数字、アンダースコアだけです。 現時点では、これらの規
  則に違反する構文に対して非推奨の警告が出ます。 (Serhiy Storchaka に
  よる gh-91760 での貢献。)

* "re" モジュールの "re.template()" 関数と、対応する "re.TEMPLATE" お
  よび "re.T" フラグが非推奨になりました。 文書化されておらず、用途も
  明確でなかったためです。 Python 3.13 で削除されます。 (Serhiy
  Storchaka and Miro Hrončok による gh-92728 での貢献。)

* "turtle.settiltangle()" は Python 3.1 から非推奨となっています。 今
  回から非推奨の警告を出すようになり、Python 3.13 で削除されます。 代
  わりに "turtle.tiltangle()" を使ってください (以前は誤って非推奨と記
  載されていましたが、docstring を訂正しました)。 (Hugo van Kemenade
  による bpo-45837 での貢献。)

* Python 2 と Python 3 のコードの互換性のためだけに存在していた
  "typing.Text" が非推奨になりました。 現時点で削除の予定はありません
  が、可能な場合は代わりに "str" を使うことを推奨します。 (Alex
  Waygood による gh-92332 での貢献。)

* キーワード引数の構文で "typing.TypedDict" 型を作成することが非推奨に
  なりました。 Python 3.13 でサポートが削除されます。 (Jingchen Ye に
  よる gh-90224 での貢献。)

* "webbrowser.MacOSX" が非推奨になりました。 Python 3.13 で削除されま
  す。 テストも文書化もされておらず、"webbrowser" 自体も使っていません
  。 (Donghee Na による bpo-42255 での貢献。)

* "TestCase" と "IsolatedAsyncioTestCase" のテストメソッドから、デフォ
  ルトの "None" 以外の値を返すことが非推奨になりました。

* 正式には文書化されていない以下の "unittest" 関数が非推奨となり、
  Python 3.13 で削除される予定です。

  * "unittest.findTestCases()"

  * "unittest.makeSuite()"

  * "unittest.getTestCaseNames()"

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

  * "unittest.TestLoader.loadTestsFromModule()"

  * "unittest.TestLoader.loadTestsFromTestCase()"

  * "unittest.TestLoader.getTestCaseNames()"

  (Erlend E. Aasland による bpo-5846 での貢献。)

* "unittest.TestProgram.usageExit()" が非推奨となり、3.13 で削除される
  予定です。 (Carlos Damázio による gh-67048 での貢献。)


Python 3.12 で削除予定
======================

以下の Python API は以前の Python リリースで非推奨となっており、Python
3.12 で削除される予定です。

削除予定の C API は 別にまとめています。

* "asynchat" モジュール

* "asyncore" モジュール

* distutils パッケージ全体

* "imp" モジュール

* "typing.io" 名前空間

* "typing.re" 名前空間

* "cgi.log()"

* "importlib.find_loader()"

* "importlib.abc.Loader.module_repr()"

* "importlib.abc.MetaPathFinder.find_module()"

* "importlib.abc.PathEntryFinder.find_loader()"

* "importlib.abc.PathEntryFinder.find_module()"

* "importlib.machinery.BuiltinImporter.find_module()"

* "importlib.machinery.BuiltinImporter.module_repr()"

* "importlib.machinery.FileFinder.find_loader()"

* "importlib.machinery.FileFinder.find_module()"

* "importlib.machinery.FrozenImporter.find_module()"

* "importlib.machinery.FrozenImporter.module_repr()"

* "importlib.machinery.PathFinder.find_module()"

* "importlib.machinery.WindowsRegistryFinder.find_module()"

* "importlib.util.module_for_loader()"

* "importlib.util.set_loader_wrapper()"

* "importlib.util.set_package_wrapper()"

* "pkgutil.ImpImporter"

* "pkgutil.ImpLoader"

* "pathlib.Path.link_to()"

* "sqlite3.enable_shared_cache()"

* "sqlite3.OptimizedUnicode()"

* "PYTHONTHREADDEBUG" 環境変数

* "unittest" の以下の非推奨エイリアス。

     +------------------------------+---------------------------------+-----------------+
     | 非推奨のエイリアス           | メソッド名                      | 非推奨となるバ  |
     |                              |                                 | ージョン        |
     |==============================|=================================|=================|
     | "failUnless"                 | "assertTrue()"                  | 3.1             |
     +------------------------------+---------------------------------+-----------------+
     | "failIf"                     | "assertFalse()"                 | 3.1             |
     +------------------------------+---------------------------------+-----------------+
     | "failUnlessEqual"            | "assertEqual()"                 | 3.1             |
     +------------------------------+---------------------------------+-----------------+
     | "failIfEqual"                | "assertNotEqual()"              | 3.1             |
     +------------------------------+---------------------------------+-----------------+
     | "failUnlessAlmostEqual"      | "assertAlmostEqual()"           | 3.1             |
     +------------------------------+---------------------------------+-----------------+
     | "failIfAlmostEqual"          | "assertNotAlmostEqual()"        | 3.1             |
     +------------------------------+---------------------------------+-----------------+
     | "failUnlessRaises"           | "assertRaises()"                | 3.1             |
     +------------------------------+---------------------------------+-----------------+
     | "assert_"                    | "assertTrue()"                  | 3.2             |
     +------------------------------+---------------------------------+-----------------+
     | "assertEquals"               | "assertEqual()"                 | 3.2             |
     +------------------------------+---------------------------------+-----------------+
     | "assertNotEquals"            | "assertNotEqual()"              | 3.2             |
     +------------------------------+---------------------------------+-----------------+
     | "assertAlmostEquals"         | "assertAlmostEqual()"           | 3.2             |
     +------------------------------+---------------------------------+-----------------+
     | "assertNotAlmostEquals"      | "assertNotAlmostEqual()"        | 3.2             |
     +------------------------------+---------------------------------+-----------------+
     | "assertRegexpMatches"        | "assertRegex()"                 | 3.2             |
     +------------------------------+---------------------------------+-----------------+
     | "assertRaisesRegexp"         | "assertRaisesRegex()"           | 3.2             |
     +------------------------------+---------------------------------+-----------------+
     | "assertNotRegexpMatches"     | "assertNotRegex()"              | 3.5             |
     +------------------------------+---------------------------------+-----------------+


削除
====

この節では Python 3.11 で削除された Python API をまとめています。

削除された C API は 別にまとめています。

* 従来のジェネレータベースのコルーチンを "async" / "await" コードと組
  み合わせて使えるようにする "@asyncio.coroutine()" *decorator* が削除
  されました。 この関数は Python 3.8 から非推奨となっており、当初は
  Python 3.10 で削除される予定でした。 代わりに "async def" を使ってく
  ださい。 (Illia Volochii による bpo-43216 での貢献。)

* デバッグモードで従来のジェネレータベースのコルーチンオブジェクトをラ
  ップする "asyncio.coroutines.CoroWrapper" が削除されました。 (Illia
  Volochii による bpo-43216 での貢献。)

* 重大なセキュリティ上の懸念により、Python 3.9 で無効化された
  "asyncio.loop.create_datagram_endpoint()" の *reuse_address* 引数が
  完全に削除されました。 これは UDP におけるソケットオプション
  "SO_REUSEADDR" の動作が原因です。 (Hugo van Kemenade による
  bpo-45129 での貢献。)

* Python 3.9 で非推奨となった "binhex" モジュールが削除されました。 こ
  れに関連する以下の "binascii" 関数も、同様に非推奨となっていたため削
  除されました。

  * "binascii.a2b_hqx()"

  * "binascii.b2a_hqx()"

  * "binascii.rlecode_hqx()"

  * "binascii.rldecode_hqx()"

  "binascii.crc_hqx()" 関数は引き続き利用できます。

  (Victor Stinner による bpo-45085 での貢献。)

* Python 3.9 で非推奨となった "distutils" の "bdist_msi" コマンドが削
  除されました。 代わりに "bdist_wheel" (wheel パッケージ) を使ってく
  ださい。 (Hugo van Kemenade による bpo-45124 での貢献。)

* Python 3.9 から非推奨となっていた "xml.dom.pulldom.DOMEventStream"、
  "wsgiref.util.FileWrapper"、"fileinput.FileInput" の "__getitem__()"
  メソッドが削除されました。 (Hugo van Kemenade による bpo-45132 での
  貢献。)

* "gettext" の非推奨関数 "lgettext()"、"ldgettext()"、"lngettext()"、
  "ldngettext()" が削除されました。 また、"l*gettext()" 関数でしか使わ
  れていないため、"bind_textdomain_codeset()" 関数、
  "NullTranslations.output_charset()" と
  "NullTranslations.set_output_charset()" メソッド、"translation()" と
  "install()" の *codeset* 引数も削除されました。 (Donghee Na and
  Serhiy Storchaka による bpo-44235 での貢献。)

* "inspect" モジュールから以下が削除されました。

  * Python 3.0 から非推奨となっていた "getargspec()" 関数。 代わりに
    "inspect.signature()" または "inspect.getfullargspec()" を使ってく
    ださい。

  * Python 3.5 から非推奨となっていた "formatargspec()" 関数。
    "inspect.signature()" 関数または "inspect.Signature" オブジェクト
    を直接使ってください。

  * Python 3.5 から非推奨となっていた、文書化されていない
    "Signature.from_builtin()" と "Signature.from_function()" メソッド
    。 代わりに "Signature.from_callable()" メソッドを使ってください。

  (Hugo van Kemenade による bpo-45320 での貢献。)

* "pathlib.PurePath" の "__class_getitem__()" メソッドが削除されました
  。 これは以前のバージョンで誤って追加され、使われていませんでした。
  (Nikita Sobolev による bpo-46483 での貢献。)

* 外部の "mailman" パッケージなしでは使えないため、"smtpd" モジュール
  の "MailmanProxy" クラスが削除されました。 (Donghee Na による
  bpo-35800 での貢献。)

* "_tkinter.TkappType" の非推奨の "split()" メソッドが削除されました。
  (Erlend E. Aasland による bpo-38371 での貢献。)

* "unittest" のテストディスカバリで名前空間パッケージのサポートが削除
  されました。 この機能は Python 3.4 で導入されましたが、Python 3.7 以
  降は壊れていました。 (Inada Naoki による bpo-23882 での貢献。)

* 文書化されていない非公開の "float.__set_format__()" メソッド (Python
  3.7 では "float.__setformat__()" という名前でした) が削除されました
  。 その docstring には「おそらくこの関数を使う必要はありません。 主
  に Python のテストスイートで使うために存在しています」と書かれていま
  した。 (Victor Stinner による bpo-46852 での貢献。)

* configure フラグ "--experimental-isolated-subinterpreters" (および対
  応する "EXPERIMENTAL_ISOLATED_SUBINTERPRETERS" マクロ) が削除されま
  した。

* Pynche (The Pythonically Natural Color and Hue Editor) が
  "Tools/scripts" から移動し、Python のソースツリーとは 独立して開発さ
  れるようになりました。


Python 3.11 への移植
====================

この節では、これまでに説明した変更やその他の Python API のバグ修正のう
ち、Python コードの変更が必要になる可能性のあるものをまとめています。

C API の移植に関する注意点は 別にまとめています。

* "open()"、"io.open()"、"codecs.open()"、"fileinput.FileInput" のファ
  イルモードに "'U'" (「ユニバーサル改行」) を指定できなくなりました。
  Python 3 ではテキストモードでファイルを開くと、デフォルトで「ユニバ
  ーサル改行」モードになり、"'U'" フラグは Python 3.3 から非推奨となっ
  ていました。 これらの関数の newline 引数 でユニバーサル改行の動作を
  制御できます。 (Victor Stinner による bpo-37330 での貢献。)

* "compile()" や関連する関数に渡された "ast.AST" ノードの位置情報が検
  証されるようになりました。 不正な位置情報が検出されると "ValueError"
  が送出されます。 (Pablo Galindo による gh-93351 での貢献。)

* Python 3.8 での非推奨化を経て、"asyncio.loop.set_default_executor()"
  に "concurrent.futures.ThreadPoolExecutor" 以外の executor を渡すこ
  とが禁止されました。 (Illia Volochii による bpo-43234 での貢献。)

* "calendar": "calendar.LocaleTextCalendar" と
  "calendar.LocaleHTMLCalendar" は、ロケールが指定されていない場合に
  "locale.getdefaultlocale()" の代わりに "locale.getlocale()" を使うよ
  うになりました。 (Victor Stinner による bpo-46659 での貢献。)

* "pdb" モジュールが ".pdbrc" 設定ファイルを "'UTF-8'" エンコーディン
  グで読み込むようになりました。 (Srinivas Reddy Thatiparthy (శ్రీనివాస్
  రెడ్డి తాటిపర్తి) による bpo-41137 での貢献。)

* "random.sample()" の *population* 引数はシーケンスでなければならず、
  "set" から "list" への自動変換はサポートされなくなりました。 また、
  標本のサイズが母集団のサイズより大きい場合は "ValueError" が送出され
  ます。 (Raymond Hettinger による bpo-40465 での貢献。)

* The *random* optional parameter of "random.shuffle()" was removed.
  It was previously an arbitrary random function to use for the
  shuffle; now, "random.random()" (its previous default) will always
  be used.

* "re" の 正規表現の構文 で、グローバルなインラインフラグ (例えば
  "(?i)") を使えるのは正規表現の先頭だけになりました。 それ以外の位置
  で使うことは Python 3.6 から非推奨となっていました。 (Serhiy
  Storchaka による bpo-47066 での貢献。)

* "re" モジュールで、まれにキャプチャグループの結果が誤る原因となって
  いた長年のバグがいくつか修正されました。 そのため、該当する場合には
  キャプチャ結果が変わる可能性があります。 (Ma Lin による bpo-35859 で
  の貢献。)


ビルドの変更
============

* CPython が、WebAssembly プラットフォームの Emscripten ("wasm32
  -unknown-emscripten"、すなわちブラウザー上の Python) と WebAssembly
  System Interface (WASI) ("wasm32-unknown-wasi") へのクロスコンパイル
  を、**PEP 11** の **Tier 3 サポート** として提供するようになりました
  。 この取り組みは Pyodide などの先行する取り組みに着想を得ています。
  これらのプラットフォームが提供する POSIX API は限られており、ネット
  ワーク、プロセス、スレッド、シグナル、mmap、ユーザーやグループに関連
  する Python 標準ライブラリの機能やモジュールは利用できないか、動作し
  ません。 (Emscripten は Christian Heimes と Ethan Smith による
  gh-84461 での貢献、WASI は Christian Heimes による gh-90473 での貢献
  。 gh-95085 でプラットフォームのサポート段階が引き上げられました。)

* CPython のビルドに以下が必要になりました。

  * C11 コンパイラと標準ライブラリ。 C11 の省略可能な機能 は必要ありま
    せん。 (Victor Stinner による bpo-46656, bpo-45440 and bpo-46640
    での貢献。)

  * IEEE 754 浮動小数点数のサポート。 (Victor Stinner による bpo-46917
    での貢献。)

* "Py_NO_NAN" マクロが削除されました。 CPython で IEEE 754 浮動小数点
  数が必須になったため、NaN 値は常に利用できます。 (Victor Stinner に
  よる bpo-46656 での貢献。)

* "tkinter" パッケージに Tcl/Tk 8.5.12 以降が必要になりました。
  (Serhiy Storchaka による bpo-46996 での貢献。)

* 標準ライブラリのほとんどの拡張モジュールについて、ビルド依存関係、コ
  ンパイラフラグ、リンカフラグを **configure** が検出するようになりま
  した。 libffi、libnsl、libsqlite3、zlib、bzip2、liblzma、libcrypt、
  Tcl/Tk、uuid のフラグは、利用可能であれば pkg-config で検出します。
  "tkinter" では Tcl/Tk のヘッダーとライブラリの開発用設定を検出するた
  めに pkg-config コマンドが必要になりました。 (Christian Heimes and
  Erlend Egeberg Aasland による bpo-45847, bpo-45747, and bpo-45763 で
  の貢献。)

* libpython が libcrypt にリンクされなくなりました。 (Mike Gilbert に
  よる bpo-45433 での貢献。)

* "--with-lto" に "thin" を渡す ("--with-lto=thin" と指定する) と、
  ThinLTO オプションを使って CPython をビルドできるようになりました。
  (Donghee Na and Brett Holman による bpo-44340 での貢献。)

* オブジェクト構造体のフリーリストを無効にできるようになりました。 新
  しい **configure** オプション "--without-freelists" を使うと、空のタ
  プルのシングルトンを除くすべてのフリーリストを無効にできます。
  (Christian Heimes による bpo-45522 での貢献。)

* "Modules/Setup" と "Modules/makesetup" が改善され、整理されました。
  "makesetup" で拡張モジュールをビルドできるようになりました。 一部の
  テストモジュールを除き、すべてのモジュールをメインのバイナリまたはラ
  イブラリに静的リンクできます。 (Brett Cannon and Christian Heimes に
  よる bpo-45548, bpo-45570, bpo-45571, and bpo-43974 での貢献。)

  注釈:

    Tcl/Tk のヘッダーとライブラリの場所を手動で指定するには、環境変数
    "TCLTK_CFLAGS" と "TCLTK_LIBS" を使ってください。 **configure** の
    "--with-tcltk-includes" と "--with-tcltk-libs" オプションは削除さ
    れました。RHEL 7 と CentOS 7 の開発用パッケージには "tcl.pc" と
    "tk.pc" が含まれていないため、"TCLTK_LIBS="-ltk8.5 -ltkstub8.5
    -ltcl8.5"" を使ってください。 "Misc/rhel7" ディレクトリには、RHEL
    7 と CentOS 7 の Tcl/Tk と OpenSSL を使って Python をビルドするた
    めの ".pc" ファイルと手順が含まれています。

* CPython の Python "int" の実装では、デフォルトで 30 ビットの桁を使う
  ようになりました。 以前のデフォルトは、"SIZEOF_VOID_P >= 8" のプラッ
  トフォームでは 30 ビットの桁、それ以外では 15 ビットの桁でした。
  configure スクリプトの "--enable-big-digits" オプション、または
  Windows では "PC/pyconfig.h" の "PYLONG_BITS_IN_DIGIT" 変数で、引き
  続き 15 ビットの桁を使うよう明示的に指定できますが、このオプションは
  将来削除される可能性があります。 (Mark Dickinson による bpo-45569 で
  の貢献。)


C API の変更
============


新しい機能
----------

* 型の短い名前を取得する "PyType_GetName()" 関数が追加されました。
  (Hai Shi による bpo-42035 での貢献。)

* 型の修飾名を取得する "PyType_GetQualName()" 関数が追加されました。
  (Hai Shi による bpo-42035 での貢献。)

* Add new "PyThreadState_EnterTracing()" and
  "PyThreadState_LeaveTracing()" functions to the limited C API to
  suspend and resume tracing and profiling. (Contributed by Victor
  Stinner in bpo-43760.)

* "PY_VERSION_HEX" と同じ値を持つ "Py_Version" 定数が追加されました。
  ( Gabriele N. Tornetta による bpo-43931 での貢献。)

* "Py_buffer" と以下の API が限定 API および安定 ABI に含まれるように
  なりました。

  * "PyObject_CheckBuffer()"

  * "PyObject_GetBuffer()"

  * "PyBuffer_GetPointer()"

  * "PyBuffer_SizeFromFormat()"

  * "PyBuffer_ToContiguous()"

  * "PyBuffer_FromContiguous()"

  * "PyObject_CopyData()"

  * "PyBuffer_IsContiguous()"

  * "PyBuffer_FillContiguousStrides()"

  * "PyBuffer_FillInfo()"

  * "PyBuffer_Release()"

  * "PyMemoryView_FromBuffer()"

  * "bf_getbuffer" と "bf_releasebuffer" 型スロット

  (Christian Heimes による bpo-45459 での貢献。)

* メソッドが定義されたモジュールの情報を ("PyCMethod" 経由で) 直接取得
  できない場合に、そのモジュールを取得する "PyType_GetModuleByDef()"
  関数が追加されました。 (Petr Viktorin による bpo-46613 での貢献。)

* C の double をパック、アンパック (直列化、逆直列化) する関数
  "PyFloat_Pack2()"、"PyFloat_Pack4()"、"PyFloat_Pack8()"、
  "PyFloat_Unpack2()"、"PyFloat_Unpack4()"、"PyFloat_Unpack8()" が追加
  されました。 (Victor Stinner による bpo-46906 での貢献。)

* フレームオブジェクトの属性を取得する関数 "PyFrame_GetBuiltins()"、
  "PyFrame_GetGenerator()"、"PyFrame_GetGlobals()"、
  "PyFrame_GetLasti()" が追加されました。

* 処理中の例外インスタンスを取得、設定する 2 つの関数
  "PyErr_GetHandledException()" と "PyErr_SetHandledException()" が追
  加されました。 これらは、例外を従来の 3 要素のタプルで表す
  "PyErr_SetExcInfo()" と "PyErr_GetExcInfo()" の代わりに使えます。
  (Irit Katriel による bpo-46343 での貢献。)

* "PyConfig.safe_path" メンバーが追加されました。 (Victor Stinner によ
  る gh-57684 での貢献。)


Python 3.11 への移植
--------------------

* マクロの落とし穴 を避けるため、いくつかのマクロが static inline 関数
  に変換されました。 置き換え後の関数では、静的な型チェックによるコン
  パイラの警告を避けるために引数を必要な型へキャストするので、ほとんど
  の場合、この変更を利用者が意識する必要はありません。 ただし、限定 C
  API を 3.11 以上に設定している場合はこのキャストを行わないため、呼び
  出し側で引数を必要な型にキャストしなければなりません。 詳しくは
  **PEP 670** を参照してください。 (Victor Stinner and Erlend E.
  Aasland による gh-89653 での貢献。)

* "PyErr_SetExcInfo()" が "type" と "traceback" 引数を使わなくなり、イ
  ンタープリタがこれらの値を例外インスタンス ("value" 引数) から取得す
  るようになりました。 この関数は引き続き 3 つの引数すべての参照を盗み
  ます。 (Irit Katriel による bpo-45711 での貢献。)

* "PyErr_GetExcInfo()" が、結果の "type" と "traceback" フィールドを例
  外インスタンス ("value" フィールド) から取得するようになりました。
  (Irit Katriel による bpo-45711 での貢献。)

* "_frozen" に、凍結モジュールがパッケージかどうかを示す "is_package"
  フィールドが追加されました。 以前は "size" フィールドが負かどうかで
  区別していました。 今後は "size" に非負の値だけを使います。 (Kumar
  Aditya による bpo-46608 での貢献。)

* "_PyFrameEvalFunction()" の第 2 引数が "PyFrameObject*" から
  "_PyInterpreterFrame*" に変わりました。 この関数ポインタ型の使い方に
  ついては **PEP 523** を参照してください。

* "PyCode_New()" と "PyCode_NewWithPosOnlyArgs()" に "exception_table"
  引数が追加されました。 可能な限り、これらの関数は使わないでください
  。 カスタムのコードオブジェクトを得るには、コンパイラでコードオブジ
  ェクトを作成し、"replace" メソッドで変更したものを取得してください。

* "PyCodeObject" から "co_code"、"co_varnames"、"co_cellvars"、
  "co_freevars" フィールドが削除されました。 C API でこれらにアクセス
  するには、それぞれ "PyCode_GetCode()"、"PyCode_GetVarnames()"、
  "PyCode_GetCellvars()"、"PyCode_GetFreevars()" を使ってください。
  (Brandt Bucher による bpo-46841 and Ken Jin in gh-92154 and gh-94936
  での貢献。)

* 古い 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 バージョンにも対応するには、以下のマク
  ロを定義してコード全体で使うことができます (これらは "mypy" のコード
  ベースから転載したものです)。

     #if PY_VERSION_HEX >= 0x03080000
     #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_BEGIN(op, dealloc)
     #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_END
     #else
     #  define CPy_TRASHCAN_BEGIN(op, dealloc) Py_TRASHCAN_SAFE_BEGIN(op)
     #  define CPy_TRASHCAN_END(op) Py_TRASHCAN_SAFE_END(op)
     #endif

* "Py_TPFLAGS_HAVE_GC" フラグを設定しているのに巡回関数
  ("PyTypeObject.tp_traverse") がない型を定義すると、"PyType_Ready()"
  関数がエラーを送出するようになりました。 (Victor Stinner による
  bpo-44263 での貢献。)

* "Py_TPFLAGS_IMMUTABLETYPE" フラグを持つヒープ型が **PEP 590** の
  vectorcall プロトコルを継承できるようになりました。 以前は 静的な型
  でしか継承できませんでした。 (Erlend E. Aasland による bpo-43908 で
  の貢献。)

* "Py_TYPE()" が static inline 関数に変わったため、"Py_TYPE(obj) =
  new_type" は "Py_SET_TYPE(obj, new_type)" に置き換える必要があります
  。 Python 3.9 から利用できる "Py_SET_TYPE()" 関数を参照してください
  。 後方互換性のために、以下のマクロを使うことができます。

     #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_TYPE)
     static inline void _Py_SET_TYPE(PyObject *ob, PyTypeObject *type)
     { ob->ob_type = type; }
     #define Py_SET_TYPE(ob, type) _Py_SET_TYPE((PyObject*)(ob), type)
     #endif

  (Victor Stinner による bpo-39573 での貢献。)

* "Py_SIZE()" が static inline 関数に変わったため、"Py_SIZE(obj) =
  new_size" は "Py_SET_SIZE(obj, new_size)" に置き換える必要があります
  。 Python 3.9 から利用できる "Py_SET_SIZE()" 関数を参照してください
  。 後方互換性のために、以下のマクロを使うことができます。

     #if PY_VERSION_HEX < 0x030900A4 && !defined(Py_SET_SIZE)
     static inline void _Py_SET_SIZE(PyVarObject *ob, Py_ssize_t size)
     { ob->ob_size = size; }
     #define Py_SET_SIZE(ob, size) _Py_SET_SIZE((PyVarObject*)(ob), size)
     #endif

  (Victor Stinner による bpo-39573 での貢献。)

* "Py_LIMITED_API" マクロが "0x030b0000" (Python 3.11) 以上の場合、
  "<Python.h>" がヘッダーファイル "<stdlib.h>"、"<stdio.h>"、
  "<errno.h>"、"<string.h>" をインクルードしなくなりました。 C 拡張は
  "#include <Python.h>" の後にこれらのヘッダーファイルを明示的にインク
  ルードする必要があります。 (Victor Stinner による bpo-45434 での貢献
  。)

* 限定 API に含まれないファイル "cellobject.h"、"classobject.h"、
  "code.h"、"context.h"、"funcobject.h"、"genobject.h"、
  "longintrepr.h" が "Include/cpython" ディレクトリに移動しました。 ま
  た、"eval.h" ヘッダーファイルが削除されました。 これらのファイルは
  "Python.h" に含まれているので、直接インクルードしてはいけません (イ
  ンクルードファイル を参照)。 直接インクルードしている場合は、代わり
  に "Python.h" をインクルードすることを検討してください。 (Victor
  Stinner による bpo-35134 での貢献。)

* "PyUnicode_CHECK_INTERNED()" マクロが限定 C API から除外されました。
  このマクロは限定 C API では利用できない内部構造体を使っていたため、
  限定 C API ではもともと使えませんでした。 (Victor Stinner による
  bpo-46007 での貢献。)

* 以下のフレーム関連の関数と型が "#include <Python.h>" だけで利用でき
  るようになり、"#include <frameobject.h>" を追加する必要がなくなりま
  した。

  * "PyFrame_Check()"

  * "PyFrame_GetBack()"

  * "PyFrame_GetBuiltins()"

  * "PyFrame_GetGenerator()"

  * "PyFrame_GetGlobals()"

  * "PyFrame_GetLasti()"

  * "PyFrame_GetLocals()"

  * "PyFrame_Type"

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

* "PyFrameObject" 構造体のメンバーが公開 C API から削除されました。

  "PyFrameObject" のフィールドはいつ変更されてもおかしくないとドキュメ
  ントには記載されていましたが、長い間安定しており、いくつかの広く使わ
  れている拡張でも利用されていました。

  Python 3.11 ではパフォーマンスを最適化できるようにフレーム構造体を再
  編しました。 古い実装の詳細にすぎなかった一部のフィールドは完全に削
  除されました。

  "PyFrameObject" のフィールド。

  * "f_back": "PyFrame_GetBack()" を使ってください。

  * "f_blockstack": 削除されました。

  * "f_builtins": "PyFrame_GetBuiltins()" を使ってください。

  * "f_code": "PyFrame_GetCode()" を使ってください。

  * "f_gen": "PyFrame_GetGenerator()" を使ってください。

  * "f_globals": "PyFrame_GetGlobals()" を使ってください。

  * "f_iblock": 削除されました。

  * "f_lasti": "PyFrame_GetLasti()" を使ってください。 "f_lasti" と
    "PyCode_Addr2Line()" を組み合わせて使うコードでは、代わりに
    "PyFrame_GetLineNumber()" を使ってください。 こちらの方が高速な場
    合があります。

  * "f_lineno": "PyFrame_GetLineNumber()" を使ってください。

  * "f_locals": "PyFrame_GetLocals()" を使ってください。

  * "f_stackdepth": 削除されました。

  * "f_state": no public API (renamed to "f_frame.f_state").

  * "f_trace": 公開 API はありません。

  * "f_trace_lines": "PyObject_GetAttrString((PyObject*)frame,
    "f_trace_lines")" を使ってください。

  * "f_trace_opcodes": "PyObject_GetAttrString((PyObject*)frame,
    "f_trace_opcodes")" を使ってください。

  * "f_localsplus": 公開 API はありません ("f_frame.localsplus" に改名
    されました)。

  * "f_valuestack": 削除されました。

  Python のフレームオブジェクトは必要になるまで生成されなくなりました
  。 これに伴い "f_back" メンバーの値も必要になるまで計算されなくなっ
  たため、直接アクセスしてはいけません。 代わりに "PyFrame_GetBack()"
  関数を呼び出す必要があります。

  "f_locals" に直接アクセスしていたデバッガは、代わりに
  "PyFrame_GetLocals()" を呼び出す *必要があります*。
  "PyFrame_FastToLocalsWithError()" や "PyFrame_LocalsToFast()" を呼び
  出す必要はなくなり、むしろこれらの関数を呼び出してはいけません。 必
  要なフレームの更新は仮想マシンが管理するようになりました。

  Python 3.8 以前で "PyFrame_GetCode()" を定義するコードです。

     #if PY_VERSION_HEX < 0x030900B1
     static inline PyCodeObject* PyFrame_GetCode(PyFrameObject *frame)
     {
         Py_INCREF(frame->f_code);
         return frame->f_code;
     }
     #endif

  Python 3.8 以前で "PyFrame_GetBack()" を定義するコードです。

     #if PY_VERSION_HEX < 0x030900B1
     static inline PyFrameObject* PyFrame_GetBack(PyFrameObject *frame)
     {
         Py_XINCREF(frame->f_back);
         return frame->f_back;
     }
     #endif

  または、pythoncapi_compat プロジェクト を使うと、古い Python バージ
  ョンでもこれら 2 つの関数を利用できます。

* "PyThreadState" 構造体のメンバーの変更。

  * "frame": 削除されました。 "PyThreadState_GetFrame()" を使ってくだ
    さい (Python 3.9 で bpo-40429 により追加された関数です)。 この関数
    は *strong reference* を返すので、"Py_XDECREF()" を呼び出す必要が
    あることに注意してください。

  * "tracing": 変更されました。 "PyThreadState_EnterTracing()" と
    "PyThreadState_LeaveTracing()" を使ってください (Python 3.11 で
    bpo-43760 により追加された関数です)。

  * "recursion_depth": 削除されました。 代わりに
    "(tstate->recursion_limit - tstate->recursion_remaining)" を使って
    ください。

  * "stackcheck_counter": 削除されました。

  Python 3.8 以前で "PyThreadState_GetFrame()" を定義するコードです。

     #if PY_VERSION_HEX < 0x030900B1
     static inline PyFrameObject* PyThreadState_GetFrame(PyThreadState *tstate)
     {
         Py_XINCREF(tstate->frame);
         return tstate->frame;
     }
     #endif

  Python 3.10 以前で "PyThreadState_EnterTracing()" と
  "PyThreadState_LeaveTracing()" を定義するコードです。

     #if PY_VERSION_HEX < 0x030B00A2
     static inline void PyThreadState_EnterTracing(PyThreadState *tstate)
     {
         tstate->tracing++;
     #if PY_VERSION_HEX >= 0x030A00A1
         tstate->cframe->use_tracing = 0;
     #else
         tstate->use_tracing = 0;
     #endif
     }

     static inline void PyThreadState_LeaveTracing(PyThreadState *tstate)
     {
         int use_tracing = (tstate->c_tracefunc != NULL || tstate->c_profilefunc != NULL);
         tstate->tracing--;
     #if PY_VERSION_HEX >= 0x030A00A1
         tstate->cframe->use_tracing = use_tracing;
     #else
         tstate->use_tracing = use_tracing;
     #endif
     }
     #endif

  または、pythoncapi-compat プロジェクト を使うと、古い Python バージ
  ョンでもこれらの関数を利用できます。

* 配布者には、最適化された Blake2 ライブラリ libb2 を使って Python を
  ビルドすることを推奨します。

* 初期化時に "PyConfig.module_search_paths" を使って "sys.path" を初期
  化するには、"PyConfig.module_search_paths_set" フィールドを 1 に設定
  する必要があります。 そうしないと、初期化時にパスを再計算し、
  "module_search_paths" に追加した値がすべて置き換えられます。

* "PyConfig_Read()" は初期の検索パスを計算しなくなり、
  "PyConfig.module_search_paths" に値を設定しなくなりました。 デフォル
  トのパスを計算してから変更するには、初期化を完了した後に
  "PySys_GetObject()" で "sys.path" を Python のリストオブジェクトとし
  て取得し、直接変更してください。


非推奨
------

* Python の初期化を設定する以下の関数が非推奨となりました。

  * "PySys_AddWarnOptionUnicode()"

  * "PySys_AddWarnOption()"

  * "PySys_AddXOption()"

  * "PySys_HasWarnOptions()"

  * "PySys_SetArgvEx()"

  * "PySys_SetArgv()"

  * "PySys_SetPath()"

  * "Py_SetPath()"

  * "Py_SetProgramName()"

  * "Py_SetPythonHome()"

  * "Py_SetStandardStreamEncoding()"

  * "_Py_SetProgramFullPath()"

  代わりに Python 初期化設定 の新しい "PyConfig" API を使ってください
  (**PEP 587**)。 (Victor Stinner による gh-88279 での貢献。)

* "PyBytesObject" の "ob_shash" メンバーが非推奨となりました。 代わり
  に "PyObject_Hash()" を使ってください。 (Inada Naoki による
  bpo-46864 での貢献。)


Python 3.12 で削除予定
----------------------

以下の C API は以前の Python リリースで非推奨となっており、Python 3.12
で削除される予定です。

* "PyUnicode_AS_DATA()"

* "PyUnicode_AS_UNICODE()"

* "PyUnicode_AsUnicodeAndSize()"

* "PyUnicode_AsUnicode()"

* "PyUnicode_FromUnicode()"

* "PyUnicode_GET_DATA_SIZE()"

* "PyUnicode_GET_SIZE()"

* "PyUnicode_GetSize()"

* "PyUnicode_IS_COMPACT()"

* "PyUnicode_IS_READY()"

* "PyUnicode_READY()"

* "PyUnicode_WSTR_LENGTH()"

* "_PyUnicode_AsUnicode()"

* "PyUnicode_WCHAR_KIND"

* "PyUnicodeObject"

* "PyUnicode_InternImmortal()"


削除
----

* "PyFrame_BlockSetup()" と "PyFrame_BlockPop()" が削除されました。
  (Mark Shannon による bpo-40222 での貢献。)

* "errno" 変数を使う以下の数学マクロが削除されました。

  * "Py_ADJUST_ERANGE1()"

  * "Py_ADJUST_ERANGE2()"

  * "Py_OVERFLOWED()"

  * "Py_SET_ERANGE_IF_OVERFLOW()"

  * "Py_SET_ERRNO_ON_MATH_ERROR()"

  (Victor Stinner の貢献による bpo-45412)

* Python 3.3 から非推奨となっていた "Py_UNICODE_COPY()" と
  "Py_UNICODE_FILL()" マクロが削除されました。 代わりに、前者には
  "PyUnicode_CopyCharacters()" または "memcpy()" ("wchar_t*" 文字列の
  場合)、後者には "PyUnicode_Fill()" 関数を使ってください。 (Victor
  Stinner による bpo-41123 での貢献。)

* "pystrhex.h" ヘッダーファイルが削除されました。 このファイルには非公
  開関数しか含まれていません。 C 拡張はメインの "<Python.h>" ヘッダー
  ファイルだけをインクルードする必要があります。 (Victor Stinner によ
  る bpo-45434 での貢献。)

* "Py_FORCE_DOUBLE()" マクロが削除されました。 このマクロは
  "Py_IS_INFINITY()" マクロで使われていました。 (Victor Stinner による
  bpo-45440 での貢献。)

* "Py_LIMITED_API" を定義している場合、以下は利用できなくなりました。

  * "PyMarshal_WriteLongToFile()"

  * "PyMarshal_WriteObjectToFile()"

  * "PyMarshal_ReadObjectFromString()"

  * "PyMarshal_WriteObjectToString()"

  * "Py_MARSHAL_VERSION" マクロ

  これらは 限定 API に含まれていません。

  (Victor Stinner による bpo-45474 での貢献。)

* "PyWeakref_GET_OBJECT()" が限定 C API から除外されました。 限定 C
  API では "PyWeakReference" 構造体が不透明なため、もともと動作してい
  ませんでした。 (Victor Stinner による bpo-35134 での貢献。)

* "PyHeapType_GET_MEMBERS()" マクロが削除されました。 このマクロは誤っ
  て公開 C API に含まれていましたが、Python 内部でしか使ってはいけませ
  ん。 代わりに "PyTypeObject.tp_members" メンバーを使ってください。
  (Victor Stinner による bpo-40170 での貢献。)

* "HAVE_PY_SET_53BIT_PRECISION" マクロが削除されました (内部 C API に
  移動しました)。 (Victor Stinner による bpo-45412 での貢献。)

* "Py_UNICODE" のエンコーダー API が削除されました。 これらは Python
  3.3 から非推奨となっており、ほとんど使われていないうえ、推奨される代
  替 API より非効率なためです。

  削除された関数は以下の通りです:

  * "PyUnicode_Encode()"

  * "PyUnicode_EncodeASCII()"

  * "PyUnicode_EncodeLatin1()"

  * "PyUnicode_EncodeUTF7()"

  * "PyUnicode_EncodeUTF8()"

  * "PyUnicode_EncodeUTF16()"

  * "PyUnicode_EncodeUTF32()"

  * "PyUnicode_EncodeUnicodeEscape()"

  * "PyUnicode_EncodeRawUnicodeEscape()"

  * "PyUnicode_EncodeCharmap()"

  * "PyUnicode_TranslateCharmap()"

  * "PyUnicode_EncodeDecimal()"

  * "PyUnicode_TransformDecimalToASCII()"

  **PEP 624** で詳細と **移行ガイド** を参照してください。 (Inada
  Naoki による bpo-44029 での貢献。)


Python 3.11.4での重要な変更点
=============================


tarfile
-------

* "tarfile" の展開メソッドと "shutil.unpack_archive()" に *filter* 引
  数が追加されました。 これにより、展開先ディレクトリの外にファイルを
  作成するなど、予想外の動作や危険な動作を招く tar の機能を制限できま
  す。 詳しくは 展開フィルター を参照してください。 Python 3.12 では
  *filter* 引数を指定せずに使うと "DeprecationWarning" が表示されます
  。 Python 3.14 ではデフォルトが "'data'" に変わります。 (Petr
  Viktorin による **PEP 706** での貢献。)


Python 3.11.5での重要な変更点
=============================


OpenSSL
-------

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