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 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 命令 とソースコードの場所を関連付けるために使用できます。この情報は次を使用して取得できます:

詳細は 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 ビットビルドにこの接尾辞が含まれています。

その他の言語変更

  • 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

contextlib

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

dataclasses

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

datetime

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

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

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

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 * x

int、float、str などのよく使う型に対する加算、乗算、減算は、それぞれの型に合わせた高速な処理経路を使います。

10%

Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney

添字によるアクセス

a[i]

list、tuple、dict などのコンテナ型への添字アクセスでは、内部のデータ構造を直接参照します。

独自の __getitem__() を使う添字アクセスも、Python 関数呼び出しのインライン化 と同様にインライン化されます。

10-25%

Irit Katriel, Mark Shannon

添字による代入

a[i] = z

上の添字アクセスの特殊化と同様です。

10-25%

Dennis Sweeney

呼び出し (call)

f(arg)

C(arg)

len() や str など、よく使う組み込みの C 関数や型を呼び出す際は、内部の呼び出し規約を経由せず、対応する C の実装を直接呼び出します。

20%

Mark Shannon, Ken 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

その他

  • オブジェクトの名前空間を必要時に作成することで、オブジェクトに必要なメモリが減りました。 名前空間の辞書は、より多くの場合にキーを共有するようにもなりました。 (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 命令の形式でインラインキャッシュエントリーが含まれるようになりました。 多くのオペコードは、直後に決まった個数のキャッシュが続くことを前提とし、実行時にはインタープリタにそれらを飛ばさせます。 値を格納したキャッシュは任意の命令に見えることがあるため、高速化用のデータを含む適応型バイトコードを直接読み取ったり変更したりする際は、十分注意する必要があります。

新しいオペコード

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

置換前のオペコード

新しいオペコード

注釈

BINARY_*
INPLACE_*

BINARY_OP

数値の二項演算とインプレース演算のオペコードを、すべて単一のオペコードに置き換えました

CALL_FUNCTION
CALL_FUNCTION_KW
CALL_METHOD
KW_NAMES
PRECALL

メソッド呼び出しの引数の移動と、キーワード引数の処理を切り離し、呼び出しをより適切に特殊化できるようにします

DUP_TOP
DUP_TOP_TWO
ROT_TWO
ROT_THREE
ROT_FOUR
ROT_N

スタックを操作する命令

JUMP_IF_NOT_EXC_MATCH

検査だけを行い、ジャンプしなくなりました

JUMP_ABSOLUTE
POP_JUMP_IF_FALSE
POP_JUMP_IF_TRUE
POP_JUMP_BACKWARD_IF_*
POP_JUMP_FORWARD_IF_*

[3] を参照。 各方向について TRUE、FALSE、NONE、NOT_NONE の種類があります

SETUP_WITH
SETUP_ASYNC_WITH

BEFORE_WITH

with ブロックの準備

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

  • 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 のメソッドを使ってください。

    (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 のビルドに以下が必要になりました。

  • 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 の変更

新しい機能

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> を追加する必要がなくなりました。

    (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 を定義している場合、以下は利用できなくなりました。

    これらは 限定 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 を使うようになりました。