What's New In Python 3.12¶
- 編集者:
Adam Turner
この記事では Python 3.11 と比較した Python 3.12 の新機能を解説します。Python 3.12 は2023年10月2日にリリースされました。全詳細については 変更履歴 をご覧ください。
参考
PEP 693 -- Python 3.12 リリーススケジュール
概要 -- リリースハイライト¶
Python 3.12 は Python プログラミング言語の安定版リリースで、言語と標準ライブラリの両方に変更が加えられています。
ライブラリの変更は、非推奨 API の整理、使いやすさ、正確性を重視しています。
特に、distutils パッケージが標準ライブラリから削除されました。
os と pathlib のファイルシステムへの対応がさまざまな点で改善され、いくつかのモジュールの性能も向上しています。
言語の変更は使いやすさを重視しており、f 文字列 の多くの制限が取り除かれ、'Did you mean ...' という候補の提示も引き続き改善されています。
新しい 型引数の構文 と type 文により、静的型チェッカーで ジェネリック型 と 型エイリアス を使いやすくなりました。
この記事は全ての新機能の完全な仕様を提供しようとするものではなく、便利な概要について説明をするものです。 全詳細については、 ライブラリリファレンス や 言語リファレンス などのドキュメントを参照してください。 変更の実装や設計原理について完全に理解したい場合は、特定の新機能の PEP を参照してください。 しかし、一旦機能が完全に実装されると、普通 PEP は最新の状態に保たれないことに注意してください。
新たな構文機能:
新たな文法機能:
インタープリタの改善:
PEP 669, 低影響なモニタリング
NameError,ImportError,SyntaxError例外に対する 'Did you mean ...' サジェストを改善 しました
Python のデータモデルの改善:
標準ライブラリーの顕著な改善
pathlib.Pathクラスがサブクラス化をサポートするようになりましたosモジュールは Windows サポートのためにいくつかの改良が加えられましたsqlite3モジュールに コマンドライン・インターフェース が追加されましたruntime-checkable プロトコルに対するisinstance()のチェックは、2倍~20倍のスピードアップを実現しますasyncioパッケージは多くのパフォーマンスを向上させ、いくつかのベンチマークでは75%のスピードアップを示しました。uuidモジュールに コマンドライン・インターフェース が追加されました
セキュリティの改善:
hashlibに組み込まれた SHA1、SHA3、SHA2-384、SHA2-512、MD5 の実装を、HACL* プロジェクトの形式的に検証されたコードで置き換えました。 これらの組み込み実装は、OpenSSL が該当する実装を提供していない場合にだけ使われる代替実装として残ります。
C API の改善:
CPython の実装の改善:
PEP 709, 内包表記のインライン化
Linux
perfプロファイラの CPython サポートサポートされているプラットフォームでスタック・オーバーフロー保護を実装します
新しい型ヒントの機能:
PEP 698、
@typing.overrideデコレータ
重要な非推奨化、削除または制限:
PEP 623: Python の C API の Unicode オブジェクトから
wstrを削除し、全てのstrオブジェクトのサイズを少なくとも 8 バイト減らしますPEP 632:
distutilsパッケージを削除しました。 提供されていた API の置き換えについては 移行ガイド を参照してください。 Python 3.12 以降でもdistutilsが必要な場合は、引き続きこれを提供するサードパーティパッケージ Setuptools を利用できます。gh-95299:
venvで作成する仮想環境にsetuptoolsをプリインストールしなくなりました。 そのため、distutils、setuptools、pkg_resources、easy_installはデフォルトでは利用できなくなります。 これらを使うには、有効化した 仮想環境でpip install setuptoolsを実行してください。asynchat,asyncore,impモジュールが、いくつかのunittest.TestCaseメソッドのエイリアス と共に削除されました。
新しい機能¶
PEP 695: 型パラメータの構文¶
PEP 484 に基づくジェネリッククラスやジェネリック関数の宣言では、型引数のスコープが不明瞭で、変性を明示的に宣言する必要のある冗長な構文を使っていました。
PEP 695 は ジェネリッククラス と 関数 を作成するための、よりコンパクトで明示的な新しい方法を紹介します:
def max[T](args: Iterable[T]) -> T:
...
class list[T]:
def __getitem__(self, index: int, /) -> T:
...
def append(self, element: T) -> None:
...
さらに、 PEP では 型エイリアス を宣言する新しい方法が導入されました。 type 文を使用し、 TypeAliasType のインスタンスを作成します:
type Point = tuple[float, float]
型エイリアスは ジェネリック とすることもできます:
type Point[T] = tuple[T, T]
新しい構文では、TypeVarTuple と ParamSpec のパラメータに加えて、上限や制約を持つ TypeVar パラメータを宣言できます。
type IntFunc[**P] = Callable[P, int] # ParamSpec
type LabeledTuple[*Ts] = tuple[str, *Ts] # TypeVarTuple
type HashableSequence[T: Hashable] = Sequence[T] # 上限を持つ TypeVar
type IntOrStrSequence[T: (int, str)] = Sequence[T] # 制約を持つ TypeVar
この構文で作成された型エイリアスの値や型変数の境界や制約はオンデマンドで評価されます (遅延評価 を参照してください)。つまり、型エイリアスはファイルの後半で定義された他の型を参照することができます。
型引数リストで宣言した型引数は、宣言のスコープとその内側のスコープで参照でき、外側のスコープでは参照できません。 例えば、ジェネリッククラスのメソッドの型アノテーションやクラス本体で使えますが、クラス定義後のモジュールスコープでは使えません。 型引数の実行時の意味について詳しくは 型パラメータリスト を参照してください。
このようなスコープの規則を実現するため、アノテーションスコープ という新しい種類のスコープを導入しました。 アノテーションスコープはほとんどの点で関数スコープと同じように動作しますが、外側のクラススコープとの関係が異なります。 Python 3.13 では アノテーション もアノテーションスコープで評価されます。
より詳しくは PEP 695 を参照してください。
(PEP は Eric Traut によって作成されました。実装は Jelle Zijlstra, Eric Traut らによって gh-103764 で行われました。)
PEP 701: f-strings の構文的な形式化¶
PEP 701 により f 文字列 の使用上の制限がいくつか取り除かれました。 f 文字列内の式には、正しい Python 式であれば何でも使えるようになりました。 例えば、外側の f 文字列と同じ引用符を使う文字列、複数行の式、コメント、バックスラッシュ、Unicode エスケープシーケンスなどを含められます。 以下で詳しく説明します。
クォートの再利用: Python 3.11 では、 f-string を囲むクォートと同じクォートを再利用すると
SyntaxErrorが発生し、ユーザーは他の利用可能なクォート( f-string がシングルクォートを使用している場合に、ダブルクオートまたはトリプルクォートを使用するなど)を使用する必要があります。 Python 3.12 では次のようなことができるようになりました:>>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism'] >>> f"This is the playlist: {", ".join(songs)}" 'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'
この変更以前は、 f-string のネスト方法に明示的な制限はありませんでしたが、 f-string の式コンポーネント内で文字列引用符を再利用できないという事実により、 f-string を任意にネストすることが不可能になったことに注意してください。実際、これは記述できる中で最もネストされた f-string です。
>>> f"""{f'''{f'{f"{1+1}"}'}'''}""" '2'
f-string には式コンポーネント内に任意の有効な Python 式を含めることができるため、 f-string を任意にネストできるようになりました。
>>> f"{f"{f"{f"{f"{f"{1+1}"}"}"}"}"}" '2'
複数行の式とコメント: Python 3.11 では、f 文字列内の式は 1 行に書く必要がありました。 通常なら複数行にまたがって書ける式 (複数行に分けたリストリテラルなど) でもそうする必要があり、読みにくくなっていました。 Python 3.12 では、複数行にまたがる f 文字列を定義し、インラインコメントも追加できます。
>>> f"This is the playlist: {", ".join([ ... 'Take me back to Eden', # My, my, those eyes like fire ... 'Alkaline', # Not acid nor alkaline ... 'Ascensionism' # Take to the broken skies at last ... ])}" 'This is the playlist: Take me back to Eden, Alkaline, Ascensionism'バックスラッシュと Unicode 文字: Python 3.12 より前は、f 文字列内の式に
\を含められませんでした。 これは Unicode の エスケープシーケンス (\N{snowman}など) にも影響していました。 こうしたエスケープシーケンスには、従来 f 文字列内の式で使えなかった\Nが含まれるためです。 次のような式を定義できるようになりました。>>> print(f"This is the playlist: {"\n".join(songs)}") This is the playlist: Take me back to Eden Alkaline Ascensionism >>> print(f"This is the playlist: {"\N{BLACK HEART SUIT}".join(songs)}") This is the playlist: Take me back to Eden♥Alkaline♥Ascensionism
より詳しくは PEP 701 を参照してください。
この機能を PEG パーサ で f 文字列を解析する形で実装したことにより、エラーメッセージも改善されました。
f 文字列のエラーメッセージがより正確になり、エラーの正確な位置も表示されます。
例えば Python 3.11 では、次の f 文字列が SyntaxError を送出します。
>>> my_string = f"{x z y}" + f"{1 + 1}"
File "<stdin>", line 1
(x z y)
^^^
SyntaxError: f-string: invalid syntax. Perhaps you forgot a comma?
しかし、エラーメッセージは行内の正確なエラーの位置を含まず、また式が人為的に括弧で囲まれています。 Python 3.12 では、 f-string は PEG パーサで解析されるため、エラーメッセージはより正確になり、行全体が表示されます:
>>> my_string = f"{x z y}" + f"{1 + 1}"
File "<stdin>", line 1
my_string = f"{x z y}" + f"{1 + 1}"
^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
(Pablo Galindo、Batuhan Taskaya、Lysandros Nikolaou、Cristián Maureira-Fredes、Marta Gómez が gh-102856 で貢献しました。 PEP は Pablo Galindo、Batuhan Taskaya、Lysandros Nikolaou、Marta Gómez が執筆しました)。
PEP 684: インタープリタごとの GIL¶
PEP 684 ではインタープリタごとの GIL が導入され、インタープリタごとの固有の GIL を使用してサブインタープリタを作成できるようになりました。これにより、 Python プログラムは複数の CPU コアを最大限に活用できるようになります。これは現在 C-API を通じてのみ利用できますが、 Python API は 3.13 で利用可能になる予定です。
独自の GIL を持つインタープリタを作成するには、新しい Py_NewInterpreterFromConfig() 関数を使います:
PyInterpreterConfig config = {
.check_multi_interp_extensions = 1,
.gil = PyInterpreterConfig_OWN_GIL,
};
PyThreadState *tstate = NULL;
PyStatus status = Py_NewInterpreterFromConfig(&tstate, &config);
if (PyStatus_Exception(status)) {
return -1;
}
/* 新しいインタープリタが現在のスレッドでアクティブになりました。 */
インタープリタごとの GIL を持つサブインタープリタ向け C API の使用例については、Modules/_xxsubinterpretersmodule.c も参照してください。
(寄稿: Eric Snow, gh-104210 ほか)
PEP 669: CPython の低影響モニタリング¶
PEP 669 は、プロファイラーやデバッガーなどのツールが CPython のイベントを監視するための新しい API を定義します。
呼び出し、リターン、行の実行、例外、ジャンプなど、幅広いイベントを扱います。
使った機能の分だけコストがかかるため、オーバーヘッドがほぼゼロのデバッガーやカバレッジツールを実現できます。
詳しくは sys.monitoring を参照してください。
(Mark Shannon による gh-103082 での貢献)
PEP 688: バッファプロトコルを Python で利用可能にする¶
PEP 688 は Python のコードから バッファプロトコル を利用する方法を導入します。 __buffer__() メソッドを実装するクラスは今やバッファ型として利用可能です。
新しい ABC collections.abc.Buffer は、例えば型アノテーションでバッファオブジェクトを表す標準的な方法を提供します。
新しい列挙型 inspect.BufferFlags は、バッファの作成方法を調整するフラグを表します。
(Jelle Zijlstra が gh-102500 で貢献しました。)
PEP 709: 内包表記のインライン化¶
辞書、リスト、そして集合の内包表記は今やインライン化され、内包表記の毎回の実行の度に一度しか使われない関数オブジェクトが新規作成されることはなくなります。これにより内包表記の実行は最大2倍速くなります。詳しくは PEP 709 を参照してください。
内包表記の反復変数は引き続き独立しており、外側のスコープの同名の変数を上書きせず、内包表記の後からも参照できません。 ただし、インライン化により外から見える動作がいくつか変わります。
トレースバックに内包表記専用のフレームが表示されなくなり、トレースやプロファイリングでも内包表記が関数呼び出しとして表示されなくなりました。
symtableモジュールが内包表記ごとの子シンボルテーブルを生成しなくなりました。 代わりに、内包表記のローカル変数は親関数のシンボルテーブルに含まれます。内包表記の中で
locals()を呼び出すと、内包表記の外側の変数も含まれるようになりました。 また、内包表記の「引数」のために生成されていた変数.0は含まれなくなりました。locals()を直接反復する内包表記 (例えば[k for k in locals()]) は、トレース下で実行すると (コードカバレッジ測定など)、"RuntimeError: dictionary changed size during iteration" になる場合があります。 これはfor k in locals():などでも既に見られる動作と同じです。 このエラーを避けるには、先に反復するキーのリストを作成してください:keys = list(locals()); [k for k in keys]。
(Carl Meyer and Vladimir Matveev が PEP 709 で貢献しました。)
エラーメッセージの改善¶
NameErrorがトップレベルまで伝播した際にインタープリタが表示するエラーメッセージで、標準ライブラリのモジュールが候補として提示されるようになりました。 (Pablo Galindo が gh-98254 で貢献しました。)>>> sys.version_info Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'sys' is not defined. Did you forget to import 'sys'?
インスタンスに関する
NameError例外の候補提示を改善しました。 メソッドでNameErrorが送出され、例外中の名前と完全に一致する属性をインスタンスが持つ場合、メソッドのスコープで最も近い名前の代わりにself.<NAME>を候補として提示するようになりました。 (Pablo Galindo が gh-99139 で貢献しました。)>>> class A: ... def __init__(self): ... self.blech = 1 ... ... def foo(self): ... somethin = blech ... >>> A().foo() Traceback (most recent call last): File "<stdin>", line 1 somethin = blech ^^^^^ NameError: name 'blech' is not defined. Did you mean: 'self.blech'?
from y import xの代わりにimport x from yと入力した場合のSyntaxErrorのエラーメッセージを改善しました。 (Pablo Galindo が gh-98931 で貢献しました。)>>> import a.y.z from b.y.z Traceback (most recent call last): File "<stdin>", line 1 import a.y.z from b.y.z ^^^^^^^^^^^^^^^^^^^^^^^ SyntaxError: Did you mean to use 'from ... import ...' instead?
from <module> import <name>文の失敗時に送出されるImportError例外で、<module>内の利用可能な名前に基づき<name>の候補を提示するようになりました。 (Pablo Galindo が gh-91058 で貢献しました。)>>> from collections import chainmap Traceback (most recent call last): File "<stdin>", line 1, in <module> ImportError: cannot import name 'chainmap' from 'collections'. Did you mean: 'ChainMap'?
その他の言語変更¶
パーサが、ヌルバイトを含むソースコードを解析する際に
SyntaxErrorを送出するようになりました。 (Pablo Galindo が gh-96670 で貢献しました。)バックスラッシュとそれに続く文字が有効なエスケープシーケンスでない場合、
DeprecationWarningの代わりにSyntaxWarningが出るようになりました。 例えばre.compile("\d+\.\d+")はSyntaxWarningを出します ("\d"は無効なエスケープシーケンスなので、正規表現にはre.compile(r"\d+\.\d+")のように raw 文字列を使ってください)。 将来の Python バージョンでは、SyntaxWarningの代わりにSyntaxErrorが送出されるようになります。 (Victor Stinner が gh-98401 で貢献しました。)Python 3.11 で非推奨になった、値が
0o377より大きい 8 進エスケープ ("\477"など) は、DeprecationWarningの代わりにSyntaxWarningを出すようになりました。 将来の Python バージョンではSyntaxErrorになります。 (Victor Stinner が gh-98401 で貢献しました。)内包表記の代入先部分で使われていても、その変数自体には代入されない変数は、代入式 (
:=) で使えるようになりました。 例えば[(b := 1) for a, b.prop in some_iter]で、bへの代入が認められるようになりました。 ただし、内包表記の代入先部分で実際に代入される変数 (aなど) への代入は、PEP 572 に従い引き続き禁止されています。 (Nikita Sobolev が gh-100581 で貢献しました。)クラスや型の
__set_name__メソッドで送出された例外が、RuntimeErrorで包まれなくなりました。 状況に関する情報は PEP 678 の注記として例外に追加されます。 (Irit Katriel が gh-77757 で貢献しました。)try-except*構文でExceptionGroup全体を処理し、別の例外を 1 つ送出した場合、その例外がExceptionGroupで包まれなくなりました。 この変更はバージョン 3.11.4 にも適用されています。 (Irit Katriel が gh-103590 で貢献しました。)ガベージコレクタは、オブジェクトの割り当て時ではなく、Python のバイトコード評価ループの eval breaker の仕組みによってのみ実行されるようになりました。
PyErr_CheckSignals()の呼び出し時にも GC を実行できるため、Python コードを実行せず長時間動作する必要のある C 拡張にも、定期的に GC を実行する機会があります。 (Pablo Galindo が gh-97922 で貢献しました。)真偽値の引数を取るすべての組み込みおよび拡張の呼び出し可能オブジェクトが、
boolとintだけでなく、任意の型の引数を受け付けるようになりました。 (Serhiy Storchaka が gh-60203 で貢献しました。)memoryviewが半精度浮動小数点型 (書式コード "e") をサポートするようになりました。 (Donghee Na and Antoine Pitrou が gh-90751 で貢献しました。)sliceobjects are now hashable, allowing them to be used as dict keys and set items. (Contributed by Will Bradshaw, Furkan Onder, and Raymond Hettinger in gh-101264.)sum()は、浮動小数点数の和や、整数と浮動小数点数が混在する和の精度と可換性を改善するため、Neumaier の加算アルゴリズムを使うようになりました。 (Raymond Hettinger が gh-100425 で貢献しました。)ast.parse()は、ヌルバイトを含むソースコードを解析する際にValueErrorの代わりにSyntaxErrorを送出するようになりました。 (Pablo Galindo が gh-96670 で貢献しました。)tarfileの展開用メソッドとshutil.unpack_archive()に、新しい filter 引数を追加しました。 展開先ディレクトリの外にファイルを作成するなど、予想外の動作や危険をもたらす可能性のある tar の機能を制限できます。 詳しくは tarfile の展開フィルター を参照してください。 Python 3.14 ではデフォルトが'data'に変わります。 (Petr Viktorin が PEP 706 で貢献しました。)基となるマッピングがハッシュ可能な場合、
types.MappingProxyTypeのインスタンスもハッシュ可能になりました。 (Serhiy Storchaka が gh-87995 で貢献しました。)新しい環境変数
PYTHONPERFSUPPORTとコマンドラインオプション-X perf、および新しい関数sys.activate_stack_trampoline()、sys.deactivate_stack_trampoline()、sys.is_stack_trampoline_active()により、perf プロファイラーへの対応 を追加しました。 (Pablo Galindo が設計しました。 Pablo Galindo と Christian Heimes が、Gregory P. Smith [Google] と Mark Shannon の協力を得て gh-96123 で貢献しました。)
新たなモジュール¶
ありません。
改良されたモジュール¶
array¶
array.arrayクラスが添字指定をサポートし、ジェネリック型 になりました。 (Jelle Zijlstra が gh-98658 で貢献しました。)
asyncio¶
asyncioのソケットへの書き込み性能が大幅に向上しました。asyncioはソケットに書き込む際の不要なコピーを避け、プラットフォームが対応していればsendmsg()を使うようになりました。 (Kumar Aditya が gh-91166 で貢献しました。)イベントループでタスクの即時実行を選択できる
asyncio.eager_task_factory()関数とasyncio.create_eager_task_factory()関数を追加しました。 一部の用途で 2 倍から 5 倍高速になります。 (Jacob Bower と Itamar Oren が gh-102853、gh-104140、gh-104138 で貢献しました。)Linux で
os.pidfd_open()が利用可能で正常に機能する場合、asyncioはデフォルトでasyncio.ThreadedChildWatcherの代わりにasyncio.PidfdChildWatcherを使うようになりました。 (Kumar Aditya が gh-98024 で貢献しました。)イベントループが、各プラットフォームで利用できる最適な子プロセスウォッチャー (対応していれば
asyncio.PidfdChildWatcher、そうでなければasyncio.ThreadedChildWatcher) を使うようになったため、子プロセスウォッチャーを手動で設定することは推奨されません。 (Kumar Aditya が gh-94597 で貢献しました。)asyncio.run()に loop_factory 引数を追加し、独自のイベントループファクトリーを指定できるようにしました。 (Kumar Aditya が gh-99388 で貢献しました。)asyncio.current_task()の C 実装を追加し、4 倍から 6 倍高速化しました。 (Itamar Oren and Pranav Thulasiram Bhat が gh-100344 で貢献しました。)asyncioが従来のジェネレータベースのコルーチンをサポートしていないため、asyncio.iscoroutine()はジェネレータに対してFalseを返すようになりました。 (Kumar Aditya が gh-102748 で貢献しました。)asyncio.wait()とasyncio.as_completed()が、タスクを yield するジェネレータを受け付けるようになりました。 (Kumar Aditya が gh-78530 で貢献しました。)
calendar¶
月と曜日を定義する列挙型
calendar.Monthとcalendar.Dayを追加しました。 (Prince Roshan が gh-103636 で貢献しました。)
csv¶
readerオブジェクトとwriterオブジェクトによるNoneと空文字列の扱いをより細かく制御するため、csv.QUOTE_NOTNULLフラグとcsv.QUOTE_STRINGSフラグを追加しました。
dis¶
擬似命令のオペコード (コンパイラーで使われるものの、実行可能なバイトコードには現れないもの) が
disモジュールで公開されました。HAVE_ARGUMENTは実際のオペコードでは引き続き意味がありますが、擬似命令には役立ちません。 代わりに、新しいdis.hasargコレクションを使ってください。 (Irit Katriel が gh-94216 で貢献しました。)例外ハンドラーを設定する命令を示す
dis.hasexcコレクションを追加しました。 (Irit Katriel が gh-94216 で貢献しました。)
fractions¶
fractions.Fraction型のオブジェクトが、浮動小数点数と同じ形式の書式化をサポートするようになりました。 (Mark Dickinson が gh-100161 で貢献しました。)
importlib.resources¶
importlib.resources.as_file()がリソースディレクトリをサポートするようになりました。 (Jason R. Coombs が gh-97930 で貢献しました。)importlib.resources.files()の最初の引数の名前を anchor に変更しました。 (Jason R. Coombs が gh-100598 で貢献しました。)
inspect¶
コルーチン を返す同期関数に印を付け、
inspect.iscoroutinefunction()で判定できるようにするinspect.markcoroutinefunction()を追加しました。 (Carlton Gibson が gh-99247 で貢献しました。)非同期ジェネレータの現在の状態を調べる
inspect.getasyncgenstate()とinspect.getasyncgenlocals()を追加しました。 (Thomas Krennwallner が gh-79940 で貢献しました。)inspect.getattr_static()の性能が大幅に向上しました。 ほとんどの呼び出しで、Python 3.11 に比べて少なくとも 2 倍高速になるはずです。 (Alex Waygood が gh-103193 で貢献しました。)
itertools¶
要素を同じ大きさのタプルにまとめる
itertools.batched()を追加しました。 最後のバッチは他より短くなる場合があります。 (Raymond Hettinger が gh-98363 で貢献しました。)
math¶
積の和を計算する
math.sumprod()を追加しました。 (Raymond Hettinger が gh-100485 で貢献しました。)math.nextafter()に steps 引数を追加し、一度に複数ステップ上下に移動できるようにしました。 (Matthias Goergens, Mark Dickinson, and Raymond Hettinger が gh-94906 で貢献しました。)
os¶
os.pidfd_open()でプロセスのファイル記述子を非ブロッキングモードで開くためのos.PIDFD_NONBLOCKを追加しました。 (Kumar Aditya が gh-93312 で貢献しました。)os.DirEntryに、エントリーがジャンクションかどうかを調べるos.DirEntry.is_junction()メソッドを追加しました。 (Charles Machalow が gh-99547 で貢献しました。)Windows でドライブ、ボリューム、マウントポイントを列挙する
os.listdrives()、os.listvolumes()、os.listmounts()関数を追加しました。 (Steve Dower が gh-102519 で貢献しました。)Windows で
os.stat()とos.lstat()の結果がより正確になりました。st_birthtimeフィールドにはファイルの作成時刻が格納されるようになりました。st_ctimeは非推奨ですが、引き続き作成時刻が格納されます (将来は他のプラットフォームとの一貫性のため、メタデータの最終変更時刻を返すようになります)。 ファイルシステムによってはst_devが最大 64 ビット、st_inoが最大 128 ビットになり、st_rdevには誤った値ではなく常にゼロが設定されます。 新しい Windows リリースでは、どちらの関数も大幅に高速になる可能性があります。 (Steve Dower が gh-99726 で貢献しました。)
os.path¶
指定したパスがジャンクションかどうかを調べる
os.path.isjunction()を追加しました。 (Charles Machalow が gh-99547 で貢献しました。)パスを 3 つ組
(drive, root, tail)に分割するos.path.splitroot()を追加しました。 (Barney Gale が gh-101000 で貢献しました。)
pathlib¶
pathlib.PurePathとpathlib.Path、およびそれらの Posix 向け・Windows 向けのクラスが、サブクラス化をサポートするようになりました。 サブクラスではpathlib.PurePath.with_segments()メソッドをオーバーライドして、パスのインスタンス間で情報を引き継げます。os.walk()と同様にディレクトリツリーを走査して、その中のすべてのファイル名やディレクトリ名を生成するpathlib.Path.walk()を追加しました。 (Stanislav Zmiev が gh-90385 で貢献しました。)pathlib.PurePath.relative_to()に省略可能な walk_up 引数を追加し、結果に..を挿入できるようにしました。 この動作はos.path.relpath()により近いものです。 (Domenico Ragusa が gh-84538 で貢献しました。)os.path.isjunction()の処理を呼び出すpathlib.Path.is_junction()を追加しました。 (Charles Machalow が gh-99547 で貢献しました。)pathlib.Path.glob()、pathlib.Path.rglob()、pathlib.PurePath.match()に省略可能な case_sensitive 引数を追加しました。 パスの大文字・小文字を区別するかどうかを指定し、マッチ処理をより正確に制御できます。
platform¶
Windows 11 と Windows Server 2012 より後のリリースの検出をサポートしました。 従来、Windows Server 2012 より新しい Windows Server や Windows 11 では、調べると
Windows-10が返されていました。 (Steve Dower が gh-89545 で貢献しました。)
pdb¶
デバッグセッション中に値を一時的に保持し、現在のフレームや戻り値などへ素早くアクセスできるコンビニエンス変数を追加しました。 (Tian Gao が gh-103693 で貢献しました。)
random¶
random.binomialvariate()を追加しました。 (Raymond Hettinger が gh-81620 で貢献しました。)random.expovariate()にデフォルト値lambd=1.0を追加しました。 (Raymond Hettinger が gh-100234 で貢献しました。)
shutil¶
shutil.make_archive()は、対応している独自のアーカイバーに root_dir 引数を渡すようになりました。 この場合、アーカイブ作成のためにプロセスの現在の作業ディレクトリを一時的に root_dir に変更することはなくなりました。 (Serhiy Storchaka が gh-74696 で貢献しました。)shutil.rmtree()が新しい引数 onexc を受け付けるようになりました。 onerror と同様のエラーハンドラーですが、(typ, val, tb) という 3 つ組の代わりに例外インスタンスを受け取ります。 onerror は非推奨になりました。 (Irit Katriel が gh-102828 で貢献しました。)Windows で
shutil.which()が PATH 内の一致するファイルを探す際に、指定された cmd にディレクトリ部分が含まれる場合でも、環境変数 PATHEXT を参照するようになりました。 (Charles Machalow が gh-103179 で貢献しました。)shutil.which()は Windows で実行ファイルを探す際にNeedCurrentDirectoryForExePathWを呼び出し、現在の作業ディレクトリを検索パスの先頭に追加すべきかを判断するようになりました。 (Charles Machalow が gh-103179 で貢献しました。)Windows で
shutil.which()は、検索パスの他の場所にある cmd そのものと一致するパスよりも、PATHEXTの要素を cmd に付けて一致するパスを優先して返すようになりました。 (Charles Machalow が gh-103179 で貢献しました。)
sqlite3¶
コマンドラインインターフェース を追加しました。 (Erlend E. Aasland が gh-77617 で貢献しました。)
sqlite3.Connectionにsqlite3.Connection.autocommit属性を、sqlite3.connect()に autocommit 引数を追加しました。 PEP 249 に準拠した トランザクション処理 を制御できます。 (Erlend E. Aasland が gh-83638 で貢献しました。)sqlite3.Connection.load_extension()にキーワード専用引数 entrypoint を追加し、SQLite 拡張のエントリーポイントを指定して上書きできるようにしました。 (Erlend E. Aasland が gh-103015 で貢献しました。)sqlite3.Connectionに、データベース接続の設定を変更するsqlite3.Connection.getconfig()とsqlite3.Connection.setconfig()を追加しました。 (Erlend E. Aasland が gh-103489 で貢献しました。)
statistics¶
statistics.correlation()にrankedという計算方法を追加し、順位データのスピアマンの相関係数を計算できるようにしました。 (Raymond Hettinger が gh-95861 で貢献しました。)
sys¶
PEP 669 の新しいモニタリング API を公開する
sys.monitoring名前空間を追加しました。 (Mark Shannon が gh-103082 で貢献しました。)スタックプロファイラーのトランポリンを有効・無効にする
sys.activate_stack_trampoline()とsys.deactivate_stack_trampoline()、および有効かどうかを調べるsys.is_stack_trampoline_active()を追加しました。 (Pablo Galindo and Christian Heimes with contributions from Gregory P. Smith [Google] and Mark Shannon が gh-96123 で貢献しました。)最後に送出されて未処理となった例外を保持する
sys.last_excを追加しました (事後デバッグ用)。 同じ情報を従来の形式で保持していた 3 つのフィールド、sys.last_type、sys.last_value、sys.last_tracebackは非推奨になりました。 (Irit Katriel が gh-102778 で貢献しました。)sys._current_exceptions()が、スレッド ID から(typ, exc, tb)タプルへのマッピングではなく、例外インスタンスへのマッピングを返すようになりました。 (Irit Katriel が gh-103176 で貢献しました。)sys.setrecursionlimit()とsys.getrecursionlimit()の再帰上限は、Python コードだけに適用されるようになりました。 組み込み関数はこの再帰上限を使わず、再帰による仮想マシンのクラッシュを防ぐ別の仕組みで保護されます。
tempfile¶
tempfile.NamedTemporaryFile関数に、省略可能な引数 delete_on_close を追加しました。 (Evgeny Zorin が gh-58451 で貢献しました。)tempfile.mkdtemp()は、dir 引数に相対パスを渡した場合でも、常に絶対パスを返すようになりました。
threading¶
呼び出し元だけでなく、実行中のすべてのスレッドにトレース関数やプロファイル関数を設定する
threading.settrace_all_threads()とthreading.setprofile_all_threads()を追加しました。 (Pablo Galindo が gh-93503 で貢献しました。)
tkinter¶
tkinter.Canvas.coords()が引数の入れ子を平坦化するようになりました。 座標を個別の引数 (x1, y1, x2, y2, ...) やシーケンス ([x1, y1, x2, y2, ...]) として受け取るだけでなく、create_*()メソッドと同様に、ペアにまとめた座標 ((x1, y1), (x2, y2), ...や[(x1, y1), (x2, y2), ...]) も受け付けるようになりました。 (Serhiy Storchaka が gh-94473 で貢献しました。)
tokenize¶
tokenizeモジュールに PEP 701 で導入された変更を反映しました。 (Marta Gómez Macías と Pablo Galindo が gh-102856 で貢献しました。)tokenizeモジュールの変更について詳しくは Python 3.12 への移植 を参照してください。
types¶
ユーザー定義のジェネリック型 をサブクラス化した際に、その情報をより詳しく調べるための
types.get_original_bases()を追加しました。 (James Hilton-Balfe and Alex Waygood が gh-101827 で貢献しました。)
typing¶
実行時チェック可能なプロトコルに対するisinstance()のチェックでは、属性の存在確認にhasattr()ではなくinspect.getattr_static()を使うようになりました。 これにより、実行時チェック可能なプロトコルに対するisinstance()チェック中に、デスクリプタや__getattr__()メソッドが予期せず評価されることがなくなります。 ただし、従来は実行時チェック可能なプロトコルのインスタンスと見なされていたオブジェクトが、Python 3.12 以降ではそう見なされなくなる場合や、その逆の場合もあります。 ほとんどの利用者はこの変更の影響を受けないと考えられます。 (Alex Waygood が gh-102433 で貢献しました。)実行時チェック可能なプロトコルのメンバーは、クラスが作成された時点で「固定」されたものとして扱われるようになりました。 実行時チェック可能なプロトコルの属性をモンキーパッチで変更することは引き続きできますが、オブジェクトとそのプロトコルを比較する
isinstance()チェックには影響しません。 例えば、次のとおりです。>>> from typing import Protocol, runtime_checkable >>> @runtime_checkable ... class HasX(Protocol): ... x = 1 ... >>> class Foo: ... ... >>> f = Foo() >>> isinstance(f, HasX) False >>> f.x = 1 >>> isinstance(f, HasX) True >>> HasX.y = 2 >>> isinstance(f, HasX) # HasX に "y" 属性が加わっても結果は変わらない True
この変更は、実行時チェック可能なプロトコルに対する
isinstance()チェックを高速化するために行われました。実行時チェック可能なプロトコルに対するisinstance()チェックの性能特性が大きく変わりました。 メンバーが少ないプロトコルに対するisinstance()チェックの大半は、3.11 と比べて少なくとも 2 倍高速になり、中には 20 倍以上高速になるものもあります。 ただし、メンバーが多いプロトコルに対するisinstance()チェックは、Python 3.11 より遅くなる場合があります。 (Alex Waygood が gh-74690 and gh-103193 で貢献しました。)すべての
typing.TypedDictクラスとtyping.NamedTupleクラスが__orig_bases__属性を持つようになりました。 (Adrian Garcia Badaracco が gh-103699 で貢献しました。)@typing.dataclass_transformにfrozen_default引数を追加しました。 (Erik De Bonte が gh-99957 で貢献しました。)
unicodedata¶
Unicode データベースをバージョン 15.0.0 に更新しました。 (Benjamin Peterson が gh-96734 で貢献しました)。
unittest¶
最も時間がかかったテストケースを N 件表示するコマンドラインオプション --durations を追加しました。
python3 -m unittest --durations=3 test.test_threading
.....
Slowest test durations
----------------------------------------------------------------------
1.210s test_timeout (test.test_threading.BarrierTests)
1.003s test_default_timeout (test.test_threading.BarrierTests)
0.518s test_timeout (test.test_threading.EventTests)
(0.000 durations hidden. Use -v to show these durations.)
----------------------------------------------------------------------
Ran 158 tests in 9.869s
OK (skipped=3)
(Giampaolo Rodola が gh-48330 で貢献しました。)
uuid¶
コマンドラインインターフェース を追加しました。 (Adam Chhina が gh-88597 で貢献しました。)
最適化¶
Unicode オブジェクトから
wstrメンバーとwstr_lengthメンバーを削除しました。 64 ビットプラットフォームでは、オブジェクトのサイズが 8 または 16 バイト小さくなります。 (PEP 623) (Inada Naoki が gh-92536 で貢献しました。)ビルド処理で BOLT バイナリオプティマイザーを使う実験的なサポートを追加しました。 性能が 1~5% 向上します。 (Kevin Modzelewski が gh-90536 で貢献し、Donghee Na が gh-101525 で調整しました。)
グループ参照を含む置換文字列を使う正規表現の置換 (
re.sub()関数、re.subn()関数、および対応するre.Patternのメソッド) を 2~3 倍高速化しました。 (Serhiy Storchaka が gh-91524 で貢献しました。)コストの高い文字列の書式化を遅らせることで、
asyncio.Taskの作成を高速化しました。 (Itamar Oren が gh-103793 で貢献しました。)tokenizeモジュールで PEP 701 に対応するための変更に伴い、tokenize.tokenize()関数とtokenize.generate_tokens()関数が最大 64% 高速になりました。 (Marta Gómez Macías and Pablo Galindo が gh-102856 で貢献しました。)新しい
LOAD_SUPER_ATTR命令により、super()を経由したメソッド呼び出しと属性の読み込みを高速化しました。 (Carl Meyer and Vladimir Matveev が gh-103497 で貢献しました。)
CPython バイトコードの変更¶
LOAD_METHOD命令を削除し、LOAD_ATTRに統合しました。LOAD_ATTRは、oparg の最下位ビットがセットされている場合、従来のLOAD_METHOD命令と同じように動作します。 (Ken Jin が gh-93429 で貢献しました。)JUMP_IF_FALSE_OR_POP命令とJUMP_IF_TRUE_OR_POP命令を削除しました。 (Irit Katriel が gh-102859 で貢献しました。)PRECALL命令を削除しました。 (Mark Shannon が gh-92925 で貢献しました。)BINARY_SLICE命令とSTORE_SLICE命令を追加しました。 (Mark Shannon が gh-94163 で貢献しました。)CALL_INTRINSIC_1命令を追加しました。 (Mark Shannon が gh-99005 で貢献しました。)CALL_INTRINSIC_2命令を追加しました。 (Irit Katriel が gh-101799 で貢献しました。)CLEANUP_THROW命令を追加しました。 (Brandt Bucher が gh-90997 で貢献しました。)END_SEND命令を追加しました。 (Mark Shannon が gh-103082 で貢献しました。)PEP 709 の実装の一部として、
LOAD_FAST_AND_CLEAR命令を追加しました。 (Carl Meyer が gh-101441 で貢献しました。)LOAD_FAST_CHECK命令を追加しました。 (Dennis Sweeney が gh-93143 で貢献しました。)PEP 695 の実装の一部として、
LOAD_FROM_DICT_OR_DEREF、LOAD_FROM_DICT_OR_GLOBALS、LOAD_LOCALSオペコードを追加しました。LOAD_CLASSDEREFオペコードを削除しました。 これはLOAD_LOCALSとLOAD_FROM_DICT_OR_DEREFの組み合わせで置き換えられます。 (Jelle Zijlstra が gh-103764 で貢献しました。)LOAD_SUPER_ATTR命令を追加しました。 (Carl Meyer and Vladimir Matveev が gh-103497 で貢献しました。)RETURN_CONST命令を追加しました。 (Wenyang Wang が gh-101632 で貢献しました。)
デモとツール¶
古いデモスクリプトを含む
Tools/demo/ディレクトリを削除しました。 コピーは old-demos プロジェクト にあります。 (Victor Stinner が gh-97681 で貢献しました。)Tools/scripts/ディレクトリの古くなったサンプルスクリプトを削除しました。 コピーは old-demos プロジェクト にあります。 (Victor Stinner が gh-97669 で貢献しました。)
非推奨¶
argparse:argparse.BooleanOptionalActionの type、choices、metavar 引数が非推奨になり、3.14 で削除される予定です。 (Nikita Sobolev が gh-92248 で貢献しました。)ast: 以下のastの機能は、Python 3.8 からドキュメントで非推奨とされていましたが、今回から実行時にアクセスまたは使用するとDeprecationWarningを出すようになりました。 Python 3.14 で削除される予定です。ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
代わりに
ast.Constantを使ってください。 (Serhiy Storchaka が gh-90953 で貢献しました。)-
子プロセスウォッチャーのクラス
asyncio.MultiLoopChildWatcher、asyncio.FastChildWatcher、asyncio.AbstractChildWatcher、asyncio.SafeChildWatcherが非推奨になり、Python 3.14 で削除される予定です。 (Kumar Aditya が gh-94597 で貢献しました。)asyncio.set_child_watcher()、asyncio.get_child_watcher()、asyncio.AbstractEventLoopPolicy.set_child_watcher()、asyncio.AbstractEventLoopPolicy.get_child_watcher()が非推奨になり、Python 3.14 で削除される予定です。 (Kumar Aditya が gh-94597 で貢献しました。)デフォルトのイベントループポリシーの
get_event_loop()メソッドは、現在のイベントループが設定されておらず、新たに作成する場合にDeprecationWarningを出すようになりました。 (Serhiy Storchaka and Guido van Rossum が gh-100160 で貢献しました。)
calendar: 定数calendar.Januaryとcalendar.Februaryが非推奨になり、calendar.JANUARYとcalendar.FEBRUARYで置き換えられました。 (Prince Roshan が gh-103636 で貢献しました。)collections.abc:collections.abc.ByteStringが非推奨になりました。実行時に
objが バッファプロトコル を実装しているか調べるには、isinstance(obj, collections.abc.Buffer)を使ってください。 型アノテーションにはBufferを使うか、コードが対応する型を明示したユニオン (例えばbytes | bytearray | memoryview) を使ってください。ByteStringは当初、bytesとbytearrayの両方の上位型となる抽象クラスとして意図されていました。 しかし、この ABC はメソッドを一つも持たないため、あるオブジェクトがByteStringのインスタンスだと分かっても、そのオブジェクトに関する有用な情報は何も得られませんでした。memoryviewなど、他の一般的なバッファ型も、実行時にも静的型チェッカーによってもByteStringのサブタイプとして認識されることはありませんでした。datetime:datetime.datetimeのutcnow()とutcfromtimestamp()が非推奨になり、将来のバージョンで削除される予定です。 代わりに、UTC の日時を表すにはタイムゾーン情報を持つオブジェクトを使ってください。 それぞれnow()とfromtimestamp()を、tz 引数にdatetime.UTCを指定して呼び出してください。 (Paul Ganssle が gh-103857 で貢献しました。)email:email.utils.localtime()の isdst 引数が非推奨になりました。 (Alan Williams が gh-72346 で貢献しました。)importlib.abc: 以下のクラスが非推奨になり、Python 3.14 で削除予定です。importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
代わりに
importlib.resources.abcのクラスを使ってください。(Jason R. Coombs と Hugo van Kemenade が gh-93963 で貢献しました。)
itertools: コピー、深いコピー、pickle 化のサポートが非推奨になりました。 この機能はドキュメントに記載されておらず、非効率で、以前からバグが多く、一貫性もありませんでした。 コード量と保守の負担を大幅に減らすため、3.14 で削除される予定です。 (Raymond Hettinger が gh-101588 で貢献しました。)multiprocessing: Python 3.14 では、Linux、BSD、および現在'fork'がデフォルトの macOS 以外の POSIX プラットフォームで、multiprocessingのデフォルトの開始方式がより安全なものに変わります (gh-84559)。 ほとんどのコードでは影響を受けないと考えられるため、この変更について実行時に警告を出すのは混乱が大きすぎると判断されました。 コードが'fork'を 必要とする 場合は、get_context()またはset_start_method()API で明示的に指定してください。 コンテキストと開始方式 を参照してください。pkgutil:pkgutil.find_loader()とpkgutil.get_loader()が非推奨になり、Python 3.14 で削除される予定です。 代わりにimportlib.util.find_spec()を使ってください。 (Nikita Sobolev が gh-97850 で貢献しました。)pty: ドキュメントに記載のないmaster_open()とslave_open()という 2 つの関数は Python 2 から非推奨でしたが、3.12 で初めてDeprecationWarningを出すようになりました。 3.14 で削除される予定です。 (Soumendra Ganguly and Gregory P. Smith が gh-85984 で貢献しました。)os:Windows で
os.stat()とos.lstat()が返すst_ctimeフィールドが非推奨になりました。 将来のリリースでは、他のプラットフォームと同じくメタデータの最終変更時刻が格納されるようになります。 現在は引き続き作成時刻が格納されますが、この値は新しいst_birthtimeフィールドでも取得できます。 (Steve Dower が gh-99726 で貢献しました。)POSIX プラットフォームでは、マルチスレッドのプロセスから呼び出されたことを検出できた場合、
os.fork()がDeprecationWarningを出すことがあります。 こうした呼び出しは、たとえコードが動作している ように見えても、以前から POSIX プラットフォームと根本的に相容れないものでした。 このようなコードで問題に遭遇する機会が増えているため、注意を促す警告を追加しました。 詳細についてはos.fork()のドキュメントを参照してください。 また、以前からあるこのプラットフォーム互換性の問題を なぜ 今開発者に伝えるのかについては、fork とスレッドの非互換性に関する議論 を参照してください。
multiprocessingまたはconcurrent.futuresの使用によってこの警告が出る場合は、multiprocessingの開始方式を"spawn"や"forkserver"などに変更してください。shutil:shutil.rmtree()の onerror 引数が非推奨になりました。 代わりに onexc を使ってください。 (Irit Katriel が gh-102828 で貢献しました。)-
デフォルトのアダプターとコンバーター が非推奨になりました。 代わりに 適合関数と変換関数のレシピ集 を用途に合わせて調整して使ってください。 (Erlend E. Aasland が gh-90016 で貢献しました。)
execute()で 名前付きプレースホルダー を使い、パラメータをdictではなく シーケンス として渡すと、DeprecationWarningが出るようになりました。 Python 3.14 からは、名前付きプレースホルダーとともにシーケンスでパラメータを渡すとProgrammingErrorが送出されるようになります。 (Erlend E. Aasland が gh-101698 で貢献しました。)
sys:sys.last_type、sys.last_value、sys.last_tracebackフィールドが非推奨になりました。 代わりにsys.last_excを使ってください。 (Irit Katriel が gh-102778 で貢献しました。)tarfile: filter を指定せずに tar アーカイブを展開することは、'data'フィルターがデフォルトになる Python 3.14 まで非推奨です。 詳しくは 展開フィルター を参照してください。-
それぞれ
collections.abc.Hashableとcollections.abc.Sizedの別名であるtyping.Hashableとtyping.Sizedが非推奨になりました。 (gh-94309。)Python 3.9 から非推奨だった
typing.ByteStringが、使用時にDeprecationWarningを出すようになりました。 (Alex Waygood が gh-91896 で貢献しました。)
xml.etree.ElementTree:xml.etree.ElementTree.Elementの真偽値を調べるとDeprecationWarningが出るようになりました。 従来は Python 実装ではFutureWarningが出て、C 実装では何も出ませんでした。 (Jacob Walls が gh-83122 で貢献しました。)コルーチンの throw()、ジェネレータの throw()、非同期ジェネレータの throw()の 3 引数 (type、value、traceback) のシグネチャが非推奨になり、将来の Python バージョンで削除される可能性があります。 代わりに引数が 1 つの形式を使ってください。 (Ofey Chan が gh-89874 で貢献しました。)モジュールの
__package__が__spec__.parentと異なる場合、従来のImportWarningの代わりにDeprecationWarningが出るようになりました。 (Brett Cannon が gh-65961 で貢献しました。)Setting
__package__or__cached__on a module is deprecated, and will cease to be set or taken into consideration by the import system in Python 3.14. (Contributed by Brett Cannon in gh-65961.)bool に対するビット単位の反転演算子 (
~) が非推奨になりました。 Python 3.16 ではエラーになります。 bool の論理否定には、代わりにnotを使ってください。 元のintのビット単位の反転が本当に必要になるまれな場合には、~int(x)のように明示的に int に変換してください。 (Tim Hoffmann が gh-103487 で貢献しました。)コードオブジェクトの
codeobject.co_lnotabへのアクセスは PEP 626 により Python 3.10 で非推奨になりましたが、3.12 で初めてDeprecationWarningを出すようになりました。 3.15 で削除される可能性があります。 (Nikita Sobolev が gh-101866 で貢献しました。)
Python 3.13 で削除予定¶
モジュール(PEP 594 を参照):
aifcaudioopcgicgitbchunkcryptimghdrmailcapmsilibnisnntplibossaudiodevpipessndhdrspwdsunautelnetlibuuxdrlib
その他のモジュール:
lib2to3と 2to3 プログラム (gh-84540)
API
configparser.LegacyInterpolation(gh-90765)locale.resetlocale()(gh-90817)turtle.RawTurtle.settiltangle()(gh-50096)unittest.findTestCases()(gh-50096)unittest.getTestCaseNames()(gh-50096)unittest.makeSuite()(gh-50096)unittest.TestProgram.usageExit()(gh-67048)webbrowser.MacOSX(gh-86421)classmethodのデスクリプタの連鎖 (gh-89519)
Python 3.14 で削除予定¶
argparse:argparse.BooleanOptionalActionの type、choices、metavar 引数が非推奨になり、3.14 で削除される予定です。 (Nikita Sobolev が gh-92248 で貢献しました。)ast:以下の機能は Python 3.8 からドキュメントで非推奨とされていましたが、アクセスや使用をすると実行時にDeprecationWarningが出るようになりました。 Python 3.14 で削除されます:ast.Numast.Strast.Bytesast.NameConstantast.Ellipsis
代わりに
ast.Constantを使ってください。 (Serhiy Storchaka が gh-90953 で貢献しました。)-
子プロセスウォッチャーのクラス
asyncio.MultiLoopChildWatcher、asyncio.FastChildWatcher、asyncio.AbstractChildWatcher、asyncio.SafeChildWatcherが非推奨になり、Python 3.14 で削除される予定です。 (Kumar Aditya が gh-94597 で貢献しました。)asyncio.set_child_watcher()、asyncio.get_child_watcher()、asyncio.AbstractEventLoopPolicy.set_child_watcher()、asyncio.AbstractEventLoopPolicy.get_child_watcher()が非推奨になり、Python 3.14 で削除される予定です。 (Kumar Aditya が gh-94597 で貢献しました。)デフォルトのイベントループポリシーの
get_event_loop()メソッドは、現在のイベントループが設定されておらず、新たに作成する場合にDeprecationWarningを出すようになりました。 (Serhiy Storchaka and Guido van Rossum が gh-100160 で貢献しました。)
email:email.utils.localtime()のisdstパラメータは非推奨になりました。 (Alan Williams が gh-72346 で貢献しました。)importlib.abcの非推奨のクラス:importlib.abc.ResourceReaderimportlib.abc.Traversableimportlib.abc.TraversableResources
代わりに
importlib.resources.abcのクラスを使ってください。(Jason R. Coombs と Hugo van Kemenade が gh-93963 で貢献しました。)
itertoolsは copy、deepcopy、pickle の操作をサポートしていましたが、ドキュメント化されておらず、非効率で、以前からバグが多く、一貫性もありませんでした。 コード量と保守の負担を大幅に減らすため、このサポートは 3.14 で削除されます。 (Raymond Hettinger が gh-101588 で貢献しました。)multiprocessing:Linux、BSD、および現在'fork'がデフォルトとなっている macOS 以外の POSIX プラットフォームでは、デフォルトの開始方式がより安全なものに変わります (gh-84559)。 ほとんどのコードでは影響を受けないと考えられるため、この変更について実行時に警告を出すのは混乱が大きすぎると判断されました。 コードが'fork'を 必要とする 場合は、get_context()またはset_start_method()API で明示的に指定してください。 コンテキストと開始方式 を参照してください。pathlib:is_relative_to()とrelative_to()に追加の引数を渡すことは非推奨です。pkgutil:pkgutil.find_loader()とpkgutil.get_loader()はDeprecationWarningを出すようになりました。 代わりにimportlib.util.find_spec()を使ってください。 (Nikita Sobolev が gh-97850 で貢献しました。)pty:master_open():pty.openpty()を使ってください。slave_open():pty.openpty()を使ってください。
-
versionとversion_info。execute()とexecutemany()で、名前付きプレースホルダー を使い、parametersにdictではなくシーケンスを渡すこと。
urllib:urllib.parse.Quoterは非推奨です。 公開 API として意図されたものではありませんでした。 (Gregory P. Smith が gh-88168 で貢献しました。)
Python 3.15 で削除予定¶
インポートシステム:
モジュールの
__spec__.cachedを設定せずに__cached__を設定することは非推奨です。 Python 3.15 では、インポートシステムや標準ライブラリは__cached__を設定しなくなり、その値も参照しなくなります。 (gh-97879)モジュールの
__spec__.parentを設定せずに__package__を設定することは非推奨です。 Python 3.15 では、インポートシステムや標準ライブラリは__package__を設定しなくなり、その値も参照しなくなります。 (gh-97879)
-
ドキュメント化されていない
ctypes.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.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()を使ってください。
削除¶
asynchat と asyncore¶
configparser¶
configparserで 3.2 の時点から非推奨だった以下の名前を、gh-89336 に従って削除しました。configparser.ParsingErrorのfilename属性と引数を削除しました。 代わりにsource属性と引数を使ってください。configparserのSafeConfigParserクラスを削除しました。 代わりに短い名前のConfigParserを使ってください。configparser.ConfigParserのreadfpメソッドを削除しました。 代わりにread_file()を使ってください。
distutils¶
ensurepip¶
ensurepipに同梱していた setuptools の wheel を削除し、venvで作成する環境に setuptools をインストールしなくなりました。pip (>= 22.1)は、実行環境への setuptools のインストールを必要としません。 pip はパッケージのビルドに使う環境にsetuptoolsを用意するため、setuptoolsベース (およびdistutilsベース) のパッケージも引き続きpip installで利用できます。easy_install、pkg_resources、setuptools、distutilsはsetuptoolsパッケージの一部であるため、venvで作成した環境やensurepipで初期設定した環境には、デフォルトで提供されなくなりました。 実行時にこれらに依存するプロジェクトでは、setuptoolsプロジェクトを依存関係として宣言し、別途インストールする必要があります (通常は pip を使います)。(Pradyun Gedam が gh-95299 で貢献しました。)
enum¶
ftplib¶
gzip¶
gzipのgzip.GzipFileから、Python 2.6 から非推奨だったfilename属性を削除しました。 代わりにname属性を使ってください。 書き込みモードでは、filename属性はファイル拡張子'.gz'がなければ追加していました。 (Victor Stinner が gh-94196 で貢献しました。)
hashlib¶
hashlibのhashlib.pbkdf2_hmac()から、Python 3.10 で非推奨になった純 Python 実装を削除しました。 Python 3.10 以降には OpenSSL 1.1.1 が必要です (PEP 644)。 このバージョンの OpenSSL は、より高速なpbkdf2_hmac()の C 実装を提供します。 (Victor Stinner が gh-94199 で貢献しました。)
importlib¶
importlibで以前から非推奨だった機能の整理を、多くの箇所で完了しました。module_repr()への参照とサポートを削除しました。 (Barry Warsaw が gh-97850 で貢献しました。)importlib.util.set_package、importlib.util.set_loader、importlib.util.module_for_loaderをすべて削除しました。 (Brett Cannon and Nikita Sobolev が gh-65961 and gh-97850 で貢献しました。)find_loader()API とfind_module()API のサポートを削除しました。 (Barry Warsaw が gh-98040 で貢献しました。)importlib.abc.Finder、pkgutil.ImpImporter、pkgutil.ImpLoaderを削除しました。 (Barry Warsaw が gh-98040 で貢献しました。)
imp¶
impモジュールを削除しました。 (Barry Warsaw が gh-98040 で貢献しました。)移行には、以下の対応表を参照してください。
imp
importlib
imp.NullImportersys.path_importer_cacheにNoneを挿入するimp.cache_from_source()imp.find_module()imp.get_magic()imp.get_suffixes()importlib.machinery.SOURCE_SUFFIXES、importlib.machinery.EXTENSION_SUFFIXES、importlib.machinery.BYTECODE_SUFFIXESimp.get_tag()imp.load_module()imp.new_module(name)types.ModuleType(name)imp.reload()imp.source_from_cache()imp.load_source()下記を参照
imp.load_source()を次のコードで置き換えてください。import importlib.util import importlib.machinery def load_source(modname, filename): loader = importlib.machinery.SourceFileLoader(modname, filename) spec = importlib.util.spec_from_file_location(modname, filename, loader=loader) module = importlib.util.module_from_spec(spec) # モジュールは常に実行され、sys.modules にはキャッシュされない。 # モジュールをキャッシュするには、次の行のコメントを外す。 # sys.modules[module.__name__] = module loader.exec_module(module) return module
代替のない
impの関数と属性を削除しました。ドキュメント化されていない関数:
imp.init_builtin()imp.load_compiled()imp.load_dynamic()imp.load_package()
imp.lock_held()、imp.acquire_lock()、imp.release_lock(): ロック方式は Python 3.3 でモジュールごとのロックに変わりました。imp.find_module()の定数:SEARCH_ERROR、PY_SOURCE、PY_COMPILED、C_EXTENSION、PY_RESOURCE、PKG_DIRECTORY、C_BUILTIN、PY_FROZEN、PY_CODERESOURCE、IMP_HOOK。
io¶
locale¶
localeのlocale.format()関数を削除しました。 これは Python 3.7 で非推奨になっていました。 代わりにlocale.format_string()を使ってください。 (Victor Stinner が gh-94226 で貢献しました。)
smtpd¶
sqlite3¶
Python 3.10 で非推奨になった、ドキュメントに記載のない以下の
sqlite3の機能を削除しました。sqlite3.enable_shared_cache()sqlite3.OptimizedUnicode
共有キャッシュが必要な場合は、クエリーパラメータ
cache=sharedを指定して URI モードでデータベースを開いてください。テキストファクトリー
sqlite3.OptimizedUnicodeは、Python 3.3 からstrの別名でした。 以前テキストファクトリーをOptimizedUnicodeに設定していたコードでは、strを明示的に指定するか、同じくstrであるデフォルト値を使えます。(Erlend E. Aasland が gh-92548 で貢献しました。)
ssl¶
sslのssl.RAND_pseudo_bytes()関数を削除しました。 これは Python 3.6 で非推奨になっていました。 代わりにos.urandom()またはssl.RAND_bytes()を使ってください。 (Victor Stinner が gh-94199 で貢献しました。)ssl.match_hostname()関数を削除しました。 これは Python 3.7 で非推奨になっていました。 Python 3.7 以降では OpenSSL がホスト名の照合を行うため、Python はssl.match_hostname()関数を使わなくなりました。 (Victor Stinner が gh-94199 で貢献しました。)Python 3.7 で非推奨になった
ssl.wrap_socket()関数を削除しました。 代わりにssl.SSLContextオブジェクトを作成し、そのssl.SSLContext.wrap_socketメソッドを呼び出してください。ssl.wrap_socket()をまだ使っているパッケージには問題があり、安全ではありません。 この関数は SNI TLS 拡張を送信せず、サーバーのホスト名も検証しません。 こうしたコードは CWE 295 (証明書の検証不備) に該当します。 (Victor Stinner が gh-94199 で貢献しました。)
unittest¶
unittestの長らく非推奨だった多数の機能を削除しました。TestCaseの以下のメソッドの別名:非推奨のエイリアス
メソッド名
非推奨となるバージョン
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
https://github.com/isidentical/teyit を使うと、ユニットテストを自動的に新しい書き方へ移行できます。
ドキュメントに記載がなく、正しく動作していなかった
TestCaseのassertDictContainsSubsetメソッド (Python 3.2 で非推奨化)。ドキュメントに記載のない
TestLoader.loadTestsFromModuleの use_load_tests 引数 (Python 3.5 から非推奨で、無視されていました)。TextTestResultクラスの別名_TextTestResult(Python 3.2 で非推奨化)。
(Serhiy Storchaka が gh-89325 で貢献しました。)
webbrowser¶
webbrowserから古いブラウザーのサポートを削除しました。 対象は Grail、Mosaic、Netscape、Galeon、Skipstone、Iceape、Firebird、およびバージョン 35 以前の Firefox です (gh-102871)。
xml.etree.ElementTree¶
純 Python 実装の
ElementTree.Element.copy()メソッドを削除しました。 これは Python 3.10 で非推奨になっていました。 代わりにcopy.copy()関数を使ってください。xml.etree.ElementTreeの C 実装にはcopy()メソッドはなく、__copy__()メソッドだけがあります。 (Victor Stinner が gh-94383 で貢献しました。)
zipimport¶
その他¶
ドキュメント用の
Makefileからsuspiciousルールを削除し、Doc/tools/rstlint.pyも削除しました。 どちらも sphinx-lint に置き換えられます。 (Julien Palard が gh-98179 で貢献しました。)ftplib、imaplib、poplib、smtplibモジュールの keyfile 引数と certfile 引数、およびhttp.clientモジュールの key_file、cert_file、check_hostname 引数を削除しました。 これらはすべて Python 3.6 から非推奨でした。 代わりに context 引数 (imaplibでは ssl_context) を使ってください。 (Victor Stinner が gh-94172 で貢献しました。)いくつかの標準ライブラリモジュールとテストから、
Jythonとの互換性のための特別な処理を削除しました。 (Nikita Sobolev が gh-99482 で貢献しました。)ctypesモジュールから_use_broken_old_ctypes_structure_semantics_フラグを削除しました。 (Nikita Sobolev が gh-99285 で貢献しました。)
Python 3.12 への移植¶
このセクションでは前述の変更とバグフィックスにより必要となるかもしれないコードの変更を列挙します:
Python API の変更¶
正規表現内の番号によるグループ参照とグループ名に、より厳しい規則が適用されるようになりました。 番号による参照には ASCII の数字の並びだけを使えます。 bytes パターンと置換文字列のグループ名には、ASCII の英字、数字、アンダースコアだけを使えます。 (Serhiy Storchaka が gh-91760 で貢献しました。)
Python 3.10 から非推奨だった
randrange()の機能を削除しました。 以前はrandrange(10.0)を情報の損失なくrandrange(10)に変換していましたが、今回からTypeErrorを送出します。 また、randrange(10.5)やrandrange('10')のような整数以外の値に対する例外を、ValueErrorからTypeErrorに変更しました。 これにより、randrange(1e25)がrandrange(10**25)よりも広い範囲から、警告なしに値を選んでしまうバグも防げます。 (Serhiy Storchaka が gh-86388 で最初に提案しました。)argparse.ArgumentParserがファイルから引数を読み込む際 (fromfile_prefix_charsオプションなど) のエンコーディングとエラーハンドラーを、デフォルトのテキストエンコーディング (locale.getpreferredencoding(False)など) から ファイルシステムのエンコーディングとエラーハンドラー に変更しました。 Windows では引数ファイルを ANSI コードページではなく UTF-8 でエンコードしてください。Python 3.4.7 と 3.5.4 で非推奨になった、
asyncoreベースのsmtpdモジュールを削除しました。 代わりに、asyncioベースの PyPI モジュール aiosmtpd を推奨します。shlex.split(): s 引数にNoneを渡すと、sys.stdinから読み込む代わりに例外を送出するようになりました。 この機能は Python 3.9 で非推奨になっていました。 (Victor Stinner が gh-94352 で貢献しました。)The
osmodule no longer accepts bytes-like paths, likebytearrayandmemoryviewtypes: only the exactbytestype is accepted for bytes strings. (Contributed by Victor Stinner in gh-98393.)syslog.openlog()とsyslog.closelog()をサブインタープリタで使うと失敗するようになりました。syslog.syslog()は引き続きサブインタープリタで使えますが、メインインタープリタでsyslog.openlog()を既に呼び出している場合に限られます。 これらの新しい制限はメインインタープリタには適用されないため、影響を受ける利用者はごく少数と考えられます。 この変更はインタープリタの分離に役立ちます。 さらに、syslogはプロセス全体で共有されるリソースのラッパーなので、メインインタープリタから管理するのが適切です。 (Donghee Na が gh-99127 で貢献しました。)@cached_propertyの、ドキュメントに記載のなかったロック動作を削除しました。 クラスのすべてのインスタンスにまたがってロックを取り、強いロック競合を引き起こしていたためです。 この結果、2 つのスレッドが競合すると、同じインスタンスについてキャッシュされるプロパティの取得関数が複数回実行される可能性があります。 ほとんどの単純なキャッシュされるプロパティ (例えば冪等で、インスタンスの他の属性から値を計算するだけのもの) では問題ありません。 同期が必要なら、プロパティの取得関数内や、複数スレッドからアクセスする箇所の前後でロックを実装してください。sys._current_exceptions()が、スレッド ID から(typ, exc, tb)タプルへのマッピングではなく、例外インスタンスへのマッピングを返すようになりました。 (Irit Katriel が gh-103176 で貢献しました。)tarfileまたはshutil.unpack_archive()で tar ファイルを展開する際は、filter 引数を渡して、予想外の動作や危険をもたらす可能性のある機能を制限してください。 詳しくは 展開フィルター を参照してください。PEP 701 で導入された変更により、
tokenize.tokenize()関数とtokenize.generate_tokens()関数の出力が変わりました。 f 文字列に対してSTRINGトークンは生成されなくなり、代わりに PEP 701 に記載されたトークンが生成されます。 f 文字列の「文字列」部分にはFSTRING_START、FSTRING_MIDDLE、FSTRING_ENDが生成され、式の部分にはその式に応じたトークンが生成されます。 例えば f 文字列f"start {1+1} end"に対して、従来のトークナイザーは次を生成していました。1,0-1,18: STRING 'f"start {1+1} end"'
新しいバージョンでは次を生成します。
1,0-1,2: FSTRING_START 'f"' 1,2-1,8: FSTRING_MIDDLE 'start ' 1,8-1,9: OP '{' 1,9-1,10: NUMBER '1' 1,10-1,11: OP '+' 1,11-1,12: NUMBER '1' 1,12-1,13: OP '}' 1,13-1,17: FSTRING_MIDDLE ' end' 1,17-1,18: FSTRING_END '"'
さらに、PEP 701 への対応に必要な変更に伴い、細かな動作の違いが生じる場合があります。 以下のような変更があります。
!など、Python では無効な一部の文字をトークンに分割したときに生成されるトークンのtype属性が、ERRORTOKENからOPに変わりました。不完全な複数行文字列と同様に、不完全な単一行文字列でも
tokenize.TokenErrorが送出されるようになりました。不完全または無効な Python コードの一部をトークンに分割すると、任意の
ERRORTOKENトークンを返す代わりにtokenize.TokenErrorを送出するようになりました。Mixing tabs and spaces as indentation in the same file is not supported anymore and will raise a
TabError.
threadingモジュールは、_threadモジュールが_is_main_interpreter属性を持つことを要求するようになりました。 これは引数を取らない関数で、現在のインタープリタがメインインタープリタならTrueを返します。独自の
_threadモジュールを提供するライブラリやアプリケーションは、_is_main_interpreter()も提供する必要があります。 (gh-112826 を参照。)
ビルドの変更¶
Python は、共有 C 拡張モジュールのビルドに
setup.pyを使わなくなりました。 ヘッダーやライブラリなどのビルド設定はconfigureスクリプトで検出し、拡張はMakefileでビルドします。 ほとんどの拡張はpkg-configを使い、それが使えない場合は独自に検出します。 (Christian Heimes が gh-93939 で貢献しました。)Python のビルドには、
va_start(args, format),のような引数が 2 つのva_start()が必要になりました。va_start()を引数 1 つで呼ぶことはなくなりました。 (Kumar Aditya が gh-93207 で貢献しました。)Clang コンパイラーが対応するフラグを受け付ける場合、CPython はリンク時最適化のデフォルト方式として ThinLTO を使うようになりました。 (Donghee Na が gh-89536 で貢献しました。)
Makefileに変数COMPILEALL_OPTSを追加し、make installでのcompileallのオプション (デフォルトは-j0) を上書きできるようにしました。 また、3 つのcompileallコマンドを 1 つに統合し、すべての最適化レベル (0、1、2) の .pyc ファイルを一度にビルドするようにしました。 (Victor Stinner が gh-99289 で貢献しました。)64 ビット LoongArch 用のプラットフォームトリプレットを追加しました。
loongarch64-linux-gnusf
loongarch64-linux-gnuf32
loongarch64-linux-gnu
(Zhang Na が gh-90656 で貢献しました。)
PYTHON_FOR_REGENに Python 3.10 以降が必要になりました。configureの再生成に Autoconf 2.71 と aclocal 1.16.4 が必要になりました。 (Christian Heimes が gh-89886 で貢献しました。)python.org で配布する Windows ビルドと macOS インストーラーが OpenSSL 3.0 を使うようになりました。
C API の変更¶
新しい機能¶
PEP 689: Introduce the Unstable C API tier, intended for low-level tools like debuggers and JIT compilers. This API may change in each minor release of CPython without deprecation warnings. Its contents are marked by the
PyUnstable_prefix in names.コードオブジェクトのコンストラクター:
PyUnstable_Code_New()(PyCode_Newから改名)PyUnstable_Code_NewWithPosOnlyArgs()(PyCode_NewWithPosOnlyArgsから改名)
コードオブジェクト用の追加ストレージ (PEP 523):
PyUnstable_Eval_RequestCodeExtraIndex()(_PyEval_RequestCodeExtraIndexから改名)PyUnstable_Code_GetExtra()(_PyCode_GetExtraから改名)PyUnstable_Code_SetExtra()(_PyCode_SetExtraから改名)
元の名前は、それぞれの API が変更されるまで引き続き利用できます。
(Petr Viktorin が gh-101101 で貢献しました。)
PEP 697: インスタンスのメモリレイアウトが不透明な型を拡張する API を追加しました。
PyType_Spec.basicsizeにゼロまたは負の値を指定して、基底クラスのサイズの継承または拡張を指定できるようになりました。サブクラス固有のインスタンスデータにアクセスするため、
PyObject_GetTypeData()とPyType_GetTypeDataSize()を追加しました。PyType_Typeを含む一部の可変サイズ型を安全に拡張するため、Py_TPFLAGS_ITEMS_AT_ENDとPyObject_GetItemData()を追加しました。サブクラス固有の構造体に基づいて
メンバーを定義するため、Py_RELATIVE_OFFSETを追加しました。
(Petr Viktorin が gh-103509 で貢献しました。)
新しい Limited C API 関数
PyType_FromMetaclass()を追加しました。 既存のPyType_FromModuleAndSpec()を、メタクラス引数の追加によって一般化したものです。 (Wenzel Jakob が gh-93012 で貢献しました。)vectorcall プロトコル で呼び出せるオブジェクトを作成する API を Limited API に追加しました。
クラスの
__call__()メソッドを再代入すると、そのクラスのPy_TPFLAGS_HAVE_VECTORCALLフラグを削除するようになりました。 これにより、ミュータブルな型 (不変フラグPy_TPFLAGS_IMMUTABLETYPEを持たないヒープ型) でも vectorcall を安全に使えます。tp_callをオーバーライドしないミュータブルな型は、Py_TPFLAGS_HAVE_VECTORCALLフラグを継承するようになりました。 (Petr Viktorin が gh-93274 で貢献しました。)Py_TPFLAGS_MANAGED_DICTフラグとPy_TPFLAGS_MANAGED_WEAKREFフラグを追加しました。 これにより、拡張クラスでの管理処理とメモリ使用量を減らし、アクセスを高速化しつつ、オブジェクトの__dict__と弱参照をサポートできます。vectorcall プロトコル で呼び出しを行う API を Limited API に追加しました。
これにより、vectorcall プロトコルの呼び出しを受ける側と呼び出す側の両方が Limited API で利用できるようになりました。 (Wenzel Jakob が gh-98586 で貢献しました。)
呼び出し元だけでなく、実行中のすべてのスレッドにプロファイル関数やトレース関数を設定する 2 つの新しい公開関数、
PyEval_SetProfileAllThreads()とPyEval_SetTraceAllThreads()を追加しました。 (Pablo Galindo が gh-93503 で貢献しました。)指定した
PyFunctionObjectの vectorcall フィールドを設定する新しい関数PyFunction_SetVectorcall()を C API に追加しました。 (Andrew Frost が gh-92257 で貢献しました。)C API の
PyDict_AddWatcher()、PyDict_Watch()、および関連 API を使って、辞書が変更されるたびに呼び出すコールバックを登録できるようになりました。 最適化を行うインタープリタ、JIT コンパイラー、デバッガーでの使用を想定しています。 (Carl Meyer が gh-91052 で貢献しました。)型の変更の通知を受け取るコールバックを登録する
PyType_AddWatcher()API とPyType_Watch()API を追加しました。 (Carl Meyer が gh-91051 で貢献しました。)コードオブジェクトの作成と破棄の通知を受け取るコールバックを登録するため、
PyCode_AddWatcher()API とPyCode_ClearWatcher()API を追加しました。 (Itamar Oren が gh-91054 で貢献しました。)名前を指定してフレームの変数を取得する
PyFrame_GetVar()関数とPyFrame_GetVarString()関数を追加しました。 (Victor Stinner が gh-91248 で貢献しました。)現在の例外を保存・復元する
PyErr_GetRaisedException()とPyErr_SetRaisedException()を追加しました。 これらの関数は、非推奨になったPyErr_Fetch()とPyErr_Restore()のような 3 つの引数の代わりに、単一の例外オブジェクトを返したり受け取ったりします。 これにより間違いを起こしにくくなり、効率も少し向上します。 (Mark Shannon が gh-101578 で貢献しました。)例外インスタンスを受け取る
_PyErr_ChainExceptions1を追加しました。 これは、非推奨になった従来の API_PyErr_ChainExceptionsを置き換えるものです。 (Mark Shannon が gh-101578 で貢献しました。)例外のコンストラクターに渡された
argsを取得・変更する便利な関数として、PyException_GetArgs()とPyException_SetArgs()を追加しました。 (Mark Shannon が gh-101578 で貢献しました。)従来の API
PyErr_Display()を置き換える、例外インスタンスを受け取るPyErr_DisplayException()を追加しました。 (Irit Katriel が gh-102755 で貢献しました)。
PEP 683: オブジェクトの参照カウント操作を省略できる 不死オブジェクト を導入し、関連する C API の変更を行いました。
_Py_IMMORTAL_REFCNT: オブジェクトを永続オブジェクトとする参照カウント。_Py_IsImmortal: オブジェクトが不死の参照カウントを持つかどうかを調べます。PyObject_HEAD_INIT:Py_BUILD_COREとともに使うと、参照カウントを_Py_IMMORTAL_REFCNTに初期化するようになりました。SSTATE_INTERNED_IMMORTAL: 永続オブジェクトであるインターン化された Unicode オブジェクトを示す識別子。SSTATE_INTERNED_IMMORTAL_STATIC: 永続オブジェクトかつ静的なオブジェクトである、インターン化された Unicode オブジェクトを示す識別子。sys.getunicodeinternedsize: インターン化された Unicode オブジェクトの総数を返します。refleak.pyが参照カウントと割り当て済みブロックを正しく追跡するために必要になりました。
(Eddie Elizondo が gh-84436 で貢献しました。)
PEP 684: 新しい関数
Py_NewInterpreterFromConfig()とPyInterpreterConfigを追加しました。 独自の GIL を持つサブインタープリタを作成できます。 (詳しくは PEP 684: インタープリタごとの GIL を参照してください。) (Eric Snow が gh-104110 で貢献しました。)Limited C API バージョン 3.12 では、
Py_INCREF()関数とPy_DECREF()関数を、実装の詳細を隠す不透明な関数呼び出しとして実装するようになりました。 (Victor Stinner が gh-105387 で貢献しました。)
Python 3.12 への移植¶
Py_UNICODE*表現に基づく従来の Unicode API を削除しました。 UTF-8 またはwchar_t*に基づく API に移行してください。PyArg_ParseTuple()などの引数解析関数は、Py_UNICODE*に基づく書式 (u、Zなど) をサポートしなくなりました。s、z、es、Uなど、他の Unicode 用の書式に移行してください。すべての静的な組み込み型の
tp_weaklistは、常にNULLになりました。 これはPyTypeObjectの内部専用フィールドですが、直接アクセスしているコードがある場合に備えて、この変更を記載しています。 問題を避けるには、代わりに既存の公開 C API を使うことを検討してください。 必要であれば、内部専用の_PyObject_GET_WEAKREFS_LISTPTR()マクロも使えます。内部専用の
PyTypeObject.tp_subclassesは、有効なオブジェクトポインターとは限らなくなりました。 これを反映するため、型を void* に変更しました。 この内部専用フィールドに直接アクセスしているコードがある場合に備えて記載しています。サブクラスのリストを取得するには、例えば
PyObject_CallMethod()を使って、Python の__subclasses__()メソッドを呼び出してください。PyUnicode_FromFormat()とPyUnicode_FromFormatV()に、より多くの書式化オプション (左揃え、8 進数、大文字の 16 進数、intmax_t、ptrdiff_t、wchar_tの C 文字列、可変の幅と精度) を追加しました。 (Serhiy Storchaka が gh-98836 で貢献しました。)PyUnicode_FromFormat()とPyUnicode_FromFormatV()で認識できない書式文字があると、SystemErrorを設定するようになりました。 以前のバージョンでは、書式文字列の残りすべてをそのまま結果の文字列にコピーし、余分な引数をすべて無視していました。 (Serhiy Storchaka が gh-95781 で貢献しました。)PyUnicode_FromFormat()とPyUnicode_FromFormatV()の符号の位置が誤っていた問題を修正しました。 (Philip Georgi が gh-95504 で貢献しました。)__dict__や弱参照のスロットを追加する拡張クラスでは、それぞれtp_dictoffsetとtp_weaklistoffsetの代わりにPy_TPFLAGS_MANAGED_DICTとPy_TPFLAGS_MANAGED_WEAKREFを使ってください。tp_dictoffsetとtp_weaklistoffsetは引き続きサポートされますが、多重継承を完全にはサポートせず (gh-95589)、性能が劣る可能性もあります。Py_TPFLAGS_MANAGED_DICTを宣言するクラスは、インスタンスの辞書を走査・クリアするために_PyObject_VisitManagedDict()と_PyObject_ClearManagedDict()を呼び出す必要があります。 弱参照をクリアするには、従来どおりPyObject_ClearWeakRefs()を呼び出してください。The
PyUnicode_FSDecoder()function no longer accepts bytes-like paths, likebytearrayandmemoryviewtypes: only the exactbytestype is accepted for bytes strings. (Contributed by Victor Stinner in gh-98393.)Py_CLEAR、Py_SETREF、Py_XSETREFマクロは、引数を 1 回だけ評価するようになりました。 引数に副作用があっても、それが重複して起こることはなくなりました。 (Victor Stinner が gh-98724 で貢献しました。)インタープリタのエラーインジケーターは、常に正規化された状態になりました。
PyErr_SetObject()、PyErr_SetString()、およびエラーインジケーターを設定する他の関数は、例外を保存する前に正規化するようになりました。 (Mark Shannon が gh-101578 で貢献しました。)_Py_RefTotalは正確な総数を示すものではなくなり、ABI 互換性のためだけに残されています。 これは内部のグローバル変数で、デバッグビルドでしか利用できません。 使っている場合は、_Py_GetGlobalRefTotal()に切り替える必要があります。以下の関数が、新しく作成する型に適したメタクラスを選択するようになりました。
メタクラスが
tp_newをオーバーライドするクラスの作成は非推奨となり、Python 3.14 以降では認められなくなります。 これらの関数はメタクラスのtp_newを無視するため、初期化が不完全になる可能性があることに注意してください。PyType_FromMetaclass()(Python 3.12 で追加) は、メタクラスがtp_new(Python の__new__()) をオーバーライドするクラスの作成を、既に禁止しています。tp_newはPyType_From*関数が行う処理のほぼすべてをオーバーライドするため、両者には互換性がありません。 クラス作成のいくつかの手順でメタクラスを無視する従来の動作は、一般に安全ではありません。 クラスやメタクラスは、tp_newが呼び出されたことを前提とするためです。 単純で汎用的な回避策はありませんが、以下のいずれかが役立つ場合があります。メタクラスを変更できる場合は、そこで
tp_newを使わないようにしてください。初期化を省略しても構わない場合は、代わりに
tp_initで行えます。メタクラスを Python からインスタンス化する必要がない場合は、
Py_TPFLAGS_DISALLOW_INSTANTIATIONフラグを使って、そのtp_newをNULLに設定してください。 これによりPyType_From*関数で使用可能になります。
PyType_From*関数を使わない方法もあります。 C 固有の機能 (スロットやインスタンスサイズの設定) が不要なら、メタクラスを 呼び出して 型を作成してください。tp_newを安全に省略できると 分かっている 場合は、Python からwarnings.catch_warnings()を使って非推奨の警告を抑制してください。
PyOS_InputHookとPyOS_ReadlineFunctionPointerが サブインタープリタ で呼ばれなくなりました。 これらのコールバックは拡張モジュールの状態を取得する方法がなく、その利用側は一般にプロセス全体のグローバルな状態に依存しているためです。これにより、拡張が対応していないサブインタープリタや、まだ読み込まれていないサブインタープリタで動作してしまう状況も避けられます。 詳しくは gh-104668 を参照してください。
性能向上のため、
PyLongObjectの内部構造を変更しました。PyLongObjectの内部は非公開ですが、一部の拡張モジュールで使われています。 内部フィールドに直接アクセスせず、代わりにPyLong_...で始まる API 関数を使ってください。 単一のマシンワードに収まるPyLongObjectの値に効率よくアクセスするため、2 つの新しい 不安定な API 関数を提供します。PyMem_SetAllocator()で設定するカスタムアロケーターは、メモリドメインにかかわらずスレッドセーフであることが必要になりました。 「フック」を含め、独自の状態を持たないアロケーターは影響を受けません。 カスタムアロケーターがまだスレッドセーフでなく、助言が必要な場合は、新しい GitHub issue を作成して@ericsnowcurrentlyに知らせてください。
非推奨¶
PEP 699 に従い、拡張モジュールで
PyDictObjectのma_version_tagフィールドを使うことが非推奨になりました。 このフィールドにアクセスすると、コンパイル時にコンパイラーの警告が出ます。 このフィールドは Python 3.14 で削除される予定です。 (Ramvikrams と Kumar Aditya が gh-101193 で貢献しました。 PEP は Ken Jin が執筆しました。)以下のグローバル設定変数が非推奨になりました。
Py_DebugFlag: 代わりにPyConfig.parser_debugを使用Py_VerboseFlag: 代わりにPyConfig.verboseを使用Py_QuietFlag: 代わりにPyConfig.quietを使用Py_InteractiveFlag: 代わりにPyConfig.interactiveを使用Py_InspectFlag: 代わりにPyConfig.inspectを使用Py_OptimizeFlag: 代わりにPyConfig.optimization_levelを使用Py_NoSiteFlag: 代わりにPyConfig.site_importを使用Py_BytesWarningFlag: 代わりにPyConfig.bytes_warningを使用Py_FrozenFlag: 代わりにPyConfig.pathconfig_warningsを使用Py_NoUserSiteDirectory: 代わりにPyConfig.user_site_directoryを使用Py_HashRandomizationFlag: 代わりにPyConfig.use_hash_seedとPyConfig.hash_seedを使用Py_IsolatedFlag: 代わりにPyConfig.isolatedを使用Py_LegacyWindowsFSEncodingFlag: 代わりにPyPreConfig.legacy_windows_fs_encodingを使用Py_LegacyWindowsStdioFlag: 代わりにPyConfig.legacy_windows_stdioを使用Py_FileSystemDefaultEncoding: 代わりにPyConfig.filesystem_encodingを使用Py_HasFileSystemDefaultEncoding: 代わりにPyConfig.filesystem_encodingを使用Py_FileSystemDefaultEncodeErrors: 代わりにPyConfig.filesystem_errorsを使用Py_UTF8Mode: 代わりにPyPreConfig.utf8_modeを使用 (Py_PreInitialize()を参照)
代わりに
PyConfigとPy_InitializeFromConfig()API を使ってください。 (Victor Stinner が gh-77782 で貢献しました。)ミュータブルな基底型を持つ
イミュータブルな型の作成が非推奨になり、Python 3.14 ではできなくなります。 (gh-95388)structmember.hヘッダーが非推奨になりました。 ただし引き続き利用でき、削除の予定はありません。その内容は
Python.hをインクルードするだけで利用できるようになりました。 名前にPy接頭辞がなかったものには接頭辞を追加しています。Py_T_INT、Py_T_DOUBLEなどの型マクロ (従来のT_INT、T_DOUBLEなど)Py_READONLYフラグ (従来のREADONLY) とPy_AUDIT_READフラグ (従来はすべて大文字)
以下は
Python.hから公開していません。T_OBJECT(代わりにPy_T_OBJECT_EXを使用)T_NONE(従来ドキュメントに記載されておらず、かなり癖のあるもの)何もしないマクロ
WRITE_RESTRICTED。Py_AUDIT_READと同等のマクロRESTRICTEDとREAD_RESTRICTED。一部の構成では、
Python.hから<stddef.h>がインクルードされません。offsetof()を使う場合は、明示的にインクルードする必要があります。
非推奨のヘッダーは、元の内容を元の名前で引き続き提供します。 追加のインクルードや名前空間で区別されていないマクロが大きな問題でなければ、既存のコードを変更する必要はありません。
(Alexander Belopolsky と Matthias Braun による先行作業を基に、Petr Viktorin が gh-47146 で貢献しました。)
PyErr_Fetch()とPyErr_Restore()が非推奨になりました。 代わりにPyErr_GetRaisedException()とPyErr_SetRaisedException()を使ってください。 (Mark Shannon が gh-101578 で貢献しました。)PyErr_Display()が非推奨になりました。 代わりにPyErr_DisplayException()を使ってください。 (Irit Katriel が gh-102755 で貢献しました)。_PyErr_ChainExceptionsが非推奨になりました。 代わりに_PyErr_ChainExceptions1を使ってください。 (Irit Katriel が gh-102192 で貢献しました。)PyType_FromSpec()、PyType_FromSpecWithBases()、PyType_FromModuleAndSpec()を使って、メタクラスがtp_newをオーバーライドするクラスを作成することが非推奨になりました。 代わりにメタクラスを呼び出してください。
Python 3.14 で削除予定¶
拡張モジュール向けの
PyDictObjectのma_version_tagフィールド (PEP 699、gh-101193)。
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。
将来のバージョンで削除予定¶
以下の 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 以降では不要です。
削除¶
token.hヘッダーファイルを削除しました。 公開されたトークナイザーの C API は、これまで一度もありませんでした。token.hヘッダーファイルは Python 内部での使用だけを想定して設計されていました。 (Victor Stinner が gh-92651 で貢献しました。)従来の Unicode API を削除しました。 詳しくは PEP 623 を参照してください。
PyUnicode_WCHAR_KINDPyUnicode_AS_UNICODE()PyUnicode_AsUnicode()PyUnicode_AsUnicodeAndSize()PyUnicode_AS_DATA()PyUnicode_FromUnicode()PyUnicode_GET_SIZE()PyUnicode_GetSize()PyUnicode_GET_DATA_SIZE()
関数マクロ
PyUnicode_InternImmortal()を削除しました。 (Victor Stinner が gh-85858 で貢献しました。)