What's new in Python 3.14¶
- エディタ:
Adam Turner と Hugo van Kemenade
この記事では Python 3.13 と比較した Python 3.14 の新機能を解説します。Python 3.14 は2025年10月7日にリリースされました。全詳細については 変更履歴 をご覧ください。
参考
PEP 745 -- Python 3.14 リリーススケジュール
概要 -- リリースハイライト¶
Python 3.14 は Python プログラミング言語の安定版リリースで、言語、実装、標準ライブラリにさまざまな変更が加わっています。 主な変更には、テンプレート文字列リテラル、アノテーションの遅延評価、標準ライブラリでの サブインタープリタ のサポートがあります。
ライブラリの変更内容には asyncio のイントロスペクション機能 の重要な改善、 新モジュール compression.zstd による Zstandard のサポート 、 REPL における構文ハイライトが、通常の非推奨化や削除、また利便性と正確性の向上に加えて含まれます。
本記事は、全ての新機能の仕様を網羅的に説明する代わりに、分かりやすく概要を説明するものとなっています。詳細については ライブラリリファレンス や 言語リファレンス などを参照してください。各変更点の実装や設計の理由を網羅的に理解したい方は、該当の PEP を参照してください。ただし、 PEP は機能が実装されたあとは Python の最新バージョンに合わせて更新されないことが多いので注意してください。Python を以前のバージョンからアップグレードする際の注意点は Porting to Python 3.14 を参照してください。
インタプリタの改善:
標準ライブラリーの顕著な改善
デフォルトの対話シェルでのシンタックスハイライト と、いくつかの標準ライブラリの CLI でのカラー出力
C API の改善:
プラットフォームのサポート:
PEP 776: Emscripten が tier 3 として 公式にサポートされるプラットフォーム となりました。
リリースの変更:
新しい機能¶
PEP 649 と PEP 749: アノテーションの遅延評価¶
関数、クラス、モジュールの アノテーション が先行評価されなくなりました。代わりに、アノテーションは専用の annotate 関数 に格納され、必要になったときのみ評価されるようになります (from __future__ import annotations を使用している場合を除く)。
この変更により、Pythonのアノテーションのパフォーマンスと使いやすさがほとんどの状況で向上します。アノテーションを定義することで発生する実行コストはほとんどなくなりましたが、実行中にアノテーションを値として取得することは依然として可能です。また、アノテーションに前方参照が含まれている場合に、クォーテーションで囲って文字列にする必要はなくなりました。
新しく追加された annotationlib モジュールを使うことで、遅延評価となったアノテーションを取得することができます。アノテーションの評価フォーマットとして、 VALUE (以前のPythonバージョンと同様に、アノテーションの実行時の値を評価する) FORWARDREF (未定義の名前を特別なマーカーに置き換える) STRING (アノテーションを文字列として返す) があります。
各フォーマットの挙動は以下の例の通りです:
>>> from annotationlib import get_annotations, Format
>>> def func(arg: Undefined):
... pass
>>> get_annotations(func, format=Format.VALUE)
Traceback (most recent call last):
...
NameError: name 'Undefined' is not defined
>>> get_annotations(func, format=Format.FORWARDREF)
{'arg': ForwardRef('Undefined', owner=<function func at 0x...>)}
>>> get_annotations(func, format=Format.STRING)
{'arg': 'Undefined'}
この変更により既存コードでどのような修正が必要になる可能性があるかを 移植 セクションで説明しています。ただし、ほとんどのコードでは修正は不要です。
(Jelle Zijlstra の貢献による PEP 749 と gh-119180 、 Larry Hastings の貢献による PEP 649 )
PEP 734: 複数インタープリタ機能が標準ライブラリに追加¶
CPython ランタイムでは、同じプロセスの中で複数の Python 環境を実行する機能が20年以上存在します。この各環境は「インタープリタ」といいます。しかしこの機能は C-API 経由でしか利用できませんでした。
Python 3.14 で concurrent.interpreters モジュールが追加されたことにより、この制限がなくなりました。
複数のインタープリタを使うことに大きな利点がある理由として、少なくとも次の二つが挙げられます。
(Python としては新しい) 使いやすい並行実行モデル
マルチコアを活用した真の並列実行
並行実行は、原理的には実行効率が上がったり設計を単純化できる用途がある一方で、非常に単純な並行実行でない限り、人間にとって実装や保守が難しいことが多いです。特に、OSレベルのスレッドを直接使用する場合は (例えば threading)、メモリがすべてのスレッド間で共有されるため、複雑になります。
互いに独立した複数インタープリタを使用することで、 Communicating Sequential Processes (CSP) やアクターモデルといった、他言語 (Smalltalk、Erlang、Haskell、Go など) で成功している並行実行モデルを取り入れることができます。複数インタープリタは、ユーザーが明示的にメモリ共有をするスレッドとみなすことができます。
マルチコアの並列実行については、Python 3.12 で、インタープリタは並列実行できるレベルにお互いに隔離されるようになりました (参照: PEP 684) 。これにより、 GIL の制限がなくなり、様々な CPU バウンドな用途に Python を用いることができるようになります。
複数インタープリタは、デフォルトでメモリ共有がされない点や、隔離された論理的な「プロセス」が並列に動作するという点で、 multiprocessing と類似しています。しかし、複数インタープリタを使うことで、システムのリソースを節約でき、処理効率もあがります (同じプロセスに存在するため) 。スレッドの処理効率とプロセス的な隔離を両立している、と考えられます。
複数インタープリタの機能は何十年も存在していましたが、認知度が低く、標準ライブラリモジュールがないことから、あまり使用されていませんでした。そのため、いくつか大きな制限事項がありますが、メイン機能になったことで今後大きく改善していくと思われます。
現状の制限事項:
インタープリタの起動処理がまだ最適化されていない
インタープリタのメモリ使用量が必要以上に大きい (インタープリタ間で内部リソースをできるだけ共有するよう改善中)
インタープリタ間でオブジェクトなどのデータを真の意味で共有する方法がまだ少ない (
memoryview以外)PyPI 上のサードパーティ拡張モジュールの多くが複数インタープリタに対応していない (標準ライブラリの拡張モジュールはすべて対応)
Python 利用者はまだ複数インタープリタを使ったアプリケーション開発に慣れていない人が多い
今後 CPython がどう改善していくか、インタープリタがどう使われるか、PyPI パッケージでどこまで解決できるようになるかによって、以上の制限事項の影響度合いは変わります。用途によっては、影響は少ないかもしれません。ぜひ使ってみてください!
さらに、今後の CPython のバージョンで、オーバーヘッドは少なくなり、 PyPI パッケージとして実装するには向かない補助機能が追加される予定です。それまでの間、上記の制限事項のほとんどは拡張モジュールを作ることで解消できるので、今の時点で PyPI パッケージによって穴埋めすることもできます。これは 3.14 から 3.12 (インタープリタが隔離が完全になり、 GIL の共有がなくなったバージョン) まで可能です。同様に、インタープリタをさらに抽象化するライブラリも PyPI に現れると予想されます。
拡張モジュールの対応については、一部の PyPI プロジェクトや、Cython、pybind11、nanobind、PyO3などのツールの対応作業が進行中です。どうすれば拡張モジュールを隔離できるかについては、 拡張モジュールを分離する を参照してください。隔離のために必要な作業は、 フリースレッド の対応に必要な作業とかなり重複するため、すでにコミュニティで進められているフリースレッド対応作業により、複数インタープリタの対応も早まると思われます。
他の 3.14 追加要素: concurrent.futures.InterpreterPoolExecutor 。
(Eric Snow の貢献による gh-134939 )
参考
PEP 750: テンプレート文字列リテラル¶
テンプレート文字列とは、カスタムの文字列処理を行うための新しい仕組みです。f-string と構文が類似していますが、f-string が単に str を返すのに対し、テンプレート文字列は、文字列の固定の部分と補間された部分を表すオブジェクトを返します。
t-stringを書くには、プレフィックスとして 'f' の代わりに 't' を使用します:
>>> variety = 'Stilton'
>>> template = t'Try some {variety} cheese!'
>>> type(template)
<class 'string.templatelib.Template'>
Template オブジェクトでは、文字列の固定部分と補間部分 (波括弧で囲まれた部分) に、結合される 前に アクセスできます。
Template インスタンスを反復すると、各部分を順に取得できます。
>>> list(template)
['Try some ', Interpolation('Stilton', 'variety', None, ''), ' cheese!']
Template インスタンスを処理するコードは、簡単に書いたり呼び出したりできます。
例えば、次の関数は固定部分を小文字に、Interpolation インスタンスを大文字にして結果を生成します。
from string.templatelib import Interpolation
def lower_upper(template):
"""固定の箇所は小文字に、interpolationsは大文字に変換する"""
parts = []
for part in template:
if isinstance(part, Interpolation):
parts.append(str(part.value).upper())
else:
parts.append(part.lower())
return ''.join(parts)
name = 'Wenslydale'
template = t'Mister {name}'
assert lower_upper(template) == 'mister WENSLYDALE'
Template インスタンスは、固定文字列と補間部分を実行時に区別できるので、ユーザー入力のサニタイズに役立ちます。
ユーザー入力を HTML 内でエスケープする html() 関数を書く練習は、読者の皆さんにお任せします。
テンプレートの処理コードを工夫すれば、より柔軟に対応できます。
例えば、さらに高度な html() 関数なら、HTML 属性の dict をテンプレート内で直接受け取れます。
attributes = {'src': 'limburger.jpg', 'alt': 'lovely cheese'}
template = t'<img {attributes}>'
assert html(template) == '<img src="limburger.jpg" alt="lovely cheese" />'
もちろん、テンプレートの処理コードは文字列のような結果を返す必要はありません。
さらに 高度な html() なら、DOM のような構造を表す独自の型を返すこともできます。
t-string を使うと、SQL のサニタイズ、安全なシェル操作、ログの改善、Web 開発 (HTML、CSS など) の新しい考え方への対応、軽量な独自の業務用 DSL の実装などを行うシステムを書けます。
(Jim Baker, Guido van Rossum, Paul Everitt, Koudai Aono, Lysandros Nikolaou, Dave Peck, Adam Turner, Jelle Zijlstra, Bénédikt Tran, Pablo Galindo Salgado の貢献による gh-132661 )
参考
PEP 768: 安全な外部デバッガインターフェース¶
Python プロセスを停止したり再起動したりすることなく安全にデバッガやプロファイラを接続できる、オーバーヘッドのないデバッグインターフェースが Python 3.14 で追加されました。これは Python のデバッグ機能を大きく強化するものであり、安全でない手法をとる必要がなくなります。
このインターフェースにより、インタープリタの通常の実行パスに変更を加えることなく、実行のオーバーヘッドを生じさせることもなく、安全にデバッガを接続できるポイントが追加されます。これにより、外部ツールからリアルタイムで Python アプリケーションの状態を取得したり操作できるようになります。これは、安定稼働が必要なシステムや本番環境においては非常に重要な機能です。
利便性のため、このインターフェースは sys.remote_exec() 関数として実装されています。例えば:
import os, sys
from tempfile import NamedTemporaryFile
with NamedTemporaryFile(mode='w', suffix='.py', delete=False) as f:
script_path = f.name
f.write(f'import my_debugger; my_debugger.connect({os.getpid()})')
# Execute in process with PID 1234
print('Behold! An offering:')
sys.remote_exec(1234, script_path)
この関数は、対象プロセスの次の安全な実行ポイントで実行する Python コードを送信できます。 ただし、ツールの作者は PEP の説明に従ってプロトコルを直接実装することもできます。 PEP には、実行中のプロセスに安全に接続するための内部の仕組みが詳しく説明されています。
このデバッグインターフェースはセキュリティを意識して慎重に設計されており、アクセス制御の仕組みがいくつか備わっています:
コマンドラインオプション
-X disable-remote-debugビルド時に本機能を完全に無効化する、configure フラグ
--without-remote-debug
(Pablo Galindo Salgado, Matt Wozniski, Ivona Stojanovic による貢献 gh-131591 )
参考
新しいインタープリタ¶
CPython に新しいインタープリタが追加されました。Python の個々の命令コードを C 言語の長い case 文で実装する代わりに、小さな C 関数に分けて末尾呼び出し (tail call) でお互いを呼び出すようになっています。一部の新しいコンパイラでビルドすれば、このインタープリタのパフォーマンスは以前のインタープリタより大きく改善します。簡易的に pyperformance 標準ベンチマークでテストした結果、プラットフォームやアーキテクチャによっては、相乗平均で 3% から 5% の速度向上がみられました。比較対象は、Clang 19 でビルドした、新しいインタープリタなしの Python 3.14 です。
このインタープリタは現状、Clang 19 以上かつ x86-64 と AArch64 アーキテクチャのみ対応しています。ただ、GCC も今後のバージョンで対応になる見込みです。
この機能は今のところ明示的に有効にする必要があります。
新しいインタープリタを使う場合は、プロファイルに基づく最適化 (PGO) を有効にすることを強く推奨します。
パフォーマンスの改善がテスト、検証されているのは、この構成だけだからです。
詳細は --with-tail-call-interp を参照してください。
注釈
これは Python 関数の 末尾呼び出し最適化 と混同しないでください。 Python 関数の末尾呼び出し最適化は、現在の CPython には実装されていません。
この新しい種類のインタープリタは、CPython インタープリタ内部の実装の詳細です。 Python プログラムの外から見える動作はまったく変わりません。 パフォーマンスが向上する可能性はありますが、それ以外は何も変わりません。
(Ken Jin が gh-128563 で貢献し、Mark Shannon、Garrett Gu、Haoran Xu、Josh Haberman が CPython での実装方法についてアイデアを提供しました。)
フリースレッドモードの改善¶
3.13 で初めて追加された CPython のフリースレッドモード (PEP 703) は、Python 3.14 で大幅に改善されました。 C API の変更を含め、PEP 703 に記載された実装が完成し、インタープリタ内の一時的な回避策は、より恒久的な解決策に置き換わりました。 特殊化を行う適応型インタープリタ (PEP 659) がフリースレッドモードでも有効になり、ほかの多くの最適化とともにパフォーマンスを大幅に改善しています。 フリースレッドモードでシングルスレッドのコードを実行した場合の性能低下は、プラットフォームと使用する C コンパイラによりますが、現在はおよそ 5~10% です。
Python 3.14 から、Windows で CPython のフリースレッドビルド向けに拡張モジュールをコンパイルする際は、ビルドバックエンドがプリプロセッサ変数 Py_GIL_DISABLED を指定する必要があります。
C コンパイラが自動的に判定しなくなるためです。
実行中のインタープリタについて、コンパイル時に使われた設定は sysconfig.get_config_var() で調べられます。
新しい -X context_aware_warnings フラグは、並行処理で安全に使える警告の制御 を有効にするかどうかを制御します。
デフォルト値は、フリースレッドビルドでは真、GIL が有効なビルドでは偽です。
A new thread_inherit_context flag has been added,
which if enabled means that threads created with threading.Thread
start with a copy of the Context() of the caller of
start(). Most significantly, this makes the warning
filtering context established by catch_warnings be
"inherited" by threads (or asyncio tasks) started within that context. It also
affects other modules that use context variables, such as the decimal
context manager.
This flag defaults to true for the free-threaded build and false for
the GIL-enabled build.
(Sam Gross、Matt Page、Neil Schemenauer、Thomas Wouters、Donghee Na、Kirill Podoprigora、Ken Jin、Itamar Oren、Brett Simmers、Dino Viehland、Nathan Goldbaum、Ralf Gommers、Lysandros Nikolaou、Kumar Aditya、Edgar Margffoy をはじめ、多くの方々が貢献しました。 一部の貢献者は Meta に所属しており、同社はこのプロジェクトの支援に多大なエンジニアリングリソースを提供し続けています。)
エラーメッセージの改善¶
インタープリタは、Python のキーワードの入力間違いを検出すると、役立つ候補を提示するようになりました。 Python のキーワードによく似た単語が現れると、エラーメッセージで正しいキーワードを提案します。 この機能により、プログラマはよくある入力間違いをすばやく見つけて修正できます。 例えば、次のようになります。
>>> whille True: ... pass Traceback (most recent call last): File "<stdin>", line 1 whille True: ^^^^^^ SyntaxError: invalid syntax. Did you mean 'while'?
この機能はよくある間違いを中心に対応しているため、綴りの間違い方によっては通常の構文エラーになる場合もあります。 (Pablo Galindo が gh-132449 で貢献しました。)
elseブロックの後にelif文を置くと、専用のエラーメッセージが表示されるようになりました。 (Steele Farnsworth が gh-129902 で貢献しました。)>>> if who == "me": ... print("It's me!") ... else: ... print("It's not me!") ... elif who is None: ... print("Who is it?") File "<stdin>", line 5 elif who is None: ^^^^ SyntaxError: 'elif' block follows an 'else' block
条件式 (Conditional Expressions) の
elseの後に文を書いた場合や、ifの前にpass、break、continueのいずれかを書いた場合、エラーメッセージはexpressionが必要な位置を強調表示するようになりました。 (Sergey Miryanov が gh-129515 で貢献しました。)>>> x = 1 if True else pass Traceback (most recent call last): File "<string>", line 1 x = 1 if True else pass ^^^^ SyntaxError: expected expression after 'else', but statement is given >>> x = continue if True else break Traceback (most recent call last): File "<string>", line 1 x = continue if True else break ^^^^^^^^ SyntaxError: expected expression before 'if', but statement is given
文字列が誤った位置で閉じられていることを検出すると、エラーメッセージは、その部分も文字列の一部として書いたのではないかと指摘するようになりました。 (Pablo Galindo が gh-88535 で貢献しました。)
>>> "The interesting object "The important object" is very important" Traceback (most recent call last): SyntaxError: invalid syntax. Is this intended to be part of the string?
文字列に併用できない接頭辞を付けた場合、エラーにその接頭辞が表示されるようになりました。 (Nikita Sobolev が gh-133197 で貢献しました。)
>>> ub'abc' File "<python-input-0>", line 1 ub'abc' ^^ SyntaxError: 'u' and 'b' prefixes are incompatible
次の構文で
asに不適切なターゲットを指定した場合のエラーメッセージを改善しました。インポート:
import ... as ...from インポート:
from ... import ... as ...例外ハンドラ:
except ... as ...パターンマッチの case:
case ... as ...
ハッシュ可能でない型のインスタンスを
dictのキーやsetの要素として追加しようとした場合のエラーメッセージを改善しました。 (CF Bolz-Tereick と Victor Stinner が gh-132828 で貢献しました。)>>> s = set() >>> s.add({'pages': 12, 'grade': 'A'}) Traceback (most recent call last): File "<python-input-1>", line 1, in <module> s.add({'pages': 12, 'grade': 'A'}) ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: cannot use 'dict' as a set element (unhashable type: 'dict') >>> d = {} >>> l = [1, 2, 3] >>> d[l] = 12 Traceback (most recent call last): File "<python-input-4>", line 1, in <module> d[l] = 12 ~^^^ TypeError: cannot use 'list' as a dict key (unhashable type: 'list')
同期コンテキストマネージャプロトコルをサポートするオブジェクトに対し、
withの代わりにasync withでコンテキストに入ろうとした場合のエラーメッセージを改善しました。 非同期コンテキストマネージャプロトコルで逆の使い方をした場合も同様です。 (Bénédikt Tran が gh-128398 で貢献しました。)
PEP 784: 標準ライブラリでの Zstandard のサポート¶
新しい compression パッケージには、compression.lzma、compression.bz2、compression.gzip、compression.zlib モジュールが含まれます。
これらは、それぞれ lzma、bz2、gzip、zlib モジュールを再エクスポートします。
Python 3.14 から、これらの圧縮モジュールをインポートする際は、compression 配下の新しい名前を使うことを推奨します。
ただし、既存のモジュール名は非推奨にはなっていません。
既存の圧縮モジュールが非推奨になったり削除されたりするのは、早くても 3.14 のリリースから 5 年後です。
新しい compression.zstd モジュールは、Meta の zstd ライブラリ へのバインディングを通して、Zstandard 形式の圧縮・展開 API を提供します。
Zstandard は広く採用されている、高効率で高速な圧縮形式です。
compression.zstd の API に加え、tarfile、zipfile、shutil モジュールでも、Zstandard で圧縮したアーカイブの読み書きをサポートするようになりました。
新しいモジュールでデータを圧縮する例を示します。
from compression import zstd
import math
data = str(math.pi).encode() * 20
compressed = zstd.compress(data)
ratio = len(compressed) / len(data)
print(f"Achieved compression ratio of {ratio}")
このように、API は lzma や bz2 モジュールの API に似ています。
(Emma Harper Smith、Adam Turner、Gregory P. Smith、Tomas Roun、Victor Stinner、Rogdham が gh-132983 で貢献しました。)
参考
asyncio のイントロスペクション機能¶
非同期タスクを使う実行中の Python プロセスを調べる、新しいコマンドラインインターフェースを追加しました。
python -m asyncio ps PID または python -m asyncio pstree PID で利用できます。
ps サブコマンドは指定されたプロセス ID (PID) のプロセスを調べ、現在実行中の asyncio タスクの情報を表示します。
タスクの表として、すべてのタスク、名前、コルーチンのスタック、それらを待機しているタスクを一覧表示します。
pstree サブコマンドは同じ情報を取得しますが、コルーチンの関係を階層的に示す非同期呼び出しツリーとして表示します。
このコマンドは、長時間動作する非同期プログラムや、進行が止まった非同期プログラムのデバッグに特に役立ちます。
プログラムがどこでブロックしているか、どのタスクが未完了か、コルーチンがどうつながっているかをすばやく把握できます。
例えば、次のコードを考えます。
import asyncio
async def play_track(track):
await asyncio.sleep(5)
print(f'🎵 Finished: {track}')
async def play_album(name, tracks):
async with asyncio.TaskGroup() as tg:
for track in tracks:
tg.create_task(play_track(track), name=track)
async def main():
async with asyncio.TaskGroup() as tg:
tg.create_task(
play_album('Sundowning', ['TNDNBTG', 'Levitate']),
name='Sundowning')
tg.create_task(
play_album('TMBTE', ['DYWTYLM', 'Aqua Regia']),
name='TMBTE')
if __name__ == '__main__':
asyncio.run(main())
実行中のプロセスに対して新しいツールを実行すると、次のような表が得られます。
python -m asyncio ps 12345
tid task id task name coroutine stack awaiter chain awaiter name awaiter id
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1935500 0x7fc930c18050 Task-1 TaskGroup._aexit -> TaskGroup.__aexit__ -> main 0x0
1935500 0x7fc930c18230 Sundowning TaskGroup._aexit -> TaskGroup.__aexit__ -> album TaskGroup._aexit -> TaskGroup.__aexit__ -> main Task-1 0x7fc930c18050
1935500 0x7fc93173fa50 TMBTE TaskGroup._aexit -> TaskGroup.__aexit__ -> album TaskGroup._aexit -> TaskGroup.__aexit__ -> main Task-1 0x7fc930c18050
1935500 0x7fc93173fdf0 TNDNBTG sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album Sundowning 0x7fc930c18230
1935500 0x7fc930d32510 Levitate sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album Sundowning 0x7fc930c18230
1935500 0x7fc930d32890 DYWTYLM sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album TMBTE 0x7fc93173fa50
1935500 0x7fc93161ec30 Aqua Regia sleep -> play TaskGroup._aexit -> TaskGroup.__aexit__ -> album TMBTE 0x7fc93173fa50
または、次のようなツリーが得られます。
python -m asyncio pstree 12345
└── (T) Task-1
└── main example.py:13
└── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
└── TaskGroup._aexit Lib/asyncio/taskgroups.py:121
├── (T) Sundowning
│ └── album example.py:8
│ └── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
│ └── TaskGroup._aexit Lib/asyncio/taskgroups.py:121
│ ├── (T) TNDNBTG
│ │ └── play example.py:4
│ │ └── sleep Lib/asyncio/tasks.py:702
│ └── (T) Levitate
│ └── play example.py:4
│ └── sleep Lib/asyncio/tasks.py:702
└── (T) TMBTE
└── album example.py:8
└── TaskGroup.__aexit__ Lib/asyncio/taskgroups.py:72
└── TaskGroup._aexit Lib/asyncio/taskgroups.py:121
├── (T) DYWTYLM
│ └── play example.py:4
│ └── sleep Lib/asyncio/tasks.py:702
└── (T) Aqua Regia
└── play example.py:4
└── sleep Lib/asyncio/tasks.py:702
非同期の待機関係のグラフに循環が見つかった場合 (プログラムの問題を示している可能性があります)、ツールはエラーを出し、ツリーの構築を妨げる循環経路を一覧表示します。
python -m asyncio pstree 12345
ERROR: await-graph contains cycles - cannot print a tree!
cycle: Task-2 → Task-3 → Task-2
(Pablo Galindo、Łukasz Langa、Yury Selivanov、Marta Gomez Macias が gh-91048 で貢献しました。)
並行処理で安全に使える警告の制御¶
warnings.catch_warnings コンテキストマネージャは、警告フィルタにコンテキスト変数を使うよう選択できるようになりました。
-X コマンドラインオプションまたは環境変数で context_aware_warnings フラグを設定すると有効になります。
これにより、複数のスレッドや非同期タスクで catch_warnings を使う場合も、予測可能な形で警告を制御できます。
フラグのデフォルト値は、フリースレッドビルドでは真、GIL が有効なビルドでは偽です。
(Neil Schemenauer と Kumar Aditya が gh-130010 で貢献しました。)
その他の言語の変更¶
Windows で、すべての Windows コードページを 'cpXXX' コーデックとしてサポートするようになりました。 (Serhiy Storchaka が gh-123803 で貢献しました。)
C99 以降の C 規格で定められている、実数と複素数を組み合わせる混合演算の規則を実装しました。 (Sergey B Kirpichev が gh-69639 で貢献しました。)
最適化や
-Oコマンドラインオプションに関係なく、より多くの構文エラーを検出するようになりました。 これには、__debug__への書き込み、awaitの誤用、非同期関数の外での非同期内包表記が含まれます。 例えば、python -O -c 'assert (__debug__ := 1)'やpython -O -c 'assert await 1'はSyntaxErrorになります。 (Irit Katriel と Jelle Zijlstra が gh-122245 と gh-121637 で貢献しました。)C だけで実装された型のサブクラスを作成する際、サブクラスで明示的にオーバーライドしない限り、クラスの作成時に新しい型の C スロットがラッパーに置き換わることはなくなりました。 (Tomasz Pytel が gh-132284 で貢献しました。)
組み込み機能¶
bytes.fromhex()とbytearray.fromhex()メソッドは、ASCII のbytesと バイト列類似オブジェクト を受け付けるようになりました。 (Daniel Pope が gh-129349 で貢献しました。)Add class methods
float.from_number()andcomplex.from_number()to convert a number tofloatorcomplextype correspondingly. They raise aTypeErrorif the argument is not a real number. (Contributed by Serhiy Storchaka in gh-84978.)(
format()や f-strings を使う) 新しい形式の文字列書式化で、浮動小数点数の表示型について、小数部分でもアンダースコアとカンマによる 3 桁区切りをサポートするようになりました。 (Sergey B Kirpichev が gh-87790 で貢献しました。)int()関数は__trunc__()に処理を委譲しなくなりました。int()への変換をサポートするクラスは、__int__()または__index__()を実装する必要があります。 (Mark Dickinson が gh-119743 で貢献しました。)map()関数に、zip()と同様の省略可能なキーワード専用フラグstrictが追加されました。 すべてのイテラブルの長さが等しいことを確認できます。 (Wannes Boeykens が gh-119793 で貢献しました。)memoryview型は添字指定をサポートし、ジェネリック型 になりました。 (Brian Schubert が gh-126012 で貢献しました。)NotImplementedを真偽値の文脈で使うと、TypeErrorが発生するようになりました。 この使い方は Python 3.9 からDeprecationWarningの対象でした。 (Jelle Zijlstra が gh-118767 で貢献しました。)引数を三つ渡した
pow()でも、必要に応じて__rpow__()の呼び出しを試みるようになりました。 以前は、引数二つのpow()と二項の累乗演算子でしか呼び出されませんでした。 (Serhiy Storchaka が gh-130104 で貢献しました。)superオブジェクトがコピーとpickle 化に対応しました。 (Serhiy Storchaka が gh-125767 で貢献しました。)
コマンドラインと環境¶
インポート時間を表示するフラグは、新しい
-X importtime=2により、すでに読み込まれた (キャッシュ済みの) モジュールも追跡できるようになりました。 そのようなモジュールをインポートすると、selfとcumulativeの時間の代わりに文字列cachedを表示します。-X importtimeの2より大きい値は、将来の使用のために予約されました。(Noah Kim と Adam Turner が gh-118655 で貢献しました。)
コマンドラインオプション
-cは、コード引数の共通のインデントを実行前に自動的に取り除くようになりました。 (Jon Crall と Steven Sun が gh-103998 で貢献しました。)-Jは Jython 用に予約されたフラグではなくなり、特別な意味を持たなくなりました。 (Adam Turner が gh-133336 で貢献しました。)
PEP 758: except と except* の式の括弧を省略可能に¶
except と except* の式で、複数の例外型を指定し、as 節を使わない場合は、括弧を省略できるようになりました。
例えば、次のように書けます。
try:
connect_to_server()
except TimeoutError, ConnectionRefusedError:
print('The network has ceased to be!')
(Pablo Galindo と Brett Cannon が PEP 758 と gh-131831 で貢献しました。)
PEP 765: finally ブロック内の制御フロー¶
return、break、continue 文によって finally ブロックを抜ける場合、コンパイラは SyntaxWarning を出すようになりました。
この変更は PEP 765 で定められています。
この変更が不便な場合 (コードの lint を行っているため警告が重複する場合など) は、警告フィルタ に ignore::SyntaxWarning を追加すると、構文の警告をすべて無効にできます。
ほかの警告をエラーに変えるフィルタと組み合わせて指定することもできます。
例えば、CLI オプションに -Werror -Wignore::SyntaxWarning を渡すか、PYTHONWARNINGS=error,ignore::SyntaxWarning を設定します。
実行時に warnings モジュールでこのようなフィルタを適用しても、警告が抑制されるのはフィルタ変更 後に コンパイルされるコードだけです。
例えばモジュールのインポート時など、フィルタ変更前にコンパイルされたコードでは、構文の警告は引き続き出ます。
(Irit Katriel が gh-130080 で貢献しました。)
ガベージコレクション¶
Python 3.14.5 以降:
ガベージコレクタ (GC) は Python 3.14.5 で変更されました。
Python 3.14.0~3.14.4 には、新しいインクリメンタル GC が搭載されていました。 しかし、本番環境でメモリの圧迫が深刻になるという 報告 が複数寄せられたため、3.13 の世代別 GC に戻されました。 Python 3.14.5 以降で使われるのは、この GC です。
以前の Python 3.14.0~3.14.4:
循環ガベージコレクタがインクリメンタルになりました。 これにより、大きなヒープでの最大停止時間は 10 分の 1 以下になります。
世代は若い世代と古い世代の二つだけになりました。
gc.collect() を直接呼び出さない場合、GC の実行頻度は少し低くなります。
実行時には、一つ以上の世代をまとめて回収する代わりに、若い世代と古い世代の一部分を回収します。
gc.collect() の動作は少し変わります。
gc.collect(1): 第 1 世代の回収ではなく、インクリメンタルなガベージコレクションを 1 回進めます。gc.collect()のほかの呼び出しに変更はありません。
(Mark Shannon が gh-108362 で貢献しました。)
デフォルトの対話シェル¶
デフォルトの 対話 シェルが Python の構文を強調表示するようになりました。
PYTHON_BASIC_REPLなど、色を無効にする環境変数が設定されていない限り、デフォルトで有効です。 詳細は 色の制御 を参照してください。構文強調表示のデフォルトの配色は、見やすいコントラストを目指し、互換性を最大限に保つため 4 ビット VGA 標準の ANSI カラーコードだけを使います。 実験的な API
_colorize.set_theme()で配色をカスタマイズできます。 対話的に呼び出すことも、PYTHONSTARTUPスクリプト内で呼び出すこともできます。 この関数の安定性は保証されず、変更や削除が行われる可能性があることに注意してください。(Łukasz Langa が gh-131507 で貢献しました。)
デフォルトの 対話 シェルがインポートの自動補完をサポートするようになりました。
import coと入力して <Tab> を押すと、coで始まるモジュールが候補に表示されます。 同様に、from concurrent import iと入力すると、iで始まるconcurrentのサブモジュールが候補に表示されます。 現時点ではモジュールの属性の自動補完には対応していません。 (Tomas Roun が gh-69605 で貢献しました。)
新しいモジュール¶
annotationlib: アノテーション を調べるためのモジュールです。 詳細は PEP 749 を参照してください。 (Jelle Zijlstra が gh-119180 で貢献しました。)compression(compression.zstdを含む): Zstandard 圧縮形式をサポートする新しいモジュールなど、圧縮関連のモジュールをまとめたパッケージです。 詳細は PEP 784 を参照してください。 (Emma Harper Smith、Adam Turner、Gregory P. Smith、Tomas Roun、Victor Stinner、Rogdham が gh-132983 で貢献しました。)concurrent.interpreters: 標準ライブラリで複数のインタープリタをサポートします。 詳細は PEP 734 を参照してください。 (Eric Snow が gh-134939 で貢献しました。)string.templatelib: テンプレート文字列リテラル (t-string) をサポートします。 詳細は PEP 750 を参照してください。 (Jim Baker、Guido van Rossum、Paul Everitt、Koudai Aono、Lysandros Nikolaou、Dave Peck、Adam Turner、Jelle Zijlstra、Bénédikt Tran、Pablo Galindo Salgado が gh-132661 で貢献しました。)
改善されたモジュール¶
argparse¶
argparse.ArgumentParserの プログラム名 のデフォルト値は、Python インタープリタが__main__モジュールのコードをどのように探すよう指定されたかを反映するようになりました。 (Serhiy Storchaka と Alyssa Coghlan が gh-66436 で貢献しました。)argparse.ArgumentParserに、省略可能なsuggest_on_errorパラメータを導入しました。 ユーザーが入力を間違えた場合に、引数の選択肢やサブパーサー名の候補を提示できます。 (Savannah Ostrowski が gh-124456 で貢献しました。)ヘルプテキストの色付けが有効になりました。
argparse.ArgumentParserの省略可能なcolorパラメータで無効にできます。 環境変数 でも制御できます。 (Hugo van Kemenade が gh-130645 で貢献しました。)
ast¶
二つの AST を比較する
compare()関数を追加しました。 (Batuhan Taskaya and Jeremy Hylton が gh-60191 で貢献しました。)AST ノードで
copy.replace()をサポートするようになりました。 (Bénédikt Tran が gh-121141 で貢献しました。)最適化レベル 2 では、最適化された AST からドキュメント文字列を削除するようになりました。 (Irit Katriel が gh-123958 で貢献しました。)
AST ノードの
repr()結果に、より多くの情報を含めるようになりました。 (Tomas Roun が gh-116022 で貢献しました。)AST を入力として呼び出した場合、
parse()関数はルートノードの型が適切かどうかを常に検証するようになりました。 (Irit Katriel が gh-130139 で貢献しました。)コマンドラインインターフェースに、
--feature-version、--optimize、--show-emptyオプションを追加しました。 (Semyon Moroz が gh-133367 で貢献しました。)
asyncio¶
create_task()という名前の関数とメソッドが、任意のキーワード引数を受け取るようになりました。 すべてのキーワード引数はTaskコンストラクタまたは独自のタスクファクトリに渡されます (詳細はset_task_factory()を参照)。nameとcontextキーワード引数は、特別扱いされなくなりました。 名前はファクトリのnameキーワード引数で設定する必要があり、contextにはNoneを指定できます。この変更は、
asyncio.create_task()、asyncio.loop.create_task()、asyncio.TaskGroup.create_task()に影響します。(Thomas Grainger が gh-128307 で貢献しました。)
プログラムの呼び出しグラフを調べたり表示したりする二つのユーティリティ関数、
capture_call_graph()とprint_call_graph()が追加されました。 詳細は asyncio のイントロスペクション機能 を参照してください。 (Yury Selivanov, Pablo Galindo Salgado, and Łukasz Langa が gh-91048 で貢献しました。)
calendar¶
concurrent.futures¶
新しい executor クラス
InterpreterPoolExecutorを追加しました。 同じプロセス内の複数の Python インタープリタ (「サブインタープリタ」) を Python コードから利用できます。 独立した Python インタープリタのプールを使い、呼び出しを非同期に実行します。これは、PEP 734 で導入された新しい
interpretersモジュールとは別のものです。 (Eric Snow が gh-124548 で貢献しました。)
macOS 以外の Unix プラットフォームでは、
ProcessPoolExecutorのデフォルトの 開始方式 が、fork から forkserver に変わりました。 Windows と macOS には影響せず、これらでは引き続き spawn がデフォルトの開始方式です。スレッドとの併用に適さない fork 方式が必要な場合は、
ProcessPoolExecutorに multiprocessing コンテキストmp_contextを渡して、明示的に指定する必要があります。fork 方式との違い、ミュータブルな共有グローバル変数や、自動的に
pickle 化できない共有オブジェクトを使う既存コードへの影響については、forkserver の制限 を参照してください。(Gregory P. Smith が gh-84559 で貢献しました。)
ProcessPoolExecutorに、terminate_workers()とkill_workers()という二つのメソッドを追加しました。 指定したプールで生存しているワーカープロセスをすべて終了、または強制終了できます。 (Charles Machalow が gh-130849 で貢献しました。)Executor.mapに、省略可能なbuffersizeパラメータを追加しました。 投入済みで、まだ結果を返していないタスクの数を制限できます。 バッファがいっぱいの場合、バッファから結果を返すまでiterablesの反復を一時停止します。 (Enzo Bonnal and Josh Rosenberg が gh-74028 で貢献しました。)
configparser¶
セキュリティ向上のため、
configparserは自分で読み取れない設定ファイルを書き込まなくなりました。 区切り文字を含むキーや、セクションヘッダのパターンで始まるキーをwrite()で書き込もうとすると、InvalidWriteErrorが発生します。 (Jacob Lincoln が gh-129270 で貢献しました。)
contextvars¶
Tokenオブジェクトが コンテキストマネージャ プロトコルをサポートするようになりました。 (Andrew Svetlov が gh-129889 で貢献しました。)
ctypes¶
StructureとUnionオブジェクトの ビットフィールド のレイアウトが、プラットフォームのデフォルト (GCC/Clang または MSVC) により近いものになりました。 特に、フィールドが重なり合わなくなりました。 (Matthias Görgens が gh-97702 で貢献しました。)Structure._layout_クラス属性を設定し、デフォルト以外の ABI にレイアウトを合わせやすくなりました。 (Petr Viktorin が gh-97702 で貢献しました。)StructureとUnionのフィールドデスクリプタのクラスを、CFieldとして利用できるようになりました。 また、デバッグやイントロスペクションに役立つ新しい属性が追加されました。 (Petr Viktorin が gh-128715 で貢献しました。)Windows の
COMError例外が公開されました。 (Jun Komoda が gh-126686 で貢献しました。)Windows の
CopyComPointer()関数が公開されました。 (Jun Komoda が gh-127275 で貢献しました。)指定されたポインタと長さの領域を参照する
memoryviewオブジェクトを作成するmemoryview_at()関数を追加しました。 バッファのコピーを行わない点を除いてctypes.string_at()と同様に動作します。 サイズが動的に決まるバッファを受け取るコールバック関数を Python だけで実装する場合などに役立ちます。 (Rian Hunter が gh-112018 で貢献しました。)コンパイラと
libffiライブラリの両方が C の複素数型をサポートする場合に、複素数型c_float_complex、c_double_complex、c_longdouble_complexを利用できるようになりました。 (Sergey B Kirpichev が gh-61103 で貢献しました。)現在のプロセスが読み込んだ共有ライブラリを一覧にする
ctypes.util.dllist()を追加しました。 (Brian Ward が gh-119349 で貢献しました。)ctypes.POINTER()の型のキャッシュを、グローバルな内部キャッシュ (_pointer_type_cache) から、対応するctypesの型の_CData.__pointer_type__属性に移しました。 これにより、特定の状況でキャッシュが際限なく増え続けるのを防ぎます。 (Sergey Miryanov が gh-100926 で貢献しました。)py_object型は添字指定をサポートし、ジェネリック型 になりました。 (Brian Schubert が gh-132168 で貢献しました。)ctypesが フリースレッドビルド をサポートするようになりました。 (Kumar Aditya and Peter Bierma が gh-127945 で貢献しました。)
curses¶
色ペア
0を変更できるようにuse_default_colors()関数を拡張した、assume_default_colors()関数を追加しました。 (Serhiy Storchaka が gh-133139 で貢献しました。)
datetime¶
datetime.dateとdatetime.timeクラスにstrptime()メソッドを追加しました。 (Wannes Boeykens が gh-41431 で貢献しました。)
decimal¶
Decimalの代替コンストラクタとしてDecimal.from_number()を追加しました。 (Serhiy Storchaka が gh-121798 で貢献しました。)IEEE 754 (2008) の十進数交換形式に対応したコンテキストを作成できるように、
IEEEContext()を公開しました。 (Sergey B Kirpichev が gh-53032 で貢献しました。)
difflib¶
dis¶
行番号だけでなく、
命令のソース上の位置情報をすべて表示できるようになりました。 次のインターフェースにshow_positionsキーワード引数として追加されています。この機能は
dis --show-positionsからも利用できます。 (Bénédikt Tran が gh-123165 で貢献しました。)特殊化されたバイトコードを表示する
dis --specializedコマンドラインオプションを追加しました。 (Bénédikt Tran が gh-127413 で貢献しました。)
errno¶
faulthandler¶
対応するシステム で C のスタックトレースを表示できるようになりました。 新しい
dump_c_stack()関数、またはfaulthandler.enable()のc_stack引数で利用できます。 (Peter Bierma が gh-127604 で貢献しました。)
fnmatch¶
指定されたパターンに一致する名前を除外する
filterfalse()関数を追加しました。 (Bénédikt Tran が gh-74598 で貢献しました。)
fractions¶
as_integer_ratio()メソッドを持つ任意のオブジェクトから、Fractionオブジェクトを構築できるようになりました。 (Serhiy Storchaka が gh-82017 で貢献しました。)Fractionの代替コンストラクタとしてFraction.from_number()を追加しました。 (Serhiy Storchaka が gh-121797 で貢献しました。)
functools¶
番兵値
Placeholderを追加しました。partial()またはpartialmethod()関数で、返される partial オブジェクト 内に、後から渡す位置引数の場所を確保するために使えます。 (Dominykas Grigonis が gh-119127 で貢献しました。)reduce()のinitialパラメータをキーワード引数として渡せるようになりました。 (Sayandip Dutta が gh-125916 で貢献しました。)
getopt¶
getpass¶
graphlib¶
ソートを開始していない限り、
TopologicalSorter.prepare()を複数回呼び出せるようになりました。 (Daniel Pope が gh-130914 で貢献しました。)
heapq¶
heapqモジュールは、次の新しい関数により最大ヒープのサポートを強化しました。
hmac¶
http¶
http.serverモジュールが生成するディレクトリ一覧とエラーページで、ブラウザのデフォルトのダークモードを適用できるようになりました。 (Yorik Hansen が gh-123430 で貢献しました。)http.serverモジュールが、http.server.HTTPSServerクラスによる HTTPS での配信をサポートするようになりました。 コマンドラインインターフェース (python -m http.server) からは、次のオプションで利用できます。--tls-cert <path>: TLS 証明書ファイルへのパス。--tls-key <path>: 秘密鍵ファイルへのパス (省略可能)。--tls-password-file <path>: 秘密鍵のパスワードファイルへのパス (省略可能)。
(Semyon Moroz が gh-85162 で貢献しました。)
imaplib¶
RFC 2177 で定義された IMAP4 の
IDLEコマンドを実装するIMAP4.idle()を追加しました。 (Forest が gh-55454 で貢献しました。)
inspect¶
signature()に、アノテーションの表現に使うannotationlib.Formatを制御する新しい引数annotation_formatを追加しました。 (Jelle Zijlstra が gh-101552 で貢献しました。)Signature.format()に、新しい引数unquote_annotationsを追加しました。 真の場合、文字列の アノテーション を引用符で囲まずに表示します。 (Jelle Zijlstra が gh-101552 で貢献しました。)オブジェクトが パッケージ かどうかを判定する
ispackage()関数を追加しました。 (Zhikang Yan が gh-125634 で貢献しました。)
io¶
readで非ブロッキングストリームからテキストを読み取る際、すぐにバイト列を返せない場合はBlockingIOErrorが発生することがあるようになりました。 (Giovanni Siragusa が gh-109523 で貢献しました。)疑似プロトコル
typing.IO、typing.TextIO、typing.BinaryIOに代わる、より単純なプロトコルとしてReaderとWriterを追加しました。 (Sebastian Rittau が gh-127648 で貢献しました。)
json¶
JSON のシリアライズエラーに、エラーの発生箇所を特定するための例外の注記を追加しました。 (Serhiy Storchaka が gh-122163 で貢献しました。)
-mスイッチでjsonモジュールをスクリプトとして実行できるようになりました (python -m json)。 ソフト非推奨 となった python -m json.tool よりも、この方法を推奨します。 JSON コマンドラインインターフェース のドキュメントを参照してください。 (Trey Hunner が gh-122873 で貢献しました。)JSON コマンドラインインターフェース の出力が、デフォルトで色付きで強調表示されるようになりました。 これは 環境変数 で制御できます。 (Tomas Roun が gh-131952 で貢献しました。)
linecache¶
logging.handlers¶
QueueListenerオブジェクトが コンテキストマネージャ プロトコルをサポートするようになりました。 (Charles Machalow が gh-132106 で貢献しました。)すでにリスナーが開始されている場合、
QueueListener.startはRuntimeErrorを送出するようになりました。 (Charles Machalow が gh-132106 で貢献しました。)
math¶
このモジュールの定義域エラーについて、より詳しいエラーメッセージを追加しました。 (Charlie Zhao and Sergey B Kirpichev が gh-101410 で貢献しました。)
mimetypes¶
python -m mimetypes で起動する、公開の コマンドラインインターフェース を追加しました。 (Oleg Iarygin and Hugo van Kemenade が gh-93096 で貢献しました。)
RFC や一般的な用法に基づいて、いくつかの MIME タイプを追加しました。
Microsoft と RFC 8081 のフォント用 MIME タイプ
Embedded OpenType:
application/vnd.ms-fontobjectOpenType Layout (OTF)
font/otfTrueType:
font/ttfWOFF 1.0
font/woffWOFF 2.0
font/woff2
RFC 9559 の Matroska 音声・映像データのコンテナ構造用 MIME タイプ
映像を含まない音声:
audio/matroska(.mka)映像:
video/matroska(.mkv)立体映像:
video/matroska-3d(.mk3d)
RFC で定義された画像形式
RFC 1494: CCITT Group 3 (
.g3)RFC 3362: リアルタイムファクシミリ、T.38 (
.t38)RFC 3745: JPEG 2000 (
.jp2)、拡張形式 (.jpx)、複合形式 (.jpm)RFC 3950: Tag Image File Format Fax eXtended, TIFF-FX (
.tfx)RFC 4047: Flexible Image Transport System (
.fits)RFC 7903: 拡張メタファイル (
.emf) と Windows メタファイル (.wmf)
その他の MIME タイプの追加と変更
RFC 2361:
.aviの型をvideo/vnd.aviに、.wavの型をaudio/vnd.waveに変更RFC 4337: MPEG-4
audio/mp4(.m4a) を追加RFC 5334: Ogg メディア (
.oga、.ogg、.ogx) を追加RFC 6713: gzip
application/gzip(.gz) を追加RFC 9639: FLAC
audio/flac(.flac) を追加YAML ファイル (
.yamlと.yml) 用の RFC 9512 の MIME タイプapplication/yaml7z
application/x-7z-compressed(.7z) を追加厳密なモードでない場合に、Android Package
application/vnd.android.package-archive(.apk) を追加deb
application/x-debian-package(.deb) を追加glTF binary
model/gltf-binary(.glb) を追加glTF JSON/ASCII
model/gltf+json(.gltf) を追加M4V
video/x-m4v(.m4v) を追加PHP
application/x-httpd-php(.php) を追加RAR
application/vnd.rar(.rar) を追加RPM
application/x-rpm(.rpm) を追加STL
model/stl(.stl) を追加Windows Media Video
video/x-ms-wmv(.wmv) を追加事実上の標準: WebM
audio/webm(.weba) を追加ECMA-376:
.docx、.pptx、.xlsxの型を追加OASIS: OpenDocument の
.odg、.odp、.ods、.odtの型を追加W3C: EPUB
application/epub+zip(.epub) を追加
(Sahil Prajapati と Hugo van Kemenade が gh-84852 で、Sasha "Nelie" Chernykh と Hugo van Kemenade が gh-132056 で、Hugo van Kemenade が gh-89416、gh-85957、gh-129965 で貢献しました。)
multiprocessing¶
macOS 以外の Unix プラットフォームでは、デフォルトの 開始方式 が、fork から forkserver に変わりました。 Windows と macOS には影響せず、これらでは引き続き spawn がデフォルトの開始方式です。
スレッドとの併用に適さない fork 方式が必要な場合は、
get_context()のコンテキストで明示的に指定するか (推奨)、set_start_method()でデフォルトを変更する必要があります。fork 方式との違い、ミュータブルな共有グローバル変数や、自動的に
pickle 化できない共有オブジェクトを使う既存コードへの影響については、forkserver の制限 を参照してください。(Gregory P. Smith が gh-84559 で貢献しました。)
multiprocessingのforkserver開始方式は、制御用ソケットで認証を行うようになりました。 これにより、forkserver にワーカーの生成やコードの実行を要求できる他のプロセスを制限する際に、ファイルシステムのアクセス権だけに依存しなくなりました。 (Gregory P. Smith が gh-97514 で貢献しました。)list と dict 型の multiprocessing プロキシオブジェクト に、これまで見落とされていたメソッドを追加しました。
listのプロキシにclear()とcopy()dictのプロキシにfromkeys()、reversed(d)、d | {}、{} | d、d |= {'b': 2}
(Roy Hyunjin Han が gh-103134 で貢献しました。)
SyncManager.set()を通して、共有のsetオブジェクトをサポートするようになりました。Manager()で作成したマネージャでset()を利用できるようになりました。 (Mingyu Park が gh-129949 で貢献しました。)multiprocessing.Processオブジェクトにinterrupt()を追加しました。SIGINTを送信して子プロセスを終了させます。 これにより、finally節で終了したプロセスのスタックトレースを表示できるようになります。 (Artem Pulkin が gh-131913 で貢献しました。)
operator¶
is_none()とis_not_none()という一組の関数を追加しました。operator.is_none(obj)はobj is Noneと、operator.is_not_none(obj)はobj is not Noneと同じ意味になります。 (Raymond Hettinger and Nico Mexis が gh-115808 で貢献しました。)
os¶
reload_environ()関数を追加しました。os.putenv()、os.unsetenv()、または同じプロセス内で Python の外から行った環境の変更を、os.environとos.environbに反映できます。 (Victor Stinner が gh-120057 で貢献しました。)osモジュールにSCHED_DEADLINEとSCHED_NORMAL定数を追加しました。 (James Roy が gh-127688 で貢献しました。)ファイル記述子から バッファオブジェクト に読み込む
readinto()関数を追加しました。 (Cody Maloney が gh-129205 で貢献しました。)
os.path¶
realpath()のstrictパラメータが、新しい値ALLOW_MISSINGを受け付けるようになりました。 この値を使うと、FileNotFoundError以外のエラーは再送出されます。 結果のパスは存在しない場合がありますが、シンボリックリンクは含まなくなります。 (Petr Viktorin が CVE 2025-4517 に対応して貢献しました。)
pathlib¶
pathlib.Pathに、ファイルやディレクトリを再帰的にコピー、移動するメソッドを追加しました。copy()は、指定先にファイルやディレクトリツリーをコピーします。copy_into()は、指定先ディレクトリの 中に コピーします。move()は、指定先にファイルやディレクトリツリーを移動します。move_into()は、指定先ディレクトリの 中に 移動します。
(Barney Gale が gh-73991 で貢献しました。)
info属性を追加しました。 新しいpathlib.types.PathInfoプロトコルを実装するオブジェクトを格納します。 このオブジェクトでファイルの種類を調べることができ、stat()の結果は内部でキャッシュされます。iterdir()が生成するパスオブジェクトは、親ディレクトリの走査から得られたファイルの種類の情報で初期化されます。 (Barney Gale が gh-125413 で貢献しました。)
pdb¶
pdbモジュールが、新しい-p PIDコマンドラインオプションを使って、実行中の Python プロセスに外部から接続できるようになりました。python -m pdb -p 1234
指定された PID の Python プロセスに接続し、対話的にデバッグできるようにします。 ただし、Python インタープリタの仕組み上、接続先プロセスがシステムコールや I/O 待ちでブロックしている場合、接続が有効になるのは次のバイトコード命令が実行されるか、プロセスがシグナルを受信したときだけです。
この機能は PEP 768 と新しい
sys.remote_exec()関数を使って、対象プロセスに接続し、PDB コマンドを送信します。(Matt Wozniski と Pablo Galindo が gh-131591 で貢献しました。)
コード内に直接記述したブレークポイント (
breakpoint()とset_trace()) は、毎回新しいインスタンスを作成する代わりに、最後にset_trace()を呼び出したPdbインスタンスを再利用するようになりました。 これにより、displayやcommandsなどのインスタンス固有のデータが、コード内のブレークポイント間で保持されます。 (Tian Gao が gh-121450 で貢献しました。)pdb.Pdbに新しい引数modeを追加しました。pdbがinlineモードの場合、restartコマンドを無効にしました。 (Tian Gao が gh-123757 で貢献しました。)inlineモードでpdbを終了しようとすると、確認プロンプトが表示されるようになりました。y、Y、<Enter>、EOFで終了を確定すると、bdb.BdbQuitを送出する代わりにsys.exit()を呼び出します。 (Tian Gao が gh-124704 で貢献しました。)breakpoint()やpdb.set_trace()のようなインラインのブレークポイントは、skipパターンがあっても無視し、必ず呼び出し元のフレームでプログラムを停止するようになりました。 (Tian Gao が gh-130493 で貢献しました。)pdbの複数行入力で行頭の<tab>を押すと、\t文字を挿入する代わりに、空白 4 個のインデントを挿入するようになりました。 (Tian Gao が gh-130471 で貢献しました。)pdbの複数行入力に自動インデントを導入しました。 前の行のインデントを維持するか、新しいコードブロックを検出した場合は空白 4 個のインデントを挿入します。 (Tian Gao が gh-133350 で貢献しました。)現在の asyncio タスクがある場合にアクセスするための
$_asynctaskを追加しました。 (Tian Gao が gh-124367 で貢献しました。)asyncio コルーチンのデバッグをサポートする
pdb.set_trace_async()を追加しました。 この関数ではawait文を使えます。 (Tian Gao が gh-132576 で貢献しました。)pdbに表示されるソースコードが、構文に応じて強調表示されるようになりました。pdb.Pdbに新しく追加したcolorize引数に加えて、デフォルトの 対話 シェルと同じ方法でもこの機能を制御できます。 (Tian Gao and Łukasz Langa が gh-133355 で貢献しました。)
pickle¶
pickleモジュールのデフォルトのプロトコルバージョンを 5 にしました。 詳細は pickle プロトコル を参照してください。pickle のシリアライズエラーに、エラーの発生箇所を特定するための例外の注記を追加しました。 (Serhiy Storchaka が gh-122213 で貢献しました。)
platform¶
platformモジュールのキャッシュされた結果を無効にするinvalidate_caches()関数を追加しました。 (Bénédikt Tran が gh-122549 で貢献しました。)
pydoc¶
re¶
socket¶
Bluetooth ソケットのサポートを改善し、不具合を修正しました。
NetBSD と DragonFly BSD での Bluetooth ソケットのサポートを修正しました。 (Serhiy Storchaka が gh-132429 で貢献しました。)
FreeBSD での
BTPROTO_HCIのサポートを修正しました。 (Victor Stinner が gh-111178 で貢献しました。)FreeBSD で
BTPROTO_SCOをサポートするようになりました。 (Serhiy Storchaka が gh-85302 で貢献しました。)FreeBSD の
BTPROTO_L2CAPのアドレスで、cidとbdaddr_typeをサポートするようになりました。 (Serhiy Storchaka が gh-132429 で貢献しました。)Linux の
BTPROTO_HCIのアドレスで、channelをサポートするようになりました。 (Serhiy Storchaka が gh-70145 で貢献しました。)Linux の
BTPROTO_HCIのアドレスとして整数を受け付けるようになりました。 (Serhiy Storchaka が gh-132099 で貢献しました。)BTPROTO_L2CAPのgetsockname()で、cidを返すようになりました。 (Serhiy Storchaka が gh-132429 で貢献しました。)多数の新しい定数を追加しました。 (Serhiy Storchaka が gh-132734 で貢献しました。)
ssl¶
struct¶
symtable¶
sys¶
特殊な構成の Python ビルドにだけ存在する、これまでドキュメント化されていなかった特殊関数
sys.getobjects()が、呼び出し元とは別のインタープリタのオブジェクトを返す場合もあるようになりました。 (Eric Snow が gh-125286 で貢献しました。)オブジェクトが 不死 かどうかを判定する
sys._is_immortal()を追加しました。 (Peter Bierma が gh-128509 で貢献しました。)FreeBSD の
sys.platformは、メジャーバージョン番号を含まなくなりました。'freebsd13'や'freebsd14'ではなく、常に'freebsd'になります。 (Michael Osipov が gh-129393 で貢献しました。)sys._clear_type_cache()がDeprecationWarningを出すようになりました。 この関数は Python 3.13 で非推奨になりましたが、実行時の警告は出していませんでした。新しい外部デバッガインターフェースを実装する
sys.remote_exec()を追加しました。 詳細は PEP 768 を参照してください。 (Pablo Galindo Salgado, Matt Wozniski, and Ivona Stojanovic が gh-131591 で貢献しました。)ジャストインタイムコンパイルの状態を調べるためのユーティリティを含む、
sys._jit名前空間を追加しました。 (Brandt Bucher が gh-133231 で貢献しました。)
sys.monitoring¶
二つの新しい監視イベント、
BRANCH_LEFTとBRANCH_RIGHTを追加しました。 これらはBRANCHイベントに取って代わり、従来のイベントは非推奨になりました。 (Mark Shannon が gh-122548 で貢献しました。)ツール識別子に関連付けられたすべてのイベントとコールバック関数の登録を解除する
sys.monitoring.clear_tool_id()を追加しました。sys.monitoring.free_tool_id()は、イベントとコールバックを登録したままにするのではなく、ツール識別子を解放する前にこの関数を呼び出すようになりました。 (Tian Gao が gh-116750 で貢献しました。)
sysconfig¶
Windows の
get_config_vars()にABIFLAGSキーを追加しました。 (Xuehai Pan が gh-131799 で貢献しました。)
tarfile¶
パストラバーサル攻撃を防ぐため、
data_filter()はシンボリックリンクのリンク先を正規化するようになりました。 (Petr Viktorin が gh-127987 and CVE 2025-4138 で貢献しました。)ディレクトリが削除されたか、別の種類のファイルに置き換えられている場合、
extractall()はそのディレクトリの属性の調整をスキップするようになりました。 (Petr Viktorin が gh-127987 and CVE 2024-12718 で貢献しました。)extract()andextractall()now (re-)apply the extraction filter when substituting a link (hard or symbolic) with a copy of another archive member, and when fixing up directory attributes. The former raises a new exception,LinkFallbackError. (Contributed by Petr Viktorin for CVE 2025-4330 and CVE 2024-12718.)extract()とextractall()は、errorlevel()がゼロでも、拒否されたメンバを展開しなくなりました。 (Matt Prodani and Petr Viktorin が gh-112887 and CVE 2025-4435 で貢献しました。)
threading¶
threading.Thread.start()は、OS 上のスレッド名をthreading.Thread.nameに設定するようになりました。 (Victor Stinner が gh-59705 で貢献しました。)
tkinter¶
turtle¶
turtle.fill()、turtle.poly()、turtle.no_animation()のコンテキストマネージャを追加しました。 (Marie Roald and Yngve Mardal Moe が gh-126350 で貢献しました。)
types¶
types.UnionTypeはtyping.Unionの別名になりました。 詳細は 後述の説明 を参照してください。 (Jelle Zijlstra が gh-105499 で貢献しました。)
typing¶
types.UnionTypeとtyping.Unionは、互いに同じ型を表す別名になりました。 そのため、旧式のユニオン (Union[int, str]で作成) と新しい形式のユニオン (int | str) は、同じ実行時の型のインスタンスを作成します。 これにより二つの構文の動作が統一されますが、実行時に型を調べるユーザーに影響し得る、いくつかの動作の違いが生じます。ユニオンを作成するどちらの構文も、
repr()で同じ文字列を返すようになりました。 例えば、repr(Union[int, str])は"typing.Union[int, str]"ではなく"int | str"になります。旧式の構文で作成したユニオンは、キャッシュされなくなりました。 以前は
Union[int, str]を複数回評価すると同じオブジェクトを返していました (Union[int, str] is Union[int, str]はTrueでした) が、今は二つの異なるオブジェクトを返します。 ユニオンが等しいかを比較するには、isではなく==を使ってください。 新しい形式のユニオンは、以前からこのようにはキャッシュされていません。typing.Unionへの添字指定で多数のユニオンを作成するプログラムでは、この変更でメモリ使用量が増える可能性があります。 ただし、いくつかの要因がこのコストを相殺します。 PEP 649 により、Python 3.14 ではアノテーション内のユニオンはデフォルトでは評価されません。 また、types.UnionTypeのインスタンス自体が、以前の Python でUnion[]が返していたオブジェクトよりもずっと小さく、キャッシュの削除自体もメモリを節約します。 そのため、ほとんどのユーザーにとって、この変更でメモリ使用量が大幅に増えることはないでしょう。以前は、旧式のユニオンは非公開クラス
typing._UnionGenericAliasで実装されていました。 このクラスは実装上は不要になりましたが、後方互換性のために残されており、Python 3.17 で削除予定です。 非公開の実装の詳細に依存するのではなく、get_origin()やtyping.get_args()など、ドキュメント化されたイントロスペクション用の補助関数を使ってください。typing.Union自体をisinstance()のチェックに使えるようになりました。 例えば、以前はTypeErrorになっていたisinstance(int | str, typing.Union)が、Trueを返すようになります。typing.Unionオブジェクトの__args__属性が書き込み不可になりました。Unionオブジェクトの属性は、どれも設定できなくなりました。 以前のバージョンでも設定できたのは二重アンダースコア付きの属性だけで、ドキュメント化された機能ではなく、多くの場合に気付きにくい不具合がありました。
(Jelle Zijlstra が gh-105499 で貢献しました。)
TypeAliasTypeがアスタリスクによるアンパックをサポートするようになりました。
unicodedata¶
Unicode データベースを Unicode 16.0.0 に更新しました。
unittest¶
unittestの出力がデフォルトで色付きになりました。 これは 環境変数 で制御できます。 (Hugo van Kemenade が gh-127221 で貢献しました。)unittest のテスト探索で、開始ディレクトリとして 名前空間パッケージ を再びサポートするようになりました。 この機能は Python 3.11 で削除されていました。 (Jacob Walls が gh-80958 で貢献しました。)
TestCaseクラスに、特定の用途に合わせたテストを行ういくつかのメソッドを追加しました。assertHasAttr()とassertNotHasAttr()は、オブジェクトが特定の属性を持つかどうかを確認します。assertIsSubclass()とassertNotIsSubclass()は、オブジェクトが特定のクラス、またはクラスのタプルのいずれかのサブクラスかどうかを確認します。assertStartsWith()、assertNotStartsWith()、assertEndsWith()、assertNotEndsWith()は、Unicode 文字列やバイト列が特定の文字列で始まるか、終わるかを確認します。
(Serhiy Storchaka が gh-71339 で貢献しました。)
urllib¶
urllib.requestが RFC 7616 で定義された SHA-256 によるダイジェスト認証をサポートし、HTTP ダイジェスト認証のアルゴリズムを強化しました。 (Calvin Bui が gh-128193 で貢献しました。)file:URL の解析と生成について、使いやすさと標準への準拠を改善しました。url2pathname()の変更:新しい
require_scheme引数が真の場合、完全な URL を受け付けます。URL の authority がローカルのホスト名と一致する場合は、その部分を取り除きます。
新しい
resolve_host引数が真の場合、URL の authority がローカル IP アドレスに解決されれば、その部分を取り除きます。URL のクエリとフラグメントの部分を取り除きます。
URL の authority がローカルでない場合は
URLErrorを送出します。 ただし、Windows では従来どおり UNC パスを返します。
pathname2url()の変更:新しい
add_scheme引数が真の場合、完全な URL を返します。パスがスラッシュで始まる場合は、空の URL authority を含めます。 例えば、パス
/etc/hostsは URL///etc/hostsに変換されます。
Windows でドライブ文字を大文字に変換しなくなりました。 また、ドライブ文字の直後以外に
:文字があってもOSErrorを送出しなくなりました。(Barney Gale が gh-125866 で貢献しました。)
uuid¶
RFC 9562 で定義された UUID バージョン 6、7、8 を、それぞれ
uuid6()、uuid7()、uuid8()でサポートするようになりました。 (Bénédikt Tran が gh-89083 で貢献しました。)RFC 9562 で定義された Nil UUID と Max UUID を表す
NILとMAXが利用できるようになりました。 (Nick Pope が gh-128427 で貢献しました。)python -m uuid --countにより、コマンドラインで複数の UUID を一度に生成できるようになりました。 (Simon Legner が gh-131236 で貢献しました。)
webbrowser¶
BROWSER環境変数内の名前で、webbrowserモジュールに登録済みのブラウザを参照できるようになりました。 常に新しいブラウザのコマンドを生成するとは限らなくなります。これにより、macOS でサポートされるブラウザのいずれかの名前を
BROWSERに設定できます。
zipfile¶
ZipFile.writestrで使うZipInfoオブジェクトに適切なデフォルト値を設定する、ZipInfo._for_archiveメソッドを追加しました。 (Bénédikt Tran が gh-123424 で貢献しました。)再現可能なビルドへの対応を改善するため、
ZipFile.writestr()がSOURCE_DATE_EPOCH環境変数を参照するようになりました。 (Jiahao Li が gh-91279 で貢献しました。)
最適化¶
annotationlib、ast、asyncio、base64、cmd、csv、gettext、importlib.util、locale、mimetypes、optparse、pickle、pprint、pstats、shlex、socket、string、subprocess、threading、tomllib、types、zipfileなど、いくつかの標準ライブラリモジュールのインポート時間を改善しました。(Adam Turner、Bénédikt Tran、Chris Markiewicz、Eli Schwartz、Hugo van Kemenade、Jelle Zijlstra らが gh-118761 で貢献しました。)
インタープリタは、安全な場合には内部で参照カウントの変更を一部省くようになりました。 そのため、
sys.getrefcount()とPy_REFCNT()が返す値は、以前の Python と異なる場合があります。 詳細は 後述の説明 を参照してください。
asyncio¶
ネイティブのタスクにスレッドごとの双方向連結リストを導入したことで、標準ベンチマークの結果が 10~20% 改善し、メモリ使用量も減りました。 これにより、python -m asyncio pstree などの外部のイントロスペクションツールが、すべてのスレッドで実行中の asyncio タスクの呼び出しグラフを調べられます。 (Kumar Aditya が gh-107803 で貢献しました。)このモジュールが フリースレッドビルド を正式にサポートするようになりました。 これにより複数のイベントループを別々のスレッドで並列実行でき、スレッド数に比例して処理性能が向上します。 (Kumar Aditya が gh-128002 で貢献しました。)
base64¶
b16decode()が最大 6 倍高速になりました。 (Bénédikt Tran, Chris Markiewicz, and Adam Turner が gh-118761 で貢献しました。)
bdb¶
基本デバッガーに
sys.monitoringに基づくバックエンドが追加されました。Bdbクラスの新しい backend 引数に'monitoring'を渡すと選択できます。 (Tian Gao が gh-124533 で貢献しました。)
difflib¶
IS_LINE_JUNK()関数が最大 2 倍高速になりました。 (Adam Turner and Semyon Moroz が gh-130167 で貢献しました。)
gc¶
Python 3.14.5 以降:
Python 3.14.0–3.14.4 には新しいインクリメンタルなガベージコレクタが搭載されていました。 しかし、本番環境でメモリ使用量が大幅に増加するという 報告 が複数寄せられたため、3.13 の世代別 GC に戻されました。 Python 3.14.5 以降では、この世代別 GC が使われています。
以前の Python 3.14.0~3.14.4:
新しい インクリメンタルなガベージコレクタ により、ヒープが大きい場合の最大停止時間が 10 分の 1 以下に短縮されます。
この最適化により、
get_threshold()とset_threshold()の結果の意味が、get_count()とget_stats()とともに変わりました。後方互換性のため、
get_threshold()は引き続き 3 要素のタプルを返します。 最初の値は従来と同じく若い世代のコレクションの閾値です。 2 番目の値は古い世代を走査する速さを決めます (デフォルトは 10 で、値が大きいほど古い世代の走査が遅くなります)。 3 番目の値に意味はなくなり、常にゼロになります。set_threshold()は 3 番目以降の引数を無視するようになりました。get_count()とget_stats()は引き続き同じ形式の結果を返します。 唯一の違いは、結果が若い世代・中間世代・古い世代を指す代わりに、若い世代と、古い世代の aging 領域および collecting 領域を指すことです。
つまり、循環 GC の動作を操作するコードは意図したとおりには動かないかもしれませんが、悪影響を及ぼす可能性は極めて低いと考えられます。 それ以外のコードは問題なく動作します。
(Mark Shannon が gh-108362 で貢献しました。)
io¶
pathlib¶
Path.read_bytesがバッファリングなしのモードでファイルを開くようになり、ファイル全体の読み込みが 9% から 17% 高速になりました。 (Cody Maloney が gh-120754 で貢献しました。)
pdb¶
pdbがsys.settrace()とsys.monitoringに基づく 2 つのバックエンドをサポートするようになりました。 pdb CLI またはbreakpoint()を使う場合は常にsys.monitoringバックエンドが使われます。pdb.Pdbやその派生クラスを明示的にインスタンス化する場合、デフォルトではsys.settrace()バックエンドが使われますが、設定で変更できます。 (Tian Gao が gh-124533 で貢献しました。)
textwrap¶
dedent()関数を最適化し、平均で 2.4 倍高速化しました。 入力が大きいほど改善の幅も大きくなります。 また、スペースとタブ以外の空白文字を含む空行の正規化が不完全だったバグを修正しました。
uuid¶
zlib¶
削除¶
argparse¶
BooleanOptionalActionの type、choices、metavar 引数を削除しました。 これらは Python 3.12 から非推奨でした。 (Nikita Sobolev が gh-118805 で貢献しました。)引数グループで
add_argument_group()を呼ぶとValueErrorが送出されるようになりました。 同様に、相互排他グループでadd_argument_group()またはadd_mutually_exclusive_group()を呼ぶと、どちらもValueErrorが送出されます。 この「入れ子」はサポートされておらず、正しく動かないことも多く、継承により意図せず利用可能になっていたものです。 この機能は Python 3.11 から非推奨でした。 (Savannah Ostrowski が gh-127186 で貢献しました。)
ast¶
以下のクラスを削除しました。 これらは Python 3.8 から
Constantの非推奨の別名となっており、Python 3.12 から非推奨の警告を出していました。BytesEllipsisNameConstantNumStr
これらの削除に伴い、
NodeVisitorの独自のサブクラスに定義したvisit_Num、visit_Str、visit_Bytes、visit_NameConstant、visit_Ellipsisメソッドは、NodeVisitorサブクラスが AST を走査するときに呼ばれなくなりました。 代わりにvisit_Constantメソッドを定義してください。(Alex Waygood が gh-119562 で貢献しました。)
ast.Constantの以下の非推奨のプロパティを削除しました。 これらは、今回削除された AST クラスとの互換性のために存在していました。Constant.nConstant.s
代わりに
Constant.valueを使ってください。 (Alex Waygood が gh-119562 で貢献しました。)
asyncio¶
Python 3.12 から非推奨だった以下のクラス、メソッド、関数を削除しました。
AbstractChildWatcherFastChildWatcherMultiLoopChildWatcherPidfdChildWatcherSafeChildWatcherThreadedChildWatcherAbstractEventLoopPolicy.get_child_watcher()AbstractEventLoopPolicy.set_child_watcher()get_child_watcher()set_child_watcher()
(Kumar Aditya が gh-120804 で貢献しました。)
asyncio.get_event_loop()は現在のイベントループがない場合にRuntimeErrorを送出するようになり、イベントループを暗黙に作成しなくなりました。(Kumar Aditya が gh-126353 で貢献しました。)
asyncio.get_event_loop()を使うパターンはいくつかありますが、その大半はasyncio.run()で置き換えられます。非同期関数を実行するだけなら、
asyncio.run()を使ってください。変更前:
async def main(): ... loop = asyncio.get_event_loop() try: loop.run_until_complete(main()) finally: loop.close()
変更後:
async def main(): ... asyncio.run(main())
ソケットで待ち受けるサーバなどを起動し、その後ずっと実行し続けたい場合は、
asyncio.run()とasyncio.Eventを使ってください。変更前:
def start_server(loop): ... loop = asyncio.get_event_loop() try: start_server(loop) loop.run_forever() finally: loop.close()
変更後:
def start_server(loop): ... async def main(): start_server(asyncio.get_running_loop()) await asyncio.Event().wait() asyncio.run(main())
イベントループで処理を実行し、その前後にブロッキングするコードを実行したい場合は、
asyncio.Runnerを使ってください。変更前:
async def operation_one(): ... def blocking_code(): ... async def operation_two(): ... loop = asyncio.get_event_loop() try: loop.run_until_complete(operation_one()) blocking_code() loop.run_until_complete(operation_two()) finally: loop.close()
変更後:
async def operation_one(): ... def blocking_code(): ... async def operation_two(): ... with asyncio.Runner() as runner: runner.run(operation_one()) blocking_code() runner.run(operation_two())
email¶
email.utils.localtime()の isdst 引数を削除しました。 この引数は Python 3.12 から非推奨で、無視されていました。 (Hugo van Kemenade が gh-118798 で貢献しました。)
importlib.abc¶
importlib.abcの非推奨のクラスを削除しました。ResourceReader(代わりにTraversableResourcesを使用)Traversable(代わりにTraversableを使用)TraversableResources(代わりにTraversableResourcesを使用)
(Jason R. Coombs and Hugo van Kemenade が gh-93963 で貢献しました。)
itertools¶
itertoolsのイテレータから、コピー、深いコピー、pickle 化のサポートを削除しました。 これらの操作は Python 3.12 からDeprecationWarningを出していました。 (Raymond Hettinger が gh-101588 で貢献しました。)
pathlib¶
Pathに追加のキーワード引数を渡す機能を削除しました。 以前のバージョンでは、こうした引数はすべて無視されていました。 (Barney Gale が gh-74033 で貢献しました。)PurePath.relative_to()とis_relative_to()に追加の位置引数を渡す機能を削除しました。 以前のバージョンでは、こうした引数はすべて other に結合されていました。 (Barney Gale が gh-78707 で貢献しました。)
pkgutil¶
Python 3.12 から非推奨だった
get_loader()関数とfind_loader()関数を削除しました。 (Bénédikt Tran が gh-97850 で貢献しました。)
pty¶
Python 3.12 から非推奨だった
master_open()関数とslave_open()関数を削除しました。 代わりにpty.openpty()を使ってください。 (Nikita Sobolev が gh-118824 で貢献しました。)
sqlite3¶
sqlite3モジュールからversionとversion_infoを削除しました。 実行時に使われる SQLite ライブラリの実際のバージョン番号を取得するには、sqlite_versionとsqlite_version_infoを使ってください。 (Hugo van Kemenade が gh-118924 で貢献しました。)名前付きプレースホルダーとともにパラメータのシーケンスを使うと、
ProgrammingErrorが送出されるようになりました。 この使い方は Python 3.12 から非推奨でした。 (Erlend E. Aasland が gh-118928 and gh-101693 で貢献しました。)
urllib¶
Python 3.11 から非推奨だった
Quoterクラスをurllib.parseから削除しました。 (Nikita Sobolev が gh-118827 で貢献しました。)Python 3.3 から非推奨だった
URLopenerクラスとFancyURLopenerクラスをurllib.requestから削除しました。myopener.open()はurlopen()で置き換えられます。myopener.retrieve()はurlretrieve()で置き換えられます。 オープナークラスのカスタマイズは、カスタマイズしたハンドラーをbuild_opener()に渡すことで置き換えられます。 (Barney Gale が gh-84850 で貢献しました。)
非推奨¶
新たな非推奨事項¶
complex()コンストラクタの real 引数や imag 引数に複素数を渡すことが非推奨になりました。 複素数は単一の位置引数としてのみ渡してください。 (Serhiy Storchaka が gh-109218 で貢献しました。)-
add_argument_group()メソッドに、ドキュメントに記載のないキーワード引数 prefix_chars を渡すことが非推奨になりました。 (Savannah Ostrowski が gh-125563 で貢献しました。)型変換器
argparse.FileTypeが非推奨になりました。 リソース管理に関わる処理はすべて、引数の解析が終わった後の処理で行ってください。 (Serhiy Storchaka が gh-58032 で貢献しました。)
-
asyncio.iscoroutinefunction()が非推奨になり、Python 3.16 で削除される予定です。 代わりにinspect.iscoroutinefunction()を使ってください。 (Jiahao Li and Kumar Aditya が gh-122875 で貢献しました。)asyncioのポリシーシステムが非推奨になり、Python 3.16 で削除される予定です。 具体的には、以下のクラスと関数が非推奨になりました。使いたいイベントループの実装を指定するには、
asyncio.run()またはasyncio.Runnerの loop_factory 引数を使ってください。例えば、Windows で
asyncio.SelectorEventLoopを使うには、次のようにします:import asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(Kumar Aditya が gh-127949 で貢献しました。)
codecs:codecs.open()関数が非推奨になり、将来の Python バージョンで削除される予定です。 代わりにopen()を使ってください。 (Inada Naoki が gh-133036 で貢献しました。)-
Windows 以外のプラットフォームで、
Structure._pack_を設定して MSVC 互換のデフォルトのメモリレイアウトを使うことが非推奨になり、Python 3.19 で削除される予定です。 代わりにStructure._layout_を'ms'に設定してください。 (Petr Viktorin が gh-131747 で貢献しました。)文字列を指定して
ctypes.POINTER()を呼び出すことが非推奨になりました。 自己参照する構造体には 不完全型 を使ってください。 また、内部のctypes._pointer_type_cacheも非推奨になりました。 更新された実装の詳細はctypes.POINTER()を参照してください。 (Sergey Myrianov が gh-100926 で貢献しました。)
functools:functools.reduce()の Python 実装を function や sequence をキーワード引数として指定して呼び出すことが非推奨になりました。 これらの引数は Python 3.16 で位置専用になります。 (Kirill Podoprigora が gh-121676 で貢献しました。)logging: strm 引数を持つカスタムログハンドラーへの対応が非推奨になり、Python 3.16 で削除予定です。 代わりに stream 引数を持つハンドラーを定義してください。 (Mariusz Felisiak が gh-115032 で貢献しました。)mimetypes:mimetypes.MimeTypes.add_type()で有効な拡張子は、空か、'.' で始まるものです。 ドットで始まらない拡張子は非推奨になり、Python 3.16 ではValueErrorが送出されます。 (Hugo van Kemenade が gh-75223 で貢献しました。)nturl2path: このモジュールが非推奨になりました。 代わりにurllib.request.url2pathname()とpathname2url()を呼び出してください。 (Barney Gale が gh-125866 で貢献しました。)os:os.popen()関数とos.spawn*関数が ソフト非推奨 になりました。 新しいコードではこれらを使わないでください。 代わりにsubprocessモジュールを推奨します。 (Victor Stinner が gh-120743 で貢献しました。)pathlib:pathlib.PurePath.as_uri()が非推奨になり、Python 3.19 で削除予定です。 代わりにpathlib.Path.as_uri()を使ってください。 (Barney Gale が gh-123599 で貢献しました。)pdb: ドキュメントに記載のないpdb.Pdb.curframe_locals属性が、非推奨の読み出し専用プロパティになりました。 このプロパティは将来の Python バージョンで削除される予定です。 Python 3.13 で PEP 667 により低オーバーヘッドでフレームのローカル変数に動的にアクセスできるようになったため、この属性に保存していたフレームのローカル変数のキャッシュへの参照は不要になりました。 派生デバッガーでは、Python 3.13 以降はpdb.Pdb.curframe.f_localsに直接アクセスしてください。 (Tian Gao が gh-124369 and gh-125951 で貢献しました。)symtable: 関心が寄せられていないためsymtable.Class.get_methods()が非推奨になり、Python 3.16 で削除予定です。 (Bénédikt Tran が gh-119698 で貢献しました。)tkinter:tkinter.Variableのtrace_variable()、trace_vdelete()、trace_vinfo()メソッドが非推奨になりました。 代わりにtrace_add()、trace_remove()、trace_info()を使ってください。 (Serhiy Storchaka が gh-120220 で貢献しました。)urllib.parse:parse_qsl()とparse_qs()に、偽と評価されるオブジェクト (0や[]など) を渡すことが非推奨になりました。 ただし、空文字列、バイト列類似オブジェクト、Noneは除きます。 (Serhiy Storchaka が gh-116897 で貢献しました。)
Python 3.15 で削除予定¶
インポートシステム:
モジュールの
__spec__.cachedを設定せずに__cached__を設定することは非推奨です。 Python 3.15 では、インポートシステムや標準ライブラリは__cached__を設定しなくなり、その値も参照しなくなります。 (gh-97879)モジュールの
__spec__.parentを設定せずに__package__を設定することは非推奨です。 Python 3.15 では、インポートシステムや標準ライブラリは__package__を設定しなくなり、その値も参照しなくなります。 (gh-97879)
-
ドキュメント化されていない
ctypes.SetPointerType()関数は Python 3.13 から非推奨です。
-
古く、ほとんど使われていない
CGIHTTPRequestHandlerは Python 3.13 から非推奨です。 直接の代替はありません。 Web サーバーとリクエストハンドラーを接続するには、CGI 以外なら どの方法でも よりよい選択です。python -m http.server のコマンドラインインターフェースの
--cgiフラグは Python 3.13 から非推奨です。
-
load_module()メソッド:代わりにexec_module()を使ってください。
-
.PurePath.is_reserved()は Python 3.13 から非推奨です。 Windows で予約済みのパスを検出するにはos.path.isreserved()を使ってください。
-
platform.java_ver()は Python 3.13 から非推奨です。 この関数が役立つのは Jython への対応だけで、API は分かりにくく、ほとんどテストされていません。
-
sysconfig.is_python_build()のcheck_home引数は Python 3.12 から非推奨です。
-
RLock()は Python 3.15 から引数を受け取らなくなります。 Python 実装は引数を一切受け付けない一方、C 実装は任意の個数の位置引数やキーワード引数を受け付けてすべて無視するため、Python 3.14 から引数を渡すことは非推奨です。
-
types.CodeType:codeobject.co_lnotabへのアクセスは、PEP 626 で 3.10 から非推奨となり、3.12 で削除予定でした。 しかし、実際にDeprecationWarningが出るようになったのは 3.12 です。 3.15 で削除される可能性があります。 (Nikita Sobolev が gh-101866 で貢献しました。)
-
NamedTupleクラスを作成する、ドキュメント化されていないキーワード引数による構文 (例えばPoint = NamedTuple("Point", x=int, y=int)) は Python 3.13 から非推奨です。 代わりにクラスベースの構文か関数形式の構文を使ってください。TypedDictの関数形式の構文で、fieldsパラメータを省略すること (TD = TypedDict("TD")) やNoneを渡すこと (TD = TypedDict("TD", None)) は Python 3.13 から非推奨です。 フィールドがない TypedDict を作成するには、class TD(TypedDict): passまたはTD = TypedDict("TD", {})を使ってください。@typing.no_type_check_decoratorデコレーター関数は Python 3.13 から非推奨です。typingモジュールに追加されてから8年が経過しましたが、主要な型チェッカーではまだサポートされていません。
sre_compile、sre_constants、sre_parseモジュール。wave:Wave_readクラスとWave_writeクラスのgetmark()、setmark()、getmarkers()メソッドは Python 3.13 から非推奨です。
-
zipimport.zipimporter.load_module()は Python 3.10 から非推奨です。 代わりにexec_module()を使ってください。 (gh-125746。)
Python 3.16 で削除予定¶
インポートシステム:
モジュールの
__spec__.loaderを設定せずに__loader__を設定することは非推奨です。 Python 3.16 では、インポートシステムや標準ライブラリは__loader__を設定しなくなり、その値も参照しなくなります。
-
書式コード
'u'(wchar_t) は、Python 3.3 からドキュメントで非推奨とされ、Python 3.13 からは実行時にも非推奨とされています。 Unicode 文字には、代わりに書式コード'w'(Py_UCS4) を使ってください。
-
asyncio.iscoroutinefunction()は非推奨となり、Python 3.16 で削除されます。 代わりにinspect.iscoroutinefunction()を使ってください。 (Jiahao Li と Kumar Aditya が gh-122875 で貢献しました。)asyncioのポリシーシステムは非推奨となり、Python 3.16 で削除されます。 具体的には、以下のクラスと関数が非推奨です:使いたいイベントループの実装を指定するには、
asyncio.run()またはasyncio.Runnerのloop_factoryを使ってください。例えば、Windows で
asyncio.SelectorEventLoopを使うには、次のようにします。import asyncio async def main(): ... asyncio.run(main(), loop_factory=asyncio.SelectorEventLoop)
(Kumar Aditya が gh-127949 で貢献しました。)
-
真偽値に対するビット単位の反転
~Trueや~Falseは、直感に反する意外な結果 (-2と-1) になるため、Python 3.12 から非推奨です。 真偽値の論理否定には、代わりにnot xを使ってください。 元の整数値のビット単位の反転が必要になるまれな場合には、明示的にintに変換してください (~int(x))。
-
functools.reduce()の Python 実装を、functionやsequenceをキーワード引数として指定して呼び出すことは、Python 3.14 から非推奨です。
-
strm引数を持つカスタムログハンドラーへの対応は非推奨となり、Python 3.16 で削除予定です。 代わりにstream引数を持つハンドラーを定義してください。 (Mariusz Felisiak が gh-115032 で貢献しました。)
-
mimetypes.MimeTypes.add_type()で有効な拡張子は、'.' で始まるものか空のものです。 ドットのない拡張子は非推奨となり、Python 3.16 ではValueErrorが発生します。 (Hugo van Kemenade が gh-75223 で貢献しました。)
-
ExecError例外は Python 3.14 から非推奨です。 Python 3.4 以降はshutilのどの関数でも使われておらず、現在はRuntimeErrorの別名になっています。
-
Class.get_methodsメソッドは Python 3.14 から非推奨です。
sys:_enablelegacywindowsfsencoding()関数は Python 3.13 から非推奨です。 代わりに環境変数PYTHONLEGACYWINDOWSFSENCODINGを使ってください。
-
sysconfig.expand_makefile_vars()関数は Python 3.14 から非推奨です。 代わりにsysconfig.get_paths()のvars引数を使ってください。
-
ドキュメント化されておらず、使われてもいない
TarFile.tarfile属性は Python 3.13 から非推奨です。
Python 3.17 で削除予定¶
-
年を含まず
%e(月内の日) を含む書式文字列でstrptime()を呼び出すこと。 これは Python 3.15 から非推奨です。 (Stan Ulbrych が gh-70647 で貢献しました。)
-
collections.abc.ByteStringは Python 3.17 で削除予定です。実行時に
objが バッファプロトコル を実装しているか調べるには、isinstance(obj, collections.abc.Buffer)を使ってください。 型アノテーションにはBufferを使うか、コードが対応する型を明示したユニオン (例えばbytes | bytearray | memoryview) を使ってください。ByteStringは当初、bytesとbytearrayの両方の上位型となる抽象クラスとして意図されていました。 しかし、この ABC はメソッドを一つも持たないため、あるオブジェクトがByteStringのインスタンスだと分かっても、そのオブジェクトに関する有用な情報は何も得られませんでした。memoryviewなど、他の一般的なバッファ型も、実行時にも静的型チェッカーによってもByteStringのサブタイプとして認識されることはありませんでした。
-
encodings.normalize_encoding()に非 ASCII のencoding名を渡すことは非推奨となり、Python 3.17 で削除予定です。 (Stan Ulbrych が gh-136702 で貢献しました。)
-
profileモジュールは非推奨となり、Python 3.17 で削除されます。 代わりに、互換性のある API を提供するprofiling.tracingを使ってください。 詳しくは PEP 799 を参照してください。 (Pablo Galindo と László Kiss Kollár が gh-138122 で貢献しました。)
-
webbrowser.MacOSXOSAScriptは非推奨となりました。 代わりにwebbrowser.MacOSを使ってください。 (gh-137586)
-
Python 3.14 より前は、従来のユニオンは非公開クラス
typing._UnionGenericAliasを使って実装されていました。 このクラスは実装上は不要になりましたが、後方互換性のために残されており、Python 3.17 で削除予定です。 非公開の実装の詳細に依存する代わりに、typing.get_origin()やtyping.get_args()など、ドキュメント化されたイントロスペクション用の補助関数を使ってください。Python 3.9 から非推奨となっている
typing.ByteStringは、Python 3.17 で削除予定です。実行時に
objが バッファプロトコル を実装しているか調べるには、isinstance(obj, collections.abc.Buffer)を使ってください。 型アノテーションにはBufferを使うか、コードが対応する型を明示したユニオン (例えばbytes | bytearray | memoryview) を使ってください。ByteStringは当初、bytesとbytearrayの両方の上位型となる抽象クラスとして意図されていました。 しかし、この ABC はメソッドを一つも持たないため、あるオブジェクトがByteStringのインスタンスだと分かっても、そのオブジェクトに関する有用な情報は何も得られませんでした。memoryviewなど、他の一般的なバッファ型も、実行時にも静的型チェッカーによってもByteStringのサブタイプとして認識されることはありませんでした。
-
Python 3.14 から非推奨となっている
tkinter.Variableのメソッドtrace_variable()、trace()(trace_variable()の別名)、trace_vdelete()、trace_vinfo()は、Python 3.17 で削除予定です。 代わりにtrace_add()、trace_remove()、trace_info()を使ってください。 (Serhiy Storchaka が gh-120220 で貢献しました。)
Python 3.18 で削除予定¶
Python 3.19 で削除予定¶
-
http.cookies.Morsel.js_output()は非推奨となり、Python 3.19 で削除されます。http.cookies.BaseCookie.js_output()は非推奨となり、Python 3.19 で削除されます。
-
IMAP4.fileの変更は非推奨となり、Python 3.19 で削除予定です。 このプロパティは現在使われておらず、値を変更しても現在のファイルは自動的には閉じられません。Python 3.14 より前は、このプロパティは
IMAP4の対応するread()メソッドとreadline()メソッドの実装に使われていましたが、それ以降は使われていません。
Python 3.20 で削除予定¶
struct.Structの__new__()メソッドをformat引数なしで呼び出すことは非推奨となり、Python 3.20 で削除されます。 初期化済みのStructオブジェクトで__init__()メソッドを呼び出すことも非推奨となり、Python 3.20 で削除されます。(Sergey B Kirpichev と Serhiy Storchaka が gh-143715 で貢献しました。)
以下の標準ライブラリモジュールの
__version__、version、VERSION属性は非推奨となり、Python 3.20 で削除されます。 代わりにsys.version_infoを使ってください。ctypes.macholibdecimal(代わりにdecimal.SPEC_VERSIONを使ってください)logging(__date__も非推奨)xml.sax.expatreader
(Hugo van Kemenade と Stan Ulbrych が gh-76007 で貢献しました。)
PEP 829 で定義された非推奨事項:
name.pthファイルにimport行がある場合は警告が出ます。name.pthファイルは、デフォルトではロケールのエンコーディングでデコードされなくなります。utf-8-sigでエンコードされて いなければなりません。
(Barry Warsaw が gh-148641 で貢献しました。)
ast:抽象 AST ノード (
ast.ASTやast.exprなど) のインスタンスを作成することは非推奨となり、Python 3.20 ではエラーになります。
-
実行時チェック可能なプロトコルクラスを継承していても、
runtime_checkable()で明示的にデコレートされていないプロトコルクラスに対し、isinstance()やissubclass()でチェックすることは非推奨です。 Python 3.20 ではTypeErrorが発生します。(Bartosz Sławecki が gh-132604 で貢献しました。)
将来のバージョンで削除予定¶
以下の API は将来削除されますが、現時点では削除時期は決まっていません。
-
引数グループの入れ子と、相互排他的なグループの入れ子は非推奨です。
add_argument_group()に、ドキュメント化されていないキーワード引数prefix_charsを渡すことは非推奨になりました。argparse.FileType型コンバーターは非推奨です。
-
ジェネレータ:
throw(type, exc, tb)とathrow(type, exc, tb)というシグネチャは非推奨です。 代わりに、引数が一つのthrow(exc)とathrow(exc)を使ってください。現在の Python は、
0in x、1or x、0if 1else 2のように数値リテラルの直後にキーワードが続く記法を受け付けます。 そのため、[0x1for x in y]のような紛らわしく曖昧な式も書けます ([0x1 for x in y]とも[0x1f or x in y]とも解釈できます)。 数値リテラルの直後にand、else、for、if、in、is、orのいずれかが続く場合は、構文上の警告が発生します。 将来のリリースでは構文エラーになります。 (gh-87999)Support for
__index__()and__int__()method returning non-int type: these methods will be required to return an instance of a strict subclass ofint.__float__()メソッドがfloatの厳密なサブクラスのインスタンスを返すことへの対応:今後はfloat自体のインスタンスを返すことが必須になります。__complex__()メソッドがcomplexの厳密なサブクラスのインスタンスを返すことへの対応:今後はcomplex自体のインスタンスを返すことが必須になります。complex()コンストラクターのreal引数やimag引数に複素数を渡すことは非推奨になりました。 複素数は単独の位置引数としてのみ渡してください。 (Serhiy Storchaka が gh-109218 で貢献しました。)
calendar:定数calendar.Januaryとcalendar.Februaryは非推奨となり、calendar.JANUARYとcalendar.FEBRUARYに置き換えられました。 (Prince Roshan が gh-103636 で貢献しました。)codecs:codecs.open()の代わりにopen()を使ってください。 (gh-133038)codeobject.co_lnotab:代わりにcodeobject.co_lines()メソッドを使ってください。-
utcnow():datetime.datetime.now(tz=datetime.UTC)を使ってください。utcfromtimestamp():datetime.datetime.fromtimestamp(timestamp, tz=datetime.UTC)を使ってください。
gettext:複数形を選択するための値は整数でなければなりません。-
cache_from_source()のdebug_overrideパラメータは非推奨です。 代わりにoptimizationパラメータを使ってください。
-
EntryPointsのタプルインターフェース。戻り値として暗黙的に
Noneを返すこと。
logging:warn()メソッドは Python 3.3 から非推奨です。 代わりにwarning()を使ってください。mailbox:StringIO による入力とテキストモードの使用は非推奨です。 代わりに BytesIO とバイナリモードを使ってください。os: Callingos.register_at_fork()in a multi-threaded process.os.path:os.path.commonprefix()は非推奨です。 パスの共通の先頭部分を求めるにはos.path.commonpath()を使ってください。os.path.commonprefix()は、名前と所属するモジュールが誤解を招くため非推奨になります。 この関数はパス操作用のモジュールに含まれていますが、パスの先頭部分を扱う用途では安全に使えません。 そのため、この関数を使うと Python プログラムにパストラバーサルの脆弱性を誤って持ち込みやすくなります。pydoc.ErrorDuringImport:exc_infoパラメータにタプルを渡すことは非推奨です。 例外インスタンスを使ってください。re:正規表現内の番号によるグループ参照とグループ名に、より厳しい規則が適用されるようになりました。 番号による参照には ASCII の数字の並びだけを使えます。 bytes パターンと置換文字列のグループ名には、ASCII の英字、数字、アンダースコアだけを使えます。 (Serhiy Storchaka が gh-91760 で貢献しました。)shutil:rmtree()のonerrorパラメータは Python 3.12 で非推奨になりました。 代わりにonexcパラメータを使ってください。sslのオプションとプロトコル:プロトコル引数を指定せずに
ssl.SSLContextを作成することは非推奨です。ssl.SSLContext:set_npn_protocols()とselected_npn_protocol()は非推奨です。 代わりに ALPN を使ってください。ssl.OP_NO_SSL*オプションssl.OP_NO_TLS*オプションssl.PROTOCOL_SSLv3ssl.PROTOCOL_TLSssl.PROTOCOL_TLSv1ssl.PROTOCOL_TLSv1_1ssl.PROTOCOL_TLSv1_2ssl.TLSVersion.SSLv3ssl.TLSVersion.TLSv1ssl.TLSVersion.TLSv1_1
threadingのメソッド:threading.Condition.notifyAll():notify_all()を使ってください。threading.Event.isSet():is_set()を使ってください。threading.Thread.isDaemon()、threading.Thread.setDaemon():threading.Thread.daemon属性を使ってください。threading.Thread.getName()、threading.Thread.setName():threading.Thread.name属性を使ってください。threading.currentThread():threading.current_thread()を使ってください。threading.activeCount():threading.active_count()を使ってください。
内部クラス
typing._UnionGenericAliasは、typing.Unionの実装には使われなくなりました。 この非公開クラスを使っているユーザーとの互換性を保つため、少なくとも Python 3.17 までは互換性を維持するための実装が提供されます。 (Jelle Zijlstra が gh-105499 で貢献しました。)unittest.IsolatedAsyncioTestCase:テストケースからNone以外の値を返すことは非推奨です。urllib.parseの非推奨の関数:代わりにurlparse()を使ってください。splitattr()splithost()splitnport()splitpasswd()splitport()splitquery()splittag()splittype()splituser()splitvalue()to_bytes()
wsgiref:SimpleHandler.stdout.write()は、渡されたデータの一部だけを書き込んで終了してはいけません。xml.etree.ElementTree:Elementの真偽値を調べることは非推奨です。 将来のリリースでは、常にTrueを返すようになります。 代わりにlen(elem)やelem is not Noneを使って明示的に判定してください。sys._clear_type_cache()は非推奨です。 代わりにsys._clear_internal_caches()を使ってください。
CPython バイトコードの変更¶
オペコード
BINARY_SUBSCRを、NB_SUBSCRを oparg に持つBINARY_OPオペコードで置き換えました。 (Irit Katriel が gh-100239 で貢献しました。)新しい
InterpolationインスタンスとTemplateインスタンスをそれぞれ構築するBUILD_INTERPOLATIONオペコードとBUILD_TEMPLATEオペコードを追加しました。 (Lysandros Nikolaou ほかが gh-132661 で貢献しました。 PEP 750: テンプレート文字列 も参照してください)。BUILD_CONST_KEY_MAPオペコードを削除しました。 代わりにBUILD_MAPを使ってください。 (Mark Shannon が gh-122160 で貢献しました。)LOAD_ASSERTION_ERRORオペコードをLOAD_COMMON_CONSTANTで置き換え、NotImplementedErrorの読み込みをサポートしました。LOAD_FAST_BORROWオペコードとLOAD_FAST_BORROW_LOAD_FAST_BORROWオペコードを追加しました。 フレーム内の参照がスタックに読み込まれた参照より長く存続するとインタープリタが証明できる場合に、参照カウントのオーバーヘッドを削減します。 (Matt Page が gh-130704 で貢献しました。)opargと等しい小さな整数をスタックに積むLOAD_SMALL_INTオペコードを追加しました。RETURN_CONSTオペコードは使われなくなったため削除しました。 (Mark Shannon が gh-125837 で貢献しました。)新しい
LOAD_SPECIAL命令を追加しました。with文とasync with文のコードは、この新しい命令を使って生成されます。BEFORE_WITH命令とBEFORE_ASYNC_WITH命令を削除しました。 (Mark Shannon が gh-120507 で貢献しました。)「仮想」イテレータをサポートする
POP_ITERオペコードを追加しました。 (Mark Shannon が gh-132554 で貢献しました。)
擬似命令¶
アノテーションの遅延評価 で、モジュールレベルのアノテーションが一部だけ実行される場合に対応する
ANNOTATIONS_PLACEHOLDER擬似命令を追加しました。 (Jelle Zijlstra が gh-130907 で貢献しました。)インラインキャッシュから取得した一組の関数 (ガード関数と特殊化関数) を実行する
BINARY_OP_EXTEND擬似命令を追加しました。 (Irit Katriel が gh-100239 で貢献しました。)CALL_KWに 3 つの特殊化を追加しました。 Python 関数の呼び出し用のCALL_KW_PY、束縛メソッドの呼び出し用のCALL_KW_BOUND_METHOD、それ以外の呼び出し用のCALL_KW_NON_PYです。 (Mark Shannon が gh-118093 で貢献しました。)スタックに影響を与えない条件付きジャンプである
JUMP_IF_TRUE擬似命令とJUMP_IF_FALSE擬似命令を追加しました。 これらはCOPY 1、TO_BOOL、POP_JUMP_IF_TRUE/FALSEという命令列で置き換えられます。 (Irit Katriel が gh-124285 で貢献しました。)LOAD_CONST_MORTAL擬似命令を追加しました。 (Mark Shannon が gh-128685 で貢献しました。)LOAD_CONSTと同じ動作を行い、不死オブジェクトではより効率のよいLOAD_CONST_IMMORTAL擬似命令を追加しました。 (Mark Shannon が gh-125837 で貢献しました。)sys.monitoringが分岐イベント (BRANCH_LEFTなど) を記録するために使うNOT_TAKEN擬似命令を追加しました。 (Mark Shannon が gh-122548 で貢献しました。)
C API の変更¶
Python 設定 C API¶
C 構造体に依存せず Python の初期化を設定でき、将来 ABI 互換性を保った変更も行える PyInitConfig C API を追加しました。
組み込み拡張モジュールを追加できる PyInitConfig_AddModule() を追加し、PEP 587 の PyConfig C API を補完しました。
この機能は従来「inittab」と呼ばれていました。
現在のランタイム設定を取得・設定する PyConfig_Get() 関数と PyConfig_Set() 関数を追加しました。
PEP 587 「Python の初期化設定」は、Python の初期化を設定するすべての方法を統合しました。 今回の PEP はさらに、Python の事前初期化と初期化の設定を単一の API に統合します。 また、API をさらに簡素化するため、Python を組み込む際の選択肢を、PEP 587 の「Python」と「Isolated」の 2 つではなく、1 つだけにしています。
CPython の実装の詳細と意図的に強く結び付く用途では、より低レベルの PEP 587 の PyConfig API を引き続き使えます。 例えば、設定の仕組みを含めた CPython の CLI の全機能を再現する場合などです。
(Victor Stinner が gh-107954 で貢献しました。)
C API の新機能¶
Python のバージョン番号をビット単位で詰め込む 2 つの新しいマクロ、
Py_PACK_VERSION()とPy_PACK_FULL_VERSION()を追加しました。Py_VersionやPY_VERSION_HEXと比較する際に便利です。 (Petr Viktorin が gh-128629 で貢献しました。)Python の
sep.join(iterable)に相当するPyBytes_Join(sep, iterable)関数を追加しました。 (Victor Stinner が gh-121645 で貢献しました。)実行中の Python インタープリタの設定を操作する関数を追加しました (PEP 741: Python 設定 C API)。
(Victor Stinner が gh-107954 で貢献しました。)
Python の初期化を設定する関数を追加しました (PEP 741: Python 設定 C API)。
(Victor Stinner が gh-107954 で貢献しました。)
ファイルを開く
Py_fopen()関数を追加しました。 標準 C のfopen()関数と同様に動作しますが、path 引数として Python オブジェクトを受け取り、エラー時には例外を設定します。 ファイルを閉じるには、対応する新しいPy_fclose()関数を使ってください。 (Victor Stinner が gh-127350 で貢献しました。)バッファのハッシュ値を計算して返す
Py_HashBuffer()を追加しました。 (Antoine Pitrou and Victor Stinner が gh-122854 で貢献しました。)モジュールをインポートしてその属性を取得する補助関数
PyImport_ImportModuleAttr()とPyImport_ImportModuleAttrString()を追加しました。 (Victor Stinner が gh-128911 で貢献しました。)戻り値の意味が曖昧な
PyIter_Next()を置き換えるPyIter_NextItem()を追加しました。 (Irit Katriel and Erlend Aasland が gh-105201 で貢献しました。)intオブジェクトの符号を取得するPyLong_GetSign()関数を追加しました。 (Sergey B Kirpichev が gh-116560 で貢献しました。)PyLongObjectがそれぞれ正、負、ゼロかどうかを調べるPyLong_IsPositive()、PyLong_IsNegative()、PyLong_IsZero()を追加しました。 (James Roy and Sergey B Kirpichev が gh-126061 で貢献しました。)C の
<stdint.h>の数値と Python のintオブジェクトを相互に変換する新しい関数を追加しました。(Victor Stinner が gh-120389 で貢献しました。)
Python の
intオブジェクトをインポート・エクスポートする新しい API を追加しました (PEP 757)。(Sergey B Kirpichev and Victor Stinner が gh-102471 で貢献しました。)
BRANCH_LEFTイベントとBRANCH_RIGHTイベントをそれぞれ生成するPyMonitoring_FireBranchLeftEvent()とPyMonitoring_FireBranchRightEvent()を追加しました。 (Mark Shannon が gh-122548 で貢献しました。)型をイミュータブルにする
PyType_Freeze()関数を追加しました。 (Victor Stinner が gh-121654 で貢献しました。)スーパークラスの識別を容易にする
PyType_GetBaseByToken()とPy_tp_tokenスロットを追加しました。 これは PEP 630 で指摘された型チェックの問題の解決を図るものです。 (gh-124153 で貢献されました。)2 つの文字列が等しいかどうかを調べる新しい
PyUnicode_Equal()関数を追加しました。 この関数は Limited C API にも追加されています。 (Victor Stinner が gh-124502 で貢献しました。)Python の
strオブジェクトを作成する新しいPyUnicodeWriterAPI を追加しました。 以下の関数を含みます。(Victor Stinner が gh-119182 で貢献しました。)
PyArg_ParseTuple()および同様の関数の書式kとKが、他のすべての整数書式と同じく、利用可能な場合には__index__()を使うようになりました。 (Serhiy Storchaka が gh-112068 で貢献しました。)Py_BuildValue()に、C の整数から Python のboolオブジェクトを生成する新しい書式単位pを追加しました。 (Pablo Galindo が bpo-45325 で貢献しました。)デバッグのために、オブジェクトが 不死 かどうかを判定する
PyUnstable_IsImmortal()を追加しました。 (Peter Bierma が gh-128509 で貢献しました。)PEP 703 で説明されている遅延参照カウントを有効にする
PyUnstable_Object_EnableDeferredRefcount()を追加しました。フリースレッド ビルドで
Py_REFCNT(op) == 1の代わりに使うPyUnstable_Object_IsUniquelyReferenced()を追加しました。 (Peter Bierma が gh-133140 で貢献しました。)オブジェクトがインタープリタのオペランドスタック上で一意に参照される一時オブジェクトかどうかを判定する
PyUnstable_Object_IsUniqueReferencedTemporary()を追加しました。 C API 関数に引数として渡される Python オブジェクトについて、Py_REFCNT()が1かどうかを調べる代わりに使える場合があります。 (Sam Gross が gh-133164 で貢献しました。)
Limited C API の変更¶
Limited C API のバージョン 3.14 以降では、
Py_TYPE()とPy_REFCNT()が実装の詳細を隠す不透明な関数呼び出しとして実装されるようになりました。 (Victor Stinner が gh-120600 and gh-124127 で貢献しました。)Limited C API ではこれまで一度も正しく動作していなかったため、
PySequence_Fast_GET_SIZE、PySequence_Fast_GET_ITEM、PySequence_Fast_ITEMSマクロを Limited C API から削除しました。 (Victor Stinner が gh-91417 で貢献しました。)
削除された C API¶
ミュータブルな基底型を持つ
イミュータブルな型の作成は Python 3.12 で非推奨になり、今回からTypeErrorが送出されます。 (Nikita Sobolev が gh-119775 で貢献しました。)Python 3.12 で非推奨になった
PyDictObject.ma_version_tagメンバーを削除しました。 代わりにPyDict_AddWatcher()API を使ってください。 (Sam Gross が gh-124296 で貢献しました。)非公開関数
_Py_InitializeMain()を削除しました。 これは PEP 587 により Python 3.8 に追加された 暫定 API でした。 (Victor Stinner が gh-129033 で貢献しました。)ドキュメントに記載のない API
Py_C_RECURSION_LIMITとPyThreadState.c_recursion_remainingを削除しました。 これらは 3.13 で追加されたもので、非推奨期間を設けずに削除されました。 C コードで再帰の暴走を防ぐにはPy_EnterRecursiveCall()を使ってください。 (Petr Viktorin が gh-133079 で削除しました。 gh-130396 も参照してください。)
非推奨の C API¶
Py_HUGE_VALマクロが ソフト非推奨 になりました。 代わりにINFINITYを使ってください。 (Sergey B Kirpichev が gh-120026 で貢献しました。)Py_IS_NAN、Py_IS_INFINITY、Py_IS_FINITEマクロが ソフト非推奨 になりました。 代わりに C99 以降のmath.hで利用できるisnan、isinf、isfiniteを使ってください。 (Sergey B Kirpichev が gh-119613 で貢献しました。)PyArg_ParseTuple()やその他の 引数解析 関数で、(items)書式単位にタプル以外のシーケンスを渡すことが、items に 借用バッファ または 借用参照 を格納する書式単位が含まれる場合には非推奨になりました。 (Serhiy Storchaka が gh-50333 で貢献しました。)_PyMonitoring_FireBranchEvent関数が非推奨になりました。PyMonitoring_FireBranchLeftEvent()とPyMonitoring_FireBranchRightEvent()の呼び出しに置き換えてください。従来ドキュメントに記載のなかった
PySequence_In()関数が ソフト非推奨 になりました。 代わりにPySequence_Contains()を使ってください。 (Yuki Kobayashi が gh-127896 で貢献しました。)
Python 3.15 で削除予定¶
PyImport_ImportModuleNoBlock():代わりにPyImport_ImportModule()を使ってください。PyWeakref_GetObject()とPyWeakref_GET_OBJECT():代わりにPyWeakref_GetRef()を使ってください。 pythoncapi-compat プロジェクト を使うと、Python 3.12 以前でもPyWeakref_GetRef()を利用できます。PyUnicode_AsDecodedObject():代わりにPyCodec_Decode()を使ってください。PyUnicode_AsDecodedUnicode():代わりにPyCodec_Decode()を使ってください。 一部のコーデック (例えば "base64") は、bytesなどstr以外の型を返す場合があることに注意してください。PyUnicode_AsEncodedObject():代わりにPyCodec_Encode()を使ってください。PyUnicode_AsEncodedUnicode(): UsePyCodec_Encode()instead; Note that some codecs (for example, "base64") may return a type other thanbytes, such asstr.Python 3.13 で非推奨となった Python 初期化関数:
Py_GetPath():代わりにPyConfig_Get("module_search_paths")(sys.path) を使ってください。Py_GetPrefix():代わりにPyConfig_Get("base_prefix")(sys.base_prefix) を使ってください。 仮想環境 に対応する必要がある場合は、PyConfig_Get("prefix")(sys.prefix) を使ってください。Py_GetExecPrefix():代わりにPyConfig_Get("base_exec_prefix")(sys.base_exec_prefix) を使ってください。 仮想環境 に対応する必要がある場合は、PyConfig_Get("exec_prefix")(sys.exec_prefix) を使ってください。Py_GetProgramFullPath():代わりにPyConfig_Get("executable")(sys.executable) を使ってください。Py_GetProgramName():代わりにPyConfig_Get("executable")(sys.executable) を使ってください。Py_GetPythonHome():代わりにPyConfig_Get("home")または環境変数PYTHONHOMEを使ってください。
pythoncapi-compat プロジェクト を使うと、Python 3.13 以前でも
PyConfig_Get()を利用できます。Python 3.11 で非推奨となった、Python の初期化を設定する関数:
PySys_SetArgvEx():代わりにPyConfig.argvを設定してください。PySys_SetArgv():代わりにPyConfig.argvを設定してください。Py_SetProgramName():代わりにPyConfig.program_nameを設定してください。Py_SetPythonHome():代わりにPyConfig.homeを設定してください。PySys_ResetWarnOptions():代わりにsys.warnoptionsとwarnings.filtersをクリアしてください。
代わりに
PyConfigとPy_InitializeFromConfig()API を使ってください。グローバルな設定変数:
Py_DebugFlag:代わりにPyConfig.parser_debugまたはPyConfig_Get("parser_debug")を使ってください。Py_VerboseFlag:代わりにPyConfig.verboseまたはPyConfig_Get("verbose")を使ってください。Py_QuietFlag:代わりにPyConfig.quietまたはPyConfig_Get("quiet")を使ってください。Py_InteractiveFlag:代わりにPyConfig.interactiveまたはPyConfig_Get("interactive")を使ってください。Py_InspectFlag:代わりにPyConfig.inspectまたはPyConfig_Get("inspect")を使ってください。Py_OptimizeFlag:代わりにPyConfig.optimization_levelまたはPyConfig_Get("optimization_level")を使ってください。Py_NoSiteFlag:代わりにPyConfig.site_importまたはPyConfig_Get("site_import")を使ってください。Py_BytesWarningFlag:代わりにPyConfig.bytes_warningまたはPyConfig_Get("bytes_warning")を使ってください。Py_FrozenFlag:代わりにPyConfig.pathconfig_warningsまたはPyConfig_Get("pathconfig_warnings")を使ってください。Py_IgnoreEnvironmentFlag:代わりにPyConfig.use_environmentまたはPyConfig_Get("use_environment")を使ってください。Py_DontWriteBytecodeFlag:代わりにPyConfig.write_bytecodeまたはPyConfig_Get("write_bytecode")を使ってください。Py_NoUserSiteDirectory:代わりにPyConfig.user_site_directoryまたはPyConfig_Get("user_site_directory")を使ってください。Py_UnbufferedStdioFlag:代わりにPyConfig.buffered_stdioまたはPyConfig_Get("buffered_stdio")を使ってください。Py_HashRandomizationFlag:代わりにPyConfig.use_hash_seedとPyConfig.hash_seedまたはPyConfig_Get("hash_seed")を使ってください。Py_IsolatedFlag:代わりにPyConfig.isolatedまたはPyConfig_Get("isolated")を使ってください。Py_LegacyWindowsFSEncodingFlag:代わりにPyPreConfig.legacy_windows_fs_encodingまたはPyConfig_Get("legacy_windows_fs_encoding")を使ってください。Py_LegacyWindowsStdioFlag:代わりにPyConfig.legacy_windows_stdioまたはPyConfig_Get("legacy_windows_stdio")を使ってください。Py_FileSystemDefaultEncoding、Py_HasFileSystemDefaultEncoding:代わりにPyConfig.filesystem_encodingまたはPyConfig_Get("filesystem_encoding")を使ってください。Py_FileSystemDefaultEncodeErrors:代わりにPyConfig.filesystem_errorsまたはPyConfig_Get("filesystem_errors")を使ってください。Py_UTF8Mode:代わりにPyPreConfig.utf8_modeまたはPyConfig_Get("utf8_mode")を使ってください。 (Py_PreInitialize()を参照)
これらのオプションを設定するには、
PyConfigとPy_InitializeFromConfig()API を使ってください。 実行時に値を取得するにはPyConfig_Get()を使えます。
Python 3.16 で削除予定¶
同梱されている
libmpdec。
Python 3.18 で削除予定¶
以下の非公開関数は非推奨となり、Python 3.18 で削除予定です:
_PyBytes_Join():PyBytes_Join()を使ってください。_PyDict_GetItemStringWithError():PyDict_GetItemStringRef()を使ってください。_PyDict_Pop():PyDict_Pop()を使ってください。_PyLong_Sign():PyLong_GetSign()を使ってください。_PyLong_FromDigits()と_PyLong_New():PyLongWriter_Create()を使ってください。_PyThreadState_UncheckedGet():PyThreadState_GetUnchecked()を使ってください。_PyUnicode_AsString():PyUnicode_AsUTF8()を使ってください。_PyUnicodeWriter_Init():_PyUnicodeWriter_Init(&writer)をwriter = PyUnicodeWriter_Create(0)に置き換えてください。_PyUnicodeWriter_Finish():_PyUnicodeWriter_Finish(&writer)をPyUnicodeWriter_Finish(writer)に置き換えてください。_PyUnicodeWriter_Dealloc():_PyUnicodeWriter_Dealloc(&writer)をPyUnicodeWriter_Discard(writer)に置き換えてください。_PyUnicodeWriter_WriteChar():_PyUnicodeWriter_WriteChar(&writer, ch)をPyUnicodeWriter_WriteChar(writer, ch)に置き換えてください。_PyUnicodeWriter_WriteStr():_PyUnicodeWriter_WriteStr(&writer, str)をPyUnicodeWriter_WriteStr(writer, str)に置き換えてください。_PyUnicodeWriter_WriteSubstring():_PyUnicodeWriter_WriteSubstring(&writer, str, start, end)をPyUnicodeWriter_WriteSubstring(writer, str, start, end)に置き換えてください。_PyUnicodeWriter_WriteASCIIString(): replace_PyUnicodeWriter_WriteASCIIString(&writer, str, size)withPyUnicodeWriter_WriteASCII(writer, str, size)._PyUnicodeWriter_WriteLatin1String(): replace_PyUnicodeWriter_WriteLatin1String(&writer, str, size)by decoding the string withPyUnicode_DecodeLatin1(), writing the result withPyUnicodeWriter_WriteStr(), and releasing the result withPy_DECREF()._PyUnicodeWriter_Prepare():(代替なし)。_PyUnicodeWriter_PrepareKind():(代替なし)。_Py_HashPointer():Py_HashPointer()を使ってください。_Py_fopen_obj():Py_fopen()を使ってください。
pythoncapi-compat プロジェクト を使うと、Python 3.13 以前でもこれらの新しい公開関数を利用できます。 (Victor Stinner が gh-128863 で貢献しました。)
将来のバージョンで削除予定¶
以下の API は非推奨となり、削除される予定ですが、現時点では削除時期は決まっていません。
Py_TPFLAGS_HAVE_FINALIZE:Python 3.8 以降では不要です。PyErr_Fetch():代わりにPyErr_GetRaisedException()を使ってください。PyErr_NormalizeException():代わりにPyErr_GetRaisedException()を使ってください。PyErr_Restore():代わりにPyErr_SetRaisedException()を使ってください。PyModule_GetFilename():代わりにPyModule_GetFilenameObject()を使ってください。PyOS_AfterFork():代わりにPyOS_AfterFork_Child()を使ってください。PySlice_GetIndicesEx():代わりにPySlice_Unpack()とPySlice_AdjustIndices()を使ってください。PyUnicode_READY():Python 3.12 以降では不要です。PyErr_Display():代わりにPyErr_DisplayException()を使ってください。_PyErr_ChainExceptions():代わりに_PyErr_ChainExceptions1()を使ってください。PyBytesObject.ob_shashメンバー:代わりにPyObject_Hash()を呼び出してください。スレッドローカルストレージ (TLS) API:
PyThread_create_key(): UsePyThread_tss_alloc()instead.PyThread_delete_key():代わりにPyThread_tss_free()を使ってください。PyThread_set_key_value():代わりにPyThread_tss_set()を使ってください。PyThread_get_key_value():代わりにPyThread_tss_get()を使ってください。PyThread_delete_key_value(): UsePyThread_tss_delete()instead.PyThread_ReInitTLS():Python 3.7 以降では不要です。
ビルドの変更¶
PEP 776: Emscripten が ティア 3 の正式なサポート対象プラットフォームになりました。 この取り組みの一環として、Emscripten libc のバグを 25 件以上修正しました。 Emscripten が
ctypes、termios、fcntlをサポートするようになり、新しい デフォルトの対話シェル も実験的にサポートするようになりました。 (R. Hood Chatham が gh-127146, gh-127683, and gh-136931 で貢献しました。)公式の Android バイナリリリースが python.org で提供されるようになりました。
configureの生成に GNU Autoconf 2.72 が必要になりました。 (Erlend Aasland が gh-115765 で貢献しました。)wasm32-unknown-emscriptenが PEP 11 のティア 3 プラットフォームになりました。 (R. Hood Chatham が gh-127146, gh-127683, and gh-136931 で貢献しました。)#pragmaによるpython3*.libとのリンクを Py_NO_LINK_LIB で無効にできるようになりました。 (Jean-Christophe Fillion-Robin が gh-82909 で貢献しました。)CPython はセキュリティ向上のため、推奨されるコンパイラーオプションの組をデフォルトで有効にするようになりました。 無効にするには
configureの--disable-safetyオプションを使ってください。 性能を犠牲にしてさらに多くのコンパイラーオプションを有効にするには、--enable-slower-safetyオプションを使ってください。WITH_FREELISTSマクロとconfigureの--without-freelistsオプションを削除しました。configureの新しいオプション--with-tail-call-interpを使うと、実験的な末尾呼び出しインタープリタを有効にできます。 詳しくは 新しいインタープリタ を参照してください。新しいリモートデバッグのサポートを無効にするには、
configureの--without-remote-debugオプションを使ってください。 セキュリティ上の理由で無効にしたい場合に役立ちます。iOS および macOS のアプリで、
stdoutとstderrの内容をシステムログにリダイレクトするよう設定できるようになりました。 (Russell Keith-Magee が gh-127592 で貢献しました。)iOS のテスト環境で、テストの実行中に出力を逐次転送できるようになりました。 また、このテスト環境は CPython 自体以外のプロジェクトのテストスイートを実行するためにも使えます。 (Russell Keith-Magee が gh-127592 で貢献しました。)
build-details.json¶
Python のインストールに新しいファイル build-details.json が含まれるようになりました。
これは CPython のビルド情報を含む静的な JSON ドキュメントで、コードを実行せずに情報を調べられます。
Python ランチャーやクロスコンパイルなどの用途に役立ちます。
build-details.json は、プラットフォームに依存しない標準ライブラリのディレクトリにインストールしなければなりません。
これは sysconfig のインストールパス 'stdlib' に対応し、sysconfig.get_path('stdlib') を実行して取得できます。
参考
PEP 739 -- build-details.json 1.0 -- Python のビルド情報を記述する静的なファイル
PGP 署名の提供終了¶
Python 3.14 以降のリリースでは PGP (Pretty Good Privacy) 署名を提供しません。 CPython の配布物を検証するには、Sigstore の検証資料 を使う必要があります。 Python 3.11 以降、リリースは Sigstore を使って署名されています。
このリリース手順の変更は PEP 761 で規定されました。
フリースレッド版 Python の正式サポート¶
Python のフリースレッドビルドがサポート対象となり、実験段階ではなくなりました。 これは、フリースレッド版 Python を正式にサポートしつつ、引き続き任意の選択肢とする フェーズ II の開始に当たります。
フリースレッド化チームは、このプロジェクトが正しい方向に進んでいると確信しています。 Python コミュニティ全体でフリースレッド化をより広く採用できるよう、継続的に尽力してくださっている皆さんに感謝します。
これらの提言とこの PEP の採択を受け、Python 開発者コミュニティは、フリースレッド化が現在も将来もサポートされる Python のビルドオプションであり、適切な非推奨の計画なしには削除されないことを広く伝えていくべきです。
フリースレッド版を Python のデフォルトまたは唯一のビルドとする フェーズ III への移行は、まだ決まっていません。 この判断は CPython 自体とコミュニティの双方の多くの要因に左右され、将来に委ねられています。
実験的な JIT コンパイラーを含むバイナリリリース¶
macOS と Windows の公式リリースバイナリに、実験的な Just-In-Time (JIT) コンパイラーが含まれるようになりました。
本番環境での使用は 推奨しません が、環境変数 PYTHON_JIT=1 を設定すると試せます。
ソースからビルドする利用者や再配布者は、設定オプション --enable-experimental-jit=yes-off で同様の動作にできます。
JIT はまだ初期段階にあり、活発に開発が進められています。
そのため、有効にした場合の典型的な性能変化は、ワークロードに応じて 10% の低速化から 20% の高速化まで幅があります。
テストや評価を助けるため、sys._jit 名前空間に状態を調べる関数を用意しました。
sys._jit.is_available() で現在の実行ファイルが JIT コンパイルに対応しているかを調べ、sys._jit.is_enabled() で現在のプロセスで JIT コンパイルが有効になっているかを調べられます。
現在の最も大きな機能上の制約は、gdb や perf などのネイティブデバッガーやプロファイラーが JIT フレームをたどってスタックを巻き戻せないことです (pdb や profile などの Python のデバッガーやプロファイラーは、変更せずに引き続き動作します)。
フリースレッドビルドは JIT コンパイルをサポートしていません。
バグや大きな性能低下に遭遇した場合は、ぜひ報告してください。
参考
Python 3.14 への移行¶
このセクションでは前述の変更とバグフィックスにより必要となるかもしれないコードの変更を列挙します:
Python API の変更¶
macOS 以外の Unix プラットフォームでは、
multiprocessingとProcessPoolExecutorのデフォルトの 開始方式 が fork から forkserver に変わりました。multiprocessingやconcurrent.futuresでNameErrorや pickle 化のエラーが発生する場合は、forkserver の制約 を参照してください。この変更は Windows と macOS には影響せず、デフォルトの開始方式は引き続き 'spawn' です。
functools.partialがメソッドデスクリプタになりました。 以前の動作を保ちたい場合はstaticmethod()で包んでください。 (Serhiy Storchaka and Dominykas Grigonis が gh-121027 で貢献しました。)ガベージコレクタがインクリメンタルになった ため、
gc.collect()の動作が少し変わります。gc.collect(1): 第 1 世代の回収ではなく、インクリメンタルなガベージコレクションを 1 回進めます。gc.collect()のほかの呼び出しに変更はありません。
locale.nl_langinfo()関数が、場合によってLC_CTYPEロケールを一時的に設定するようになりました。 この一時的な変更は他のスレッドにも影響します。 (Serhiy Storchaka が gh-69998 で貢献しました。)pickle.dump()とpickle.dumps()が、一部の失敗に対してPicklingErrorを送出するようになりました。 従来は実装によってAttributeError、ImportError、ValueError、UnicodeEncodeError、PicklingErrorが送出されていた失敗です (例えばローカルオブジェクトや、所属するモジュールをインポートできないオブジェクトの pickle 化など)。 元の例外はPicklingErrorに連鎖されます。 これらの例外を捕捉していたコードでは、PicklingErrorも捕捉してください。 (Serhiy Storchaka が gh-122311 で貢献しました。)types.UnionTypeがtyping.Unionの別名となり、一部の動作が変わりました。 詳しくは 前述の説明 を参照してください。 (Jelle Zijlstra が gh-105499 で貢献しました。)アノテーションの実行時の動作がさまざまな点で変わりました。 詳しくは 前述の説明 を参照してください。 アノテーションを扱う大半のコードは引き続き動作するはずですが、ドキュメントに記載のない細部の動作は変わっている場合があります。
mimetypesの CLI の公開に伴い、失敗時の終了ステータスが0から1に、コマンドライン引数が不正な場合の終了ステータスが1から2に変わりました。 エラーメッセージは stderr に出力されるようになりました。正規表現のパターン全体が
\Bの場合、空文字列にもマッチするようになりました。 これにより動作が変わる可能性があります。FreeBSD では
sys.platformにメジャーバージョン番号が含まれなくなりました。
アノテーションの変更 (PEP 649 と PEP 749)¶
この節では、アノテーションの遅延評価 に関する変更に伴い、アノテーションや、それを扱ったり調べたりする Python コードに必要となり得る変更を説明します。
ほとんどの場合、以前の Python バージョンで動作していたコードを変更する必要はありません。
アノテーションを付けたコードへの影響¶
例えば静的型チェッカーのためにコードにアノテーションを書いている場合、この変更はおそらく影響しません。 以前の Python バージョンと同じようにアノテーションを書き続けられます。
前方参照のためによく使われる、アノテーション内の文字列を囲む引用符は取り除ける可能性があります。
同様に、アノテーションを文字列で書かずに済むよう from __future__ import annotations を使っている場合も、対応するバージョンを Python 3.14 以降だけにすれば、そのインポートを削除できる可能性があります。
ただし、アノテーションを読み取るサードパーティライブラリに依存している場合は、引用符で囲まないアノテーションを期待どおりに扱えるよう、そのライブラリ側の変更が必要になるかもしれません。
__annotations__ を読み取るコードへの影響¶
オブジェクトの __annotations__ 属性を読み取るコードでは、アノテーションの遅延評価に依存するコードに対応するため、変更を加えたほうがよい場合があります。
例えば、dataclasses モジュールが採用したように、annotationlib.get_annotations() を FORWARDREF 形式で使う方法があります。
外部パッケージ typing_extensions では、Format 列挙型や get_annotations() 関数など、annotationlib モジュールの一部の機能の部分的なバックポートを提供しています。
これらを使うと、Python 3.14 の新しい動作を活用しながら複数のバージョンに対応するコードを書けます。
from __future__ import annotations¶
Python 3.7 で PEP 563 により導入された future 文 from __future__ import annotations は、すべてのアノテーションを文字列に変換します。
しかし、この文は現在非推奨であり、将来の Python バージョンで削除される見込みです。 アノテーションの遅延評価をサポートしない最後のバージョンである Python 3.13 が、2029 年にサポート終了を迎えるまでは削除されません。
Python 3.14 でも、from __future__ import annotations を使うコードの動作は変わりません。
C API の変更¶
Py_Finalize()がすべてのインターンされた文字列を削除するようになりました。 そのため、Py_Finalize()の呼び出し後もインターンされた文字列を保持し、その後Py_Initialize()を呼び出して再利用する C 拡張に対して、後方互換性のない変更になります。 この動作による問題は通常、その後のPy_Initialize()の実行中に未初期化メモリへアクセスし、クラッシュする形で現れます。 修正するには、AddressSanitizer を使ってインターンされた文字列に由来する解放後の使用を特定し、モジュール終了時にその文字列を解放してください。 (Eddie Elizondo が gh-113601 で貢献しました。)Unicode 例外オブジェクト の C API は、例外引数が
UnicodeErrorオブジェクトでない場合にTypeErrorを送出するようになりました。 (Bénédikt Tran が gh-127691 で貢献しました。)
インタープリタは内部で、可能な場合には参照を 借用 してオペランドスタックにオブジェクトを読み込むことで、参照カウントの変更を一部省略します。 このため、以前の Python バージョンと比べて参照カウントが小さくなる場合があります。 関数の引数が他のコードから参照されていないかを判定するために
Py_REFCNT()が1かどうかを調べていた C API 拡張では、より安全な代替としてPyUnstable_Object_IsUniqueReferencedTemporary()を使ってください。公開 C API になった非公開関数:
_PyBytes_Join():PyBytes_Join()_PyLong_IsNegative():PyLong_IsNegative()_PyLong_IsPositive():PyLong_IsPositive()_PyLong_IsZero():PyLong_IsZero()_PyLong_Sign():PyLong_GetSign()_PyUnicodeWriter_Dealloc():PyUnicodeWriter_Discard()_PyUnicodeWriter_Finish():PyUnicodeWriter_Finish()_PyUnicodeWriter_Init():PyUnicodeWriter_Create()を使用_PyUnicodeWriter_Prepare(): (代替なし)_PyUnicodeWriter_PrepareKind(): (代替なし)_PyUnicodeWriter_WriteChar():PyUnicodeWriter_WriteChar()_PyUnicodeWriter_WriteStr():PyUnicodeWriter_WriteStr()_PyUnicodeWriter_WriteSubstring():PyUnicodeWriter_WriteSubstring()_PyUnicode_EQ():PyUnicode_Equal()_PyUnicode_Equal():PyUnicode_Equal()_Py_GetConfig():PyConfig_Get()とPyConfig_GetInt()_Py_HashBytes():Py_HashBuffer()_Py_fopen_obj():Py_fopen()PyMutex_IsLocked():PyMutex_IsLocked()
pythoncapi-compat project を使うと、Python 3.13 以前でもこれらの新しい関数の大半を利用できます。
3.14.5 の主な変更¶
gc¶
本番環境でメモリ使用量が大幅に増加するという 報告 が複数寄せられたため、Python 3.14.0–3.14.4 に搭載されていたインクリメンタルなガベージコレクタを、3.13 の世代別ガベージコレクタに戻しました。 詳しくは ガベージコレクション を参照してください。