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 を見てください。
新たな文法機能:
新たな組み込み機能:
新しい標準ライブラリのモジュール:
インタープリタの改善:
新しい
-Pコマンドライン引数とPYTHONSAFEPATH環境変数により、 安全でない可能性のあるパス をsys.pathに自動的に先頭に付加しないようにします。
新しい型ヒントの機能:
重要な非推奨化、削除と制限:
PEP 594: たくさんのレガシーの標準ライブラリのモジュールが非推奨になり Python 3.13 で削除されます
新しい機能¶
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 ビットビルドにこの接尾辞が含まれています。
その他の言語変更¶
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
-Pcommand line option and aPYTHONSAFEPATHenvironment variable, which disable the automatic prepending tosys.pathof the script's directory when running a script, or the current directory when using-cand-m. This ensures only stdlib and installed modules are picked up byimport, 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 桁です。
新たなモジュール¶
改良されたモジュール¶
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¶
dataclasses¶
datetime¶
datetime.timezone.utcの便利な別名としてdatetime.UTCが追加されました。 (Kabir Kwatra による gh-91973 での貢献。)datetime.date.fromisoformat(),datetime.time.fromisoformat()anddatetime.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
Flagto supportlen(), iteration andin/not inon 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¶
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¶
inspect¶
デスクリプタープロトコルによる動的な属性検索を発生させずに、すべてのメンバーを返す
getmembers_static()が追加されました。 (Weipeng Hong による bpo-30533 での貢献。)オブジェクトの型が
MethodWrapperTypeかどうかを調べるismethodwrapper()が追加されました。 (Hakan Çelik による bpo-29418 での貢献。)inspectモジュールのフレーム関連の関数は、新しいFrameInfoとTracebackのインスタンスを返すようになりました。 これらは従来の named tuple のようなインターフェースと後方互換性があり、PEP 657 で拡張された位置情報 (終了行番号、開始桁、終了桁) を含みます。 対象の関数は次のとおりです。(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¶
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 も協力。)
演算 |
形式 |
特殊化 |
操作の高速化率 (最大) |
貢献者 |
|---|---|---|---|---|
二項演算 |
|
|
10% |
Mark Shannon, Donghee Na, Brandt Bucher, Dennis Sweeney |
添字によるアクセス |
|
独自の |
10-25% |
Irit Katriel, Mark Shannon |
添字による代入 |
|
上の添字アクセスの特殊化と同様です。 |
10-25% |
Dennis Sweeney |
呼び出し (call) |
|
|
20% |
Mark Shannon, Ken Jin |
グローバル変数の読み込み |
|
globals/builtins 名前空間内でのオブジェクトのインデックスをキャッシュします。 グローバル変数や組み込みの名前を読み込む際、名前空間を検索する必要がなくなります。 |
Mark Shannon |
|
属性の読み込み |
|
グローバル変数の読み込みと同様に、クラスやオブジェクトの名前空間内での属性のインデックスをキャッシュします。 ほとんどの場合、属性の読み込み時に名前空間を検索する必要がなくなります。 |
Mark Shannon |
|
呼び出すメソッドの読み込み |
|
メソッドの実際のアドレスをキャッシュします。 継承の連鎖が長いクラスでも、メソッドの読み込み時に名前空間を検索する必要がなくなります。 |
10-20% |
Ken Jin, Mark Shannon |
属性への代入 |
|
属性の読み込みの最適化と同様です。 |
pyperformance で 2% |
Mark Shannon |
シーケンスのアンパック |
|
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 命令の形式でインラインキャッシュエントリーが含まれるようになりました。
多くのオペコードは、直後に決まった個数のキャッシュが続くことを前提とし、実行時にはインタープリタにそれらを飛ばさせます。
値を格納したキャッシュは任意の命令に見えることがあるため、高速化用のデータを含む適応型バイトコードを直接読み取ったり変更したりする際は、十分注意する必要があります。
新しいオペコード¶
ジェネレーターやコルーチンで使う
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_* |
数値の二項演算とインプレース演算のオペコードを、すべて単一のオペコードに置き換えました |
|
CALL_FUNCTIONCALL_FUNCTION_KWCALL_METHOD |
メソッド呼び出しの引数の移動と、キーワード引数の処理を切り離し、呼び出しをより適切に特殊化できるようにします |
|
DUP_TOPDUP_TOP_TWOROT_TWOROT_THREEROT_FOURROT_N |
スタックを操作する命令 |
|
JUMP_IF_NOT_EXC_MATCH |
検査だけを行い、ジャンプしなくなりました |
|
JUMP_ABSOLUTEPOP_JUMP_IF_FALSEPOP_JUMP_IF_TRUE |
[3] を参照。
各方向について |
|
SETUP_WITHSETUP_ASYNC_WITH |
|
|
既存の 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
classmethoddescriptors (introduced in bpo-19072) is now deprecated. It can no longer be used to wrap other descriptors such asproperty. The core design of this feature was flawed and caused a number of downstream problems. To "pass-through" aclassmethod, 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 で削除予定の次のモジュールが非推奨になりました。
aifcchunkmsilibpipestelnetlibaudioopcryptnissndhdruucgiimghdrnntplibspwdxdrlibcgitbmailcapossaudiodevsunau(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モジュール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.ImpImporterpkgutil.ImpLoaderpathlib.Path.link_to()sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode()PYTHONTHREADDEBUG環境変数unittestの以下の非推奨エイリアス。非推奨のエイリアス
メソッド名
非推奨となるバージョン
failUnless3.1
failIf3.1
failUnlessEqual3.1
failIfEqual3.1
failUnlessAlmostEqual3.1
failIfAlmostEqual3.1
failUnlessRaises3.1
assert_3.2
assertEquals3.2
assertNotEquals3.2
assertAlmostEquals3.2
assertNotAlmostEquals3.2
assertRegexpMatches3.2
assertRaisesRegexp3.2
assertNotRegexpMatches3.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 の変更¶
新しい機能¶
型の短い名前を取得する
PyType_GetName()関数が追加されました。 (Hai Shi による bpo-42035 での貢献。)型の修飾名を取得する
PyType_GetQualName()関数が追加されました。 (Hai Shi による bpo-42035 での貢献。)Add new
PyThreadState_EnterTracing()andPyThreadState_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 に含まれるようになりました。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>を追加する必要がなくなりました。(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 tof_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 初期化設定 の新しい
PyConfigAPI を使ってください (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_WSTR_LENGTH()_PyUnicode_AsUnicode()PyUnicode_WCHAR_KINDPyUnicode_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を定義している場合、以下は利用できなくなりました。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 を使うようになりました。