What's New In Python 3.9

編集者:

Łukasz Langa

この記事では Python 3.8 と比較した Python 3.9 の新機能を解説します。 Python 3.9 は 2020 年 10 月 5 日にリリースされました。 詳しくは 変更履歴 を参照してください。

参考

PEP 596 - Python 3.9 リリーススケジュール

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

新たな文法機能:

  • PEP 584、 dict に和集合の演算子が追加されました。

  • PEP 585、標準コレクション型の型ヒントにおける総称型 (generics) の使用。

  • PEP 614、デコレータの適用における文法的制約の緩和。

新たな組み込み機能:

  • PEP 616、prefixとsuffixを削除する文字列メソッド。

標準ライブラリの新機能:

  • PEP 593、より柔軟な変数・関数アノテーション (訳注: Annotated の導入)。

  • os.pidfd_open() が追加され、レースやシグナルを使わずにプロセス管理ができるようになりました。

インタプリタの改善:

  • PEP 573: C 拡張型のメソッドからモジュール状態へ高速にアクセス。

  • PEP 617、CPython における PEG (Parser Expression Grammar) ベースの新しい構文解析器の使用。

  • いくつかのPythonの組み込み型(range, tuple, set, frozenset, list, dict) を PEP 590 vectorcall を用いて高速化しました。

  • 復活したオブジェクトがあっても、ガベージコレクションを妨げなくなりました。

  • いくつかの Python モジュール (_abc, audioop, _bz2, _codecs, _contextvars, _crypt, _functools, _json, _locale, math, operator, resource, time, _weakref) が PEP 489 の複数フェーズ初期化を使うようになりました。

  • いくつかの標準ライブラリモジュール (audioop, ast, grp, _hashlib, pwd, _posixsubprocess, random, select, struct, termios, zlib) が PEP 384 の安定 ABI を使うようになりました。

新たなライブラリモジュール:

  • PEP 615、IANAのTime Zone Databaseが標準ライブラリの zoneinfo モジュールで提供されるようになりました。

  • 新しい graphlib モジュールに、グラフのトポロジカルソートの実装が追加されました。

リリースプロセスの変更:

  • PEP 602、CPythonは年次のリリースサイクルを採用します。

コード中の非推奨警告(DeprecationWarning)をチェックして下さい

Python 2.7がまだサポートされていた期間、Python 3の多くの機能はPython 2.7との後方互換性を保っていました。Python 2サポートの終了とともに、この後方互換性レイヤは除去されたか、間もなく除去されます。ここ数年で、それらの多くは警告 DeprecationWarning を出すようになりました。例えば、2012年にリリースされたPython 3.3以降、collections.abc.Mapping の代りに collections.Mapping を使うと、警告 DeprecationWarning が出ます。

警告 DeprecationWarning および PendingDeprecationWarning を確認するために、 -W default コマンドラインオプションを付けて、あなたのアプリケーションをテストして下さい。あるいは、-W error で警告をエラーとして扱うこともできます。サードパーティによるコードの警告を無視するには、Warnings Filter を使うことができます。

Python 3.9は、Python 2後方互換性レイヤを提供する最後のバージョンです。このレイヤは、Pythonプロジェクトの保守管理者に、Python 2サポートを止めてPython 3.9サポートを追加する時間的な余裕を与えるためのものです。

collections.abc.Mapping の別名である collections.Mapping など、collections モジュール内の 抽象基底クラス の別名は、後方互換性のため今回のリリースを最後に残されます。 Python 3.10 で削除されます。

より一般的には、あなたのコードが次のバージョンのPythonと互換性を保てるよう、Python Development Mode でテストするようにしてください。

注釈: Pythonのこのバージョンで、既存の多くの非推奨機能が削除されました。詳しくは 削除 を見て下さい。

新しい機能

辞書のマージと更新演算子

組み込みの dict クラスにマージ(|)と更新(|=)演算子が追加されました。この演算子は、辞書をマージする既存の方法 dict.update と {**d1, **d2} を補完します。

以下はプログラム例です:

>>> x = {"key1": "value1 from x", "key2": "value2 from x"}
>>> y = {"key2": "value2 from y", "key3": "value3 from y"}
>>> x | y
{'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
>>> y | x
{'key2': 'value2 from x', 'key3': 'value3 from y', 'key1': 'value1 from x'}

詳細は PEP 584 を参照してください。(Brandt Bucher の貢献による bpo-36144)

prefixとsuffixを削除する新しい文字列メソッド

文字列から不要な prefix や suffix を簡単に削除する str.removeprefix(prefix) と str.removesuffix(suffix) が追加されました。 bytes, bytearray, collections.UserString にも同様のメソッドが追加されました。詳細は PEP 616 を参照してください。(Dennis Sweeney の貢献による bpo-39939)

標準コレクション型の型ヒントにおける総称型 (generics) の使用

型アノテーションで、typing モジュールからインポートしていた大文字の型(List や Dict)の代わりに、総称型(generics)で list や dict といった標準コレクション型が使用できるようになりました。いくつかの他の標準ライブラリの型(queue.Queue など)も総称型として使用できます。

例:

def greet_all(names: list[str]) -> None:
    for name in names:
        print("Hello", name)

詳細は PEP 585 を参照してください。(Guido van Rossum、Ethan Smith、Batuhan Taşkaya の貢献による bpo-39481)

新しいパーサー

Python 3.9は、 LL(1) に代えて PEG に基づく新しいパーサーを採用しています。新しいパーサーのパフォーマンスは古いパーサーとほぼ同程度ですが、新しい言語の機能を設計する際に、PEGの形式主義はより柔軟です。我々は、この柔軟性をPython 3.10以降に使い始める予定です。

ast モジュールは、新しいパーサーを使って古いパーサーと同じASTを生成します。

Python 3.10 では古いパーサーと、それに依存するすべての機能 (主に長く非推奨だった parser モジュール) が削除されます。 Python 3.9 で のみ、コマンドラインオプション -X oldparser または環境変数 PYTHONOLDPARSER=1 で LL(1) パーサーに戻せます。

詳細は PEP 617 を参照してください。(Guido van Rossum,、Pablo Galindo、およびLysandros Nikolaouの貢献による bpo-40334)

その他の言語変更

  • 相対インポートがトップレベルのパッケージを越えた場合、__import__() は従来の ValueError ではなく ImportError を送出するようになりました。 (Contributed by Ngalim Siregar in bpo-37444.)

  • コマンドラインで指定したスクリプトファイル名 (例: python3 script.py) の絶対パスを取得するようになりました。 __main__ モジュールの __file__ 属性は相対パスではなく絶対パスになります。 os.chdir() で現在のディレクトリを変更しても、このパスは有効なままです。 副作用として、この場合の __main__ モジュールのフレームは、トレースバックにも絶対パスで表示されます。 (Contributed by Victor Stinner in bpo-20443.)

  • Python 開発モード と デバッグビルド では、文字列のエンコードとデコード時に encoding と errors 引数を検査するようになりました。 例えば open()、str.encode()、bytes.decode() です。

    デフォルトでは性能を優先し、errors 引数は最初のエンコードまたはデコードのエラー時にだけ検査し、空文字列では encoding 引数を無視する場合があります。 (Contributed by Victor Stinner in bpo-37388.)

  • "".replace("", s, n) は、ゼロでないすべての n について、空文字列ではなく s を返すようになりました。 "".replace("", s) と動作が揃います。 bytes と bytearray オブジェクトにも同様の変更があります。 (Contributed by Serhiy Storchaka in bpo-28029.)

  • 有効な式であれば任意の式を decorator として使えるようになりました。 以前の文法にはかなり強い制限がありました。 詳しくは PEP 614 を参照してください。 (Contributed by Brandt Bucher in bpo-39702.)

  • typing モジュールのヘルプが改善されました。 Union や List など、すべての特殊形式と特殊なジェネリックエイリアスの docstring を表示するようになりました。 List[int] などのジェネリックエイリアスに help() を使うと、対応する具象型 (この場合は list) のヘルプを表示します。 (Contributed by Serhiy Storchaka in bpo-40257.)

  • aclose()、asend()、athrow() の並行実行は禁止され、ag_running は非同期ジェネレータの実際の実行状態を反映するようになりました。 (Contributed by Yury Selivanov in bpo-30773.)

  • in 演算子と operator の contains()、indexOf()、countOf() 関数で、__iter__ 呼び出し時の予期しないエラーが TypeError に隠されなくなりました。 (Contributed by Serhiy Storchaka in bpo-40824.)

  • 内包表記とジェネレータ式の if 節の式には、括弧で囲まない lambda 式を使えなくなりました。 詳しくは bpo-41848 と bpo-43755 を参照してください。

新たなモジュール

zoneinfo

zoneinfo モジュールにより標準ライブラリにIANAのタイムゾーンデータベースへのサポートを導入されます。zoneinfo.ZoneInfo という、システムのタイムゾーンデータを背景とした具体的な datetime.tzinfo の実装が追加されます。

以下はプログラム例です:

>>> from zoneinfo import ZoneInfo
>>> import datetime as dt

>>> # 夏時間
>>> when = dt.datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(when)
2020-10-31 12:00:00-07:00
>>> when.tzname()
'PDT'

>>> # 標準時
>>> when += dt.timedelta(days=7)
>>> print(when)
2020-11-07 12:00:00-08:00
>>> print(when.tzname())
PST

IANA データベースを同梱しないプラットフォームの代替データソースとして、tzdata モジュールが公式パッケージとしてリリースされました。 PyPI で配布され、CPython コアチームが保守します。

参考

PEP 615 -- 標準ライブラリでの IANA タイムゾーンデータベースのサポート

PEP作成と実装は Paul Ganssle による。

graphlib

グラフのトポロジカルソートを行う graphlib.TopologicalSorter クラスを含む、新しい graphlib モジュールが追加されました。 (Contributed by Pablo Galindo, Tim Peters and Larry Hastings in bpo-17005.)

改良されたモジュール

ast

dump() に indent オプションが追加され、インデント付きの複数行出力を生成できるようになりました。 (Contributed by Serhiy Storchaka in bpo-37995.)

ast に ast.unparse() 関数が追加されました。 ast.AST オブジェクトからコードの文字列を生成し、その文字列を解析すると同等の ast.AST オブジェクトを得られます。 (Contributed by Pablo Galindo and Batuhan Taskaya in bpo-38870.)

AST ノードに、そのノードの作成に使う ASDL シグネチャを含む docstring が追加されました。 (Contributed by Batuhan Taskaya in bpo-39638.)

asyncio

セキュリティ上の重大な懸念により、asyncio.loop.create_datagram_endpoint() での reuse_address 引数は無効になりました。これはソケットオプション SO_REUSEADDR のUDP における挙動が原因です。詳しくは、loop.create_datagram_endpoint() のドキュメントを参照してください。(Kyle Stanley, Antoine Pitrou, Yury Selivanov による貢献 bpo-37228)

新しい コルーチン shutdown_default_executor() が追加されました。 デフォルトのエグゼキューターのシャットダウンをスケジュールし、ThreadPoolExecutor の終了処理が完了するまで待ちます。 asyncio.run() も、この新しい コルーチン を使うよう更新されました。 (Contributed by Kyle Stanley in bpo-34037.)

Linux 固有の子プロセス監視実装として、プロセスのファイル記述子をポーリングする asyncio.PidfdChildWatcher が追加されました (bpo-38692)。

新しい コルーチン asyncio.to_thread() が追加されました。 主に I/O 待ちが中心の関数を別スレッドで実行し、イベントループのブロックを避けるために使います。 実質的には run_in_executor() の高水準版で、キーワード引数を直接受け付けられます。 (Contributed by Kyle Stanley and Yury Selivanov in bpo-32309.)

asyncio.wait_for() は、タイムアウトによってタスクをキャンセルする際、timeout が 0 以下の場合でも、正の場合と同様にキャンセルの完了まで待つようになりました。 (Contributed by Elvis Pranskevichus in bpo-32751.)

asyncio は、ssl.SSLSocket ソケットで互換性のないメソッドを呼ぶと TypeError を送出するようになりました。 (Contributed by Ido Michael in bpo-37404.)

compileall

重複する .pyc ファイルにハードリンクを使う機能が追加されました。 hardlink_dupes パラメータと --hardlink-dupes コマンドラインオプションで指定します。 (Contributed by Lumír 'Frenzy' Balhar in bpo-40495.)

生成される .pyc 内のパスを操作するオプションとして、stripdir、prependdir、limit_sl_dest パラメータと -s、-p、-e コマンドラインオプションが追加されました。 最適化レベルのオプションも複数回指定できるようになりました。 (Contributed by Lumír 'Frenzy' Balhar in bpo-38112.)

concurrent.futures

concurrent.futures.Executor.shutdown() に cancel_futures パラメータが追加されました。 まだ実行を開始していない保留中の Future をすべてキャンセルし、完了を待たずにエグゼキューターをシャットダウンします。 (Contributed by Kyle Stanley in bpo-39349.)

ThreadPoolExecutor と ProcessPoolExecutor がデーモンスレッドを使わなくなりました。 これによりサブインタープリタとの互換性と、終了処理の予測しやすさが改善されます。 (Contributed by Kyle Stanley in bpo-39812.)

ProcessPoolExecutor のワーカーは、再利用できる待機中のワーカーがない場合にのみ、必要に応じて生成されるようになりました。 これにより起動時のオーバーヘッドと、待機中のワーカーが浪費する CPU 時間を削減します。 (Contributed by Kyle Stanley in bpo-39207.)

curses

curses.get_escdelay(), curses.set_escdelay(), curses.get_tabsize(), curses.set_tabsize() の関数が追加されました。(Anthony Sottileによる bpo-38312 でのコントリビュート。)

datetime

datetime.date の isocalendar() と datetime.datetime の isocalendar() は、tuple の代わりに namedtuple() を返すようになりました。 (Contributed by Donghee Na in bpo-24416.)

distutils

upload コマンドが SHA2-256 と Blake2b-256 のハッシュダイジェストを作成するようになりました。 MD5 ダイジェストが禁止されているプラットフォームでは MD5 を省略します。 (Contributed by Christian Heimes in bpo-40698.)

fcntl

fcntl.F_OFD_GETLK、fcntl.F_OFD_SETLK、fcntl.F_OFD_SETLKW 定数が追加されました。 (Contributed by Donghee Na in bpo-38602.)

ftplib

FTP と FTP_TLS は、非ブロッキングソケットの作成を防ぐため、コンストラクタのタイムアウトにゼロを指定すると ValueError を送出するようになりました。 (Contributed by Donghee Na in bpo-39259.)

gc

ガベージコレクション中に一部のオブジェクトが復活した場合 (ファイナライザーの実行後に、孤立した循環の外から到達可能になった場合) でも、到達不能なままのオブジェクトの回収を妨げなくなりました。 (Contributed by Pablo Galindo and Tim Peters in bpo-38379.)

オブジェクトがガベージコレクタによって終了処理済みか確認する gc.is_finalized() 関数が追加されました。 (Contributed by Pablo Galindo in bpo-39322.)

hashlib

hashlib モジュールは、利用可能な場合に OpenSSL の SHA3 ハッシュと SHAKE XOF を使えるようになりました。 (Contributed by Christian Heimes in bpo-37630.)

OpenSSL ベースの実装を強制的に使うため、./configure --without-builtin-hashlib-hashes で組み込みのハッシュモジュールを無効にできるようになりました。 ./configure --with-builtin-hashlib-hashes=sha3,blake2 などで選択的に有効にすることもできます。 (Contributed by Christian Heimes in bpo-40479)

http

http.HTTPStatus に HTTP ステータスコード 103 EARLY_HINTS、418 IM_A_TEAPOT、425 TOO_EARLY が追加されました。 (Contributed by Donghee Na in bpo-39509 and Ross Rhodes in bpo-39507.)

IDLE と idelelib

カーソルの点滅を無効にするオプションが追加されました。 (Contributed by Zackery Spytz in bpo-4603.)

Escape キーで IDLE の補完ウィンドウを閉じられるようになりました。 (Contributed by Johnny Najera in bpo-38944.)

モジュール名の補完候補のリストにキーワードが追加されました。 (Contributed by Terry J. Reedy in bpo-37765.)

3.9 のメンテナンスリリースの新機能

IDLE が ('-n' なしで起動した場合に) sys.excepthook() を呼び出すようにしました。 以前はユーザーのフックを無視していました。 (Ken Hilton による貢献、bpo-43008。)

上記の変更は、3.8 のメンテナンスリリースにもバックポートされています。

設定ダイアログを再配置しました。 General タブを Windows タブと Shell/Ed タブに分け、Help メニューを拡張するヘルプの参照先を Extensions タブに移動しました。 新しいオプション用のスペースを確保するとともにダイアログを短くし、小さな画面にも収まりやすくしました。 (Terry Jan Reedy による貢献、bpo-40468。) インデントのスペース数の設定を Font タブから新しい Windows タブに移動しました。 (Mark Roseman と Terry Jan Reedy による貢献、bpo-33962。)

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

imaplib

IMAP4 と IMAP4_SSL のコンストラクタに、省略可能な timeout パラメータが追加されました。 この変更に伴い open() にも省略可能な timeout が追加され、IMAP4_SSL と IMAP4_stream のオーバーライドされたメソッドにも変更が適用されました。 (Contributed by Donghee Na in bpo-38615.)

imaplib.IMAP4.unselect() が追加されました。 imaplib.IMAP4.unselect() は、選択中のメールボックスに関連するサーバーのリソースを解放し、サーバーを認証済み状態に戻します。 imaplib.IMAP4.close() と同じ操作を行いますが、現在選択中のメールボックスからメッセージを恒久的に削除することはありません。 (Contributed by Donghee Na in bpo-40375.)

importlib

import 文と動作を揃えるため、importlib.util.resolve_name() は、不正な相対インポートに対して ValueError ではなく ImportError を送出するようになりました。 (Contributed by Ngalim Siregar in bpo-37444.)

イミュータブルなモジュールオブジェクトを公開するインポートローダーは、個々のモジュールに加えて、イミュータブルなパッケージも公開できるようになりました。 (Contributed by Dino Viehland in bpo-39336.)

パッケージデータ内のサブディレクトリをサポートする importlib.resources.files() 関数が追加され、importlib_resources 1.5 のバックポートと揃いました。 (Contributed by Jason R. Coombs in bpo-39791.)

importlib.metadata が importlib_metadata 1.6.1 を基に更新されました。

inspect

inspect.BoundArguments.arguments は OrderedDict から標準のdictに変更されました。(Inada Naoki の貢献による bpo-36350, bpo-39775)

ipaddress

ipaddress が IPv6 のスコープ付きアドレス (接尾辞 %<scope_id> を持つ IPv6 アドレス) に対応しました。

スコープ付き IPv6 アドレスを ipaddress.IPv6Address で解析できます。 スコープのゾーン ID がある場合は scope_id 属性から取得できます。 (Contributed by Oleksandr Pavliuk in bpo-34788.)

Python 3.9.5 から ipaddress は、IPv4 アドレス文字列の先頭のゼロを一切受け付けなくなりました。 (Contributed by Christian Heimes in bpo-36384)

math

math.gcd() 関数が複数の引数を処理するよう拡張されました。 以前は 2 引数だけをサポートしていました。 (Contributed by Serhiy Storchaka in bpo-39648.)

指定した引数の最小公倍数を返す math.lcm() が追加されました。 (Contributed by Mark Dickinson, Ananthakrishnan and Serhiy Storchaka in bpo-39479 and bpo-39648.)

x から y の方向へ進んだ次の浮動小数点値を返す math.nextafter() が追加されました。 (Contributed by Victor Stinner in bpo-39288.)

浮動小数点数の最下位ビットの値を返す math.ulp() が追加されました。 (Contributed by Victor Stinner in bpo-39310.)

multiprocessing

multiprocessing.SimpleQueue クラスに、キューを明示的に閉じる close() メソッドが追加されました。 (Contributed by Victor Stinner in bpo-30966.)

nntplib

NNTP と NNTP_SSL は、非ブロッキングソケットの作成を防ぐため、コンストラクタのタイムアウトにゼロを指定すると ValueError を送出するようになりました。 (Contributed by Donghee Na in bpo-39259.)

os

si_code 用に CLD_KILLED と CLD_STOPPED が追加されました。 (Contributed by Donghee Na in bpo-38493.)

ファイル記述子によるプロセス管理のため、Linux 固有の os.pidfd_open() (bpo-38692) と os.P_PIDFD (bpo-38713) が公開されました。

os.unsetenv() 関数が、Windowsでも使えるようになりました。(bpo-39413 におけるVictor Stinnerの貢献による)

os.putenv() と os.unsetenv() 関数が、常に利用できるようになりました。(bpo-39395 におけるVictor Stinnerの貢献による)

待機ステータスを終了コードに変換する os.waitstatus_to_exitcode() 関数が追加されました。 (Contributed by Victor Stinner in bpo-40094.)

pathlib

os.readlink() と同様に動作する pathlib.Path.readlink() が追加されました。 (Contributed by Girts Folkmanis in bpo-30618)

pdb

Windows でも Pdb が ~/.pdbrc をサポートしました。 (Contributed by Tim Hopper and Dan Lidral-Porter in bpo-20523.)

poplib

POP3 と POP3_SSL は、非ブロッキングソケットの作成を防ぐため、コンストラクタのタイムアウトにゼロを指定すると ValueError を送出するようになりました。 (Contributed by Donghee Na in bpo-39259.)

pprint

pprint で types.SimpleNamespace を整形して表示できるようになりました。 (Contributed by Carl Bordum Hansen in bpo-37376.)

pydoc

クラス、関数、メソッドなどだけでなく、独自の __doc__ 属性を持つすべてのオブジェクトのドキュメンテーション文字列を表示するようになりました。 (Contributed by Serhiy Storchaka in bpo-40257.)

random

ランダムなバイト列を生成する random.Random.randbytes() メソッドが追加されました。 (Contributed by Victor Stinner in bpo-40286.)

signal

pid ではなくファイル記述子を使ってプロセスにシグナルを送る、Linux 固有の signal.pidfd_send_signal() が公開されました (bpo-38712)。

smtplib

SMTP と SMTP_SSL は、非ブロッキングソケットの作成を防ぐため、コンストラクタのタイムアウトにゼロを指定すると ValueError を送出するようになりました。 (Contributed by Donghee Na in bpo-39259.)

LMTP のコンストラクタに省略可能な timeout パラメータが追加されました。 (Contributed by Donghee Na in bpo-39329.)

socket

socket モジュールが Linux 4.1 以降で CAN_RAW_JOIN_FILTERS 定数を公開するようになりました。 (Contributed by Stefan Tatschner and Zackery Spytz in bpo-25780.)

socket モジュールは、対応するプラットフォームで CAN_J1939 プロトコルをサポートするようになりました。 (Contributed by Karl Ding in bpo-40291.)

socket モジュールに socket.send_fds() と socket.recv_fds() 関数が追加されました。 (Contributed by Joannah Nanjekye, Shinya Okano and Victor Stinner in bpo-28724.)

time

AIX の thread_time() は、分解能が 10 ミリ秒の clock_gettime(CLOCK_THREAD_CPUTIME_ID) ではなく、ナノ秒の分解能を持つ thread_cputime() で実装されるようになりました。 (Contributed by Batuhan Taskaya in bpo-40192)

sys

プラットフォーム固有のライブラリディレクトリ名を示す sys.platlibdir 属性が追加されました。 標準ライブラリやインストール済みの拡張モジュールのパスを構築するために使います。 ほとんどのプラットフォームでは "lib" です。 Fedora と SuSE の 64 ビットプラットフォームでは "lib64" です。 (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)

以前の sys.stderr は、非対話時にはブロック単位でバッファリングされていました。 今後は stderr のデフォルトは常に行単位のバッファリングになります。 (Contributed by Jendrik Seipp in bpo-13601.)

tracemalloc

追跡対象のメモリブロックのピークサイズを現在のサイズにリセットする tracemalloc.reset_peak() が追加され、特定のコード部分のピークを計測できます。 (Contributed by Huon Wilson in bpo-40630.)

typing

PEP 593 により、既存の型に文脈固有のメタデータを付ける typing.Annotated 型と、実行時にそのメタデータにアクセスするための typing.get_type_hints() の include_extras パラメータが導入されました。 (Contributed by Till Varoquaux and Konstantin Kashin.)

unicodedata

Unicode データベースが、バージョン 13.0.0 に更新されました。(bpo-39926)

venv

venv の有効化スクリプトは、プロンプトの変更に常に __VENV_PROMPT__ の値を使うよう統一されました。 以前は無条件に使うスクリプトと、設定されている場合だけ使うスクリプト (デフォルトでは設定されていました) があり、一つは代わりに __VENV_NAME__ を使っていました。 (Contributed by Brett Cannon in bpo-37663.)

xml

xml.etree.ElementTree を XML ファイルにシリアライズするとき、属性内の空白文字が保持されるようになりました。 改行は "n" に正規化されなくなりました。 これは XML 仕様の 2.11 節の解釈についての議論を受けた変更です。 (Contributed by Mefistotelis in bpo-39011.)

最適化

  • 内包表記内で一時変数に代入するイディオムが最適化されました。 内包表記内の for y in [expr] は、単純な代入 y = expr と同じ速さになりました。 例えば次のようになります:

    sums = [s for s in [0] for x in data for s in [s + x]]

    := 演算子と異なり、このイディオムは変数を外側のスコープに漏らしません。

    (Serhiy Storchaka による貢献、bpo-32856。)

  • マルチスレッドアプリケーションのシグナル処理が最適化されました。 メインスレッド以外がシグナルを受け取っても、処理できない保留中のシグナルを確認するために、バイトコード評価ループを各命令で中断しなくなりました。 シグナルを処理できるのは、メインインタープリタのメインスレッドだけです。

    以前は、メインスレッドがシグナルを処理するまで、バイトコード評価ループを命令ごとに中断していました。 (Contributed by Victor Stinner in bpo-40010.)

  • FreeBSD の subprocess モジュールが closefrom() を使って最適化されました。 (Contributed by Ed Maste, Conrad Meyer, Kyle Evans, Kubilay Kocak and Victor Stinner in bpo-38061.)

  • PyLong_FromDouble() は、long に収まる値について最大 1.87 倍高速になりました。 (Contributed by Sergey Fedoseev in bpo-37986.)

  • いくつかの Python の組み込み型 (range、tuple、set、frozenset、list、dict) が PEP 590 の vectorcall プロトコルを使い、高速化されました。 (Contributed by Donghee Na, Mark Shannon, Jeroen Demeyer and Petr Viktorin in bpo-37207.)

  • set.difference_update() が、相手の集合が元の集合よりずっと大きい場合に最適化されました。 (Evgeny Kapun による提案、Michele Orrù による実装、bpo-8425。)

  • Python の小さなオブジェクト用アロケータ (obmalloc.c) は、空のアリーナを最大一つだけ OS に返さずに保持し、直ちに再利用できるようになりました。 これにより、単純なループの反復ごとにアリーナを作成、破棄してしまう無駄を防ぎます。 (Contributed by Tim Peters in bpo-37257.)

  • float の 切り下げ除算 の性能が改善されました。 この操作の ZeroDivisionError のメッセージも更新されました。 (Contributed by Donghee Na in bpo-39434.)

  • UTF-8 と ascii コーデックによる短い ASCII 文字列のデコードが約 15% 高速になりました。 (Contributed by Inada Naoki in bpo-37348.)

Python 3.4 から Python 3.9 までの性能改善の概要です:

Python version                       3.4     3.5     3.6     3.7     3.8    3.9
--------------                       ---     ---     ---     ---     ---    ---

Variable and attribute read access:
    read_local                       7.1     7.1     5.4     5.1     3.9    3.9
    read_nonlocal                    7.1     8.1     5.8     5.4     4.4    4.5
    read_global                     15.5    19.0    14.3    13.6     7.6    7.8
    read_builtin                    21.1    21.6    18.5    19.0     7.5    7.8
    read_classvar_from_class        25.6    26.5    20.7    19.5    18.4   17.9
    read_classvar_from_instance     22.8    23.5    18.8    17.1    16.4   16.9
    read_instancevar                32.4    33.1    28.0    26.3    25.4   25.3
    read_instancevar_slots          27.8    31.3    20.8    20.8    20.2   20.5
    read_namedtuple                 73.8    57.5    45.0    46.8    18.4   18.7
    read_boundmethod                37.6    37.9    29.6    26.9    27.7   41.1

Variable and attribute write access:
    write_local                      8.7     9.3     5.5     5.3     4.3    4.3
    write_nonlocal                  10.5    11.1     5.6     5.5     4.7    4.8
    write_global                    19.7    21.2    18.0    18.0    15.8   16.7
    write_classvar                  92.9    96.0   104.6   102.1    39.2   39.8
    write_instancevar               44.6    45.8    40.0    38.9    35.5   37.4
    write_instancevar_slots         35.6    36.1    27.3    26.6    25.7   25.8

Data structure read access:
    read_list                       24.2    24.5    20.8    20.8    19.0   19.5
    read_deque                      24.7    25.5    20.2    20.6    19.8   20.2
    read_dict                       24.3    25.7    22.3    23.0    21.0   22.4
    read_strdict                    22.6    24.3    19.5    21.2    18.9   21.5

Data structure write access:
    write_list                      27.1    28.5    22.5    21.6    20.0   20.0
    write_deque                     28.7    30.1    22.7    21.8    23.5   21.7
    write_dict                      31.4    33.3    29.3    29.2    24.7   25.4
    write_strdict                   28.4    29.9    27.5    25.2    23.1   24.5

Stack (or queue) operations:
    list_append_pop                 93.4   112.7    75.4    74.2    50.8   50.6
    deque_append_pop                43.5    57.0    49.4    49.2    42.5   44.2
    deque_append_popleft            43.7    57.3    49.7    49.7    42.8   46.4

Timing loop:
    loop_overhead                    0.5     0.6     0.4     0.3     0.3    0.3

これらの結果は変数アクセスのベンチマークスクリプト Tools/scripts/var_access_benchmark.py で生成しました。 時間はナノ秒単位で表示します。 ベンチマークは Intel® Core™ i7-4960HQ プロセッサー で、python.org の macOS 64 ビットビルドを使って計測しました。

非推奨

  • distutilsの bdist_msi コマンドは、現在非推奨です。代わりに、bdist_wheel (wheelパッケージ)を使って下さい。 ( bpo-39586 でのHugo van Kemenadeによる貢献による)

  • 現在の math.factorial() は、非負の整数値を持つ float (5.0 など) を受け付け、整数でない値や負の浮動小数点数には ValueError を送出します。 この使い方は非推奨になりました。 将来の Python では、すべての float に対して TypeError を送出します。 (Contributed by Serhiy Storchaka in bpo-37315.)

  • parser と symbol モジュールが非推奨になり、将来の Python で削除されます。 ほとんどの用途では、ast による抽象構文木 (AST) の生成とコンパイルの段階を利用できます。

  • 公開 C API の PyParser_SimpleParseStringFlags()、PyParser_SimpleParseStringFlagsFilename()、PyParser_SimpleParseFileFlags()、PyNode_Compile() 関数が非推奨になり、古いパーサーとともに Python 3.10 で削除されます。

  • NotImplemented をブール値の文脈で使うことは、ほとんどの場合リッチ比較の実装ミスによるため、非推奨になりました。 将来の Python では TypeError になります。 (Contributed by Josh Rosenberg in bpo-35712.)

  • 現在の random モジュールは、ハッシュ可能な任意の型をシード値として受け付けます。 しかし、一部の型ではハッシュ値が決定的である保証がありません。 Python 3.9 より後では、シードは None、int、float、str、bytes、bytearray に制限されます。

  • mode 引数を指定せずに GzipFile を書き込み用に開くことが非推奨になりました。 将来の Python では、デフォルトで常に読み取り用に開きます。 書き込み用に開き、警告を避けるには mode を指定してください。 (Contributed by Serhiy Storchaka in bpo-28286.)

  • _tkinter.TkappType の split() メソッドが非推奨になりました。 代わりに、より一貫した予測しやすい動作をする splitlist() を使ってください。 (Contributed by Serhiy Storchaka in bpo-38371.)

  • asyncio.wait() にコルーチンオブジェクトを明示的に渡すことが非推奨になり、3.11 で削除されます。 (Contributed by Yury Selivanov and Kyle Stanley in bpo-34790.)

  • binhex4 と hexbin4 の規格が非推奨になりました。 binhex モジュールと、binascii の次の関数が非推奨になりました:

    • b2a_hqx(), a2b_hqx()

    • rlecode_hqx(), rledecode_hqx()

    (Victor Stinner による貢献、bpo-39353。)

  • ast の slice、Index、ExtSlice クラスは非推奨とされ、将来の Python で削除されます。 Index(value) には value 自体を、ExtSlice(slices) には Tuple(slices, Load()) を使ってください。 (Contributed by Serhiy Storchaka in bpo-34822.)

  • ast の Suite、Param、AugLoad、AugStore クラスは非推奨とされ、将来の Python で削除されます。 Python 3 ではパーサーが生成せず、コード生成器も受け付けないものでした。 (Contributed by Batuhan Taskaya in bpo-39639 and bpo-39969 and Serhiy Storchaka in bpo-39988.)

  • PyEval_InitThreads() と PyEval_ThreadsInitialized() 関数が非推奨になり、Python 3.11 で削除されます。 PyEval_InitThreads() を呼んでも何もしなくなりました。 Python 3.7 から GIL は Py_Initialize() で初期化されます。 (Contributed by Victor Stinner in bpo-39877.)

  • shlex.split() の第 1 引数に None を渡すことが非推奨になりました。 (Contributed by Zackery Spytz in bpo-33262.)

  • smtpd.MailmanProxy() は、外部の mailman モジュールなしでは使えないため、非推奨になりました。 (Contributed by Samuel Colvin in bpo-35800.)

  • lib2to3 モジュールが PendingDeprecationWarning を出すようになりました。 Python 3.9 は PEG パーサーに切り替わり (PEP 617)、Python 3.10 には lib2to3 の LL(1) パーサーで解析できない新しい構文が含まれる可能性があります。 lib2to3 は将来の Python で標準ライブラリから削除される可能性があります。 LibCST や parso などのサードパーティーの代替を検討してください。 (Contributed by Carl Meyer in bpo-40360.)

  • random.shuffle() の*random* パラメータは非推奨になりました。(Raymond Hettingerの貢献による bpo-40465)

削除

  • unittest.mock.__version__ の誤ったバージョン表記が削除されました。

  • nntplib.NNTP の xpath() と xgtitle() メソッドが削除されました。 Python 3.3 から非推奨でした。 通常、これらの拡張はサポートされていないか、NNTP サーバーの管理者が有効にしていません。 xgtitle() の代わりに nntplib.NNTP.descriptions() または nntplib.NNTP.description() を使ってください。 (Contributed by Donghee Na in bpo-39366.)

  • array.array の tostring() と fromstring() メソッドが削除されました。 tobytes() と frombytes() の別名で、Python 3.2 から非推奨でした。 (Contributed by Victor Stinner in bpo-38916.)

  • 文書化されていない sys.callstats() 関数が削除されました。 Python 3.7 から非推奨で、常に None を返していました。 必要だった特別なビルドオプション CALL_PROFILE は Python 3.7 で削除済みでした。 (Contributed by Victor Stinner in bpo-37414.)

  • Python 3.2 から非推奨だった sys.getcheckinterval() と sys.setcheckinterval() 関数が削除されました。 代わりに sys.getswitchinterval() と sys.setswitchinterval() を使ってください。 (Contributed by Victor Stinner in bpo-37392.)

  • C 関数 PyImport_Cleanup() が削除されました。 「モジュールテーブルを空にする。内部使用専用」と文書化されていました。 (Contributed by Victor Stinner in bpo-36710.)

  • _dummy_thread と dummy_threading モジュールが削除されました。 スレッドのサポートを必須にした Python 3.7 から非推奨でした。 (Contributed by Victor Stinner in bpo-37312.)

  • aifc.open() の別名 aifc.openfp()、sunau.open() の別名 sunau.openfp()、wave.open() の別名 wave.openfp() が削除されました。 Python 3.7 から非推奨でした。 (Contributed by Victor Stinner in bpo-37320.)

  • threading.Thread の isAlive() メソッドが削除されました。 Python 3.8 から非推奨でした。 代わりに is_alive() を使ってください。 (Contributed by Donghee Na in bpo-37804.)

  • ElementTree モジュールの ElementTree と Element クラスの getchildren() と getiterator() メソッドが削除されました。 Python 3.2 で非推奨になっていました。 x.getchildren() の代わりに iter(x) または list(x) を、x.getiterator() の代わりに x.iter() または list(x.iter()) を使ってください。 (Contributed by Serhiy Storchaka in bpo-36543.)

  • Python 3.4 から非推奨だった plistlib の古い API が削除されました。 load()、loads()、dump()、dumps() 関数を使ってください。 また、use_builtin_types パラメータが削除され、常に標準の bytes オブジェクトが使われるようになりました。 (Contributed by Jon Janzen in bpo-36409.)

  • C 関数 PyGen_NeedsFinalizing が削除されました。 文書化もテストもされておらず、PEP 442 の実装後は CPython 内のどこでも使われていませんでした。 パッチは Joannah Nanjekye によるものです。 (Contributed by Joannah Nanjekye in bpo-15088)

  • Python 3.1 から非推奨だった別名 base64.encodestring() と base64.decodestring() が削除されました。 代わりに base64.encodebytes() と base64.decodebytes() を使ってください。 (Contributed by Victor Stinner in bpo-39351.)

  • Python 3.5 から非推奨だった fractions.gcd() 関数 (bpo-22486) が削除されました。 代わりに math.gcd() を使ってください。 (Contributed by Victor Stinner in bpo-39350.)

  • bz2.BZ2File の buffering パラメータが削除されました。 Python 3.0 から無視され、使うと DeprecationWarning が出ていました。 ファイルの開き方を制御するには、開いたファイルオブジェクトを渡してください。 (Contributed by Victor Stinner in bpo-39357.)

  • json.loads() の encoding パラメータが削除されました。 Python 3.1 から非推奨で無視されており、Python 3.8 からは使うと DeprecationWarning が出ていました。 (Contributed by Inada Naoki in bpo-39377)

  • with (await asyncio.lock): and with (yield from asyncio.lock): statements are not longer supported, use async with lock instead. The same is correct for asyncio.Condition and asyncio.Semaphore. (Contributed by Andrew Svetlov in bpo-34793.)

  • sys.getcounts() 関数、コマンドラインオプション -X showalloccount、C 構造体 PyConfig の show_alloc_count フィールドが削除されました。 これらには、COUNT_ALLOCS マクロを定義した特別な Python ビルドが必要でした。 (Contributed by Victor Stinner in bpo-39489.)

  • typing.NamedTuple クラスの _field_types 属性が削除されました。 Python 3.8 から非推奨でした。 代わりに __annotations__ 属性を使ってください。 (Contributed by Serhiy Storchaka in bpo-40182.)

  • symtable.SymbolTable.has_exec() メソッドが削除されました。 2006 年から非推奨で、呼び出しても False を返すだけでした。 (Contributed by Batuhan Taskaya in bpo-40208)

  • asyncio.Task.current_task() と asyncio.Task.all_tasks() が削除されました。 Python 3.7 から非推奨でした。 代わりに asyncio.current_task() と asyncio.all_tasks() を使えます。 (Contributed by Rémi Lapeyre in bpo-40967)

  • html.parser.HTMLParser クラスの unescape() メソッドが削除されました (Python 3.4 から非推奨でした)。 文字参照を対応する Unicode 文字に変換するには html.unescape() を使ってください。

Python 3.9への移植

このセクションでは前述の変更とバグフィックスにより必要となるかもしれないコードの変更を列挙します:

Python API の変更

  • __import__() と importlib.util.resolve_name() は、以前 ValueError を送出していた場合に ImportError を送出するようになりました。 この例外型を捕捉し、Python 3.9 とそれ以前の両方に対応する呼び出し側は、except (ImportError, ValueError): で両方を捕捉する必要があります。

  • venv の有効化スクリプトは、__VENV_PROMPT__ が "" に設定されている場合を特別扱いしなくなりました。

  • select.epoll.unregister() メソッドは EBADF エラーを無視しなくなりました。 (Contributed by Victor Stinner in bpo-39239.)

  • buffering パラメータの削除に伴い、bz2.BZ2File の compresslevel パラメータはキーワード専用になりました。 (Contributed by Victor Stinner in bpo-39357.)

  • 添字参照の AST が簡略化されました。 単純なインデックスはその値で、拡張スライスはタプルで表されます。 Index(value) は value 自体を、ExtSlice(slices) は Tuple(slices, Load()) を返します。 (Contributed by Serhiy Storchaka in bpo-34822.)

  • importlib モジュールは、コマンドラインオプション -E または -I が使われている場合、環境変数 PYTHONCASEOK を無視するようになりました。

  • ftplib.FTP と ftplib.FTP_TLS クラスにキーワード専用の encoding パラメータが追加され、RFC 2640 に従ってデフォルトのエンコーディングが Latin-1 から UTF-8 に変わりました。

  • AbstractEventLoop に asyncio.loop.shutdown_default_executor() が追加されました。 このクラスを継承する別のイベントループ実装も、このメソッドを定義する必要があります。 (Contributed by Kyle Stanley in bpo-34037.)

  • コンパイラフラグとの衝突を防ぐため、__future__ モジュールの future フラグの定数値が更新されました。 以前は PyCF_ALLOW_TOP_LEVEL_AWAIT と CO_FUTURE_DIVISION が衝突していました。 (Contributed by Batuhan Taskaya in bpo-39562)

  • array('u') が使う C の型が Py_UNICODE から wchar_t に変わりました。 Python 3.3 から Py_UNICODE は wchar_t の別名なので、動作に影響はありません。 (Contributed by Inada Naoki in bpo-34538.)

  • logging.getLogger() API に名前 'root' を渡すと、ルートロガーを返すようになりました。 以前はルートロガーではない、'root' という名前のロガーを返していました。 この変更は、ユーザーコードが明示的にそのようなロガーを求める場合や、'root.py' という名前のトップレベルモジュールで logging.getLogger(__name__) を使ってロガーを作る場合に影響する可能性があります。 (Contributed by Vinay Sajip in bpo-37742.)

  • PurePath の除算処理は、str または PurePath のインスタンス以外を渡すと、TypeError を送出する代わりに NotImplemented を返すようになりました。 これにより、これらの型を継承せずに互換性のあるクラスを作れます。 (Contributed by Roger Aiudi in bpo-34775)

  • Python 3.9.5 から ipaddress モジュールは、IPv4 アドレス文字列の先頭のゼロを一切受け付けなくなりました。 先頭のゼロは曖昧で、一部のライブラリは 8 進表記と解釈します。 例えば、古い関数 socket.inet_aton() は先頭のゼロを 8 進表記と解釈します。 新しい inet_pton() の glibc 実装は先頭のゼロを一切受け付けません。 (Contributed by Christian Heimes in bpo-36384)

  • codecs.lookup() は encodings.normalize_encoding() と同じ方法でエンコーディング名を正規化するようになりました。 ただし codecs.lookup() は名前を小文字にも変換します。 例えば、エンコーディング名 "latex+latin1" は "latex_latin1" に正規化されます。 (Contributed by Jordon Xu in bpo-37751.)

C API の変更

  • Python 3.8 から、PyType_FromSpec() などの API で作成する ヒープに割り当てられた型 のインスタンスは、型オブジェクトへの参照を保持します。 Python 3.8 の「C API の変更」に記載したとおり、ほとんどの場合に副作用はありません。 ただし、独自の tp_traverse 関数を持つ型については、ヒープに割り当てられた型のすべての独自 tp_traverse 関数が、オブジェクトの型を訪問することを確認してください。

    例:

    int
    foo_traverse(PyObject *self, visitproc visit, void *arg)
    {
    // 走査関数の残りの処理
    #if PY_VERSION_HEX >= 0x03090000
        // Python 3.9 より前は不要でした (Python issue 35810 と 40217)
        Py_VISIT(Py_TYPE(self));
    #endif
    }
    

    走査関数が基底クラス (または別の型) の tp_traverse に処理を委譲する場合、Py_TYPE(self) を訪問するのが一度だけになるようにしてください。 tp_traverse で型を訪問するのは ヒープ型 だけです。

    例えば、tp_traverse 関数に次の処理がある場合:

    base->tp_traverse(self, visit, arg)
    

    次の処理を追加してください:

    #if PY_VERSION_HEX >= 0x03090000
        // Python 3.9 より前は不要でした (bpo-35810 と bpo-40217)
        if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) {
            // ヒープ型の tp_traverse がすでに Py_TYPE(self) を訪問しています
        } else {
            Py_VISIT(Py_TYPE(self));
        }
    #else
    

    (詳細は bpo-35810 と bpo-40217 を参照してください。)

  • PyEval_CallObject、PyEval_CallFunction、PyEval_CallMethod、PyEval_CallObjectWithKeywords 関数が非推奨になりました。 代わりに PyObject_Call() とその派生形を使ってください。 (詳細は bpo-29548 を参照してください。)

CPython バイトコードの変更

  • assert 文を処理する LOAD_ASSERTION_ERROR 命令が追加されました。 以前は AssertionError 例外の名前が別の値で隠されていると、assert 文が正しく動作しませんでした。 (Contributed by Zackery Spytz in bpo-34880.)

  • COMPARE_OP 命令が次の四つの命令に分かれました:

    • リッチ比較用の COMPARE_OP

    • is と is not の判定用の IS_OP

    • in と not in の判定用の CONTAINS_OP

    • try-except 文での例外の照合用の JUMP_IF_NOT_EXC_MATCH。

    (Mark Shannon による貢献、bpo-39156。)

ビルドの変更

  • configure スクリプトに --with-platlibdir オプションが追加されました。 プラットフォーム固有のライブラリディレクトリ名を指定し、新しい sys.platlibdir 属性に格納します。 詳細は sys.platlibdir 属性を参照してください。 (Contributed by Jan Matějek, Matěj Cepl, Charalampos Stratakis and Victor Stinner in bpo-1294959.)

  • 特殊なビルド用マクロ COUNT_ALLOCS が削除されました。 (Contributed by Victor Stinner in bpo-39489.)

  • Windows 以外のプラットフォームで Python をビルドするには、setenv() と unsetenv() 関数が必要になりました。 (Contributed by Victor Stinner in bpo-39395.)

  • Windows 以外のプラットフォームでの bdist_wininst インストーラの作成は、正式にサポート対象外になりました。 (詳細は bpo-10945 を参照してください。)

  • macOS で Python をソースからビルドするとき、/Library/Frameworks にシステム付属ではない Tcl と Tk のフレームワークがあれば、_tkinter はそれらにリンクするようになりました。 これは古い macOS リリースでの動作と同じです。 --enable-universalsdk または -isysroot で macOS SDK を明示的に設定した場合は、その SDK 内だけを探します。 引き続き --with-tcltk-includes と --with-tcltk-libs でデフォルトの動作を変更できます。 (Contributed by Ned Deily in bpo-34956.)

  • Windows 10 ARM64 向けに Python をビルドできるようになりました。 (Contributed by Steve Dower in bpo-33125.)

  • --pgo を使うと、一部のテストをスキップするようになりました。 これらのテストは PGO タスクの所要時間を大幅に増やし、最終的な実行ファイルの最適化にはあまり役立たないと考えられます。 この変更により、タスクは約 15 倍高速になります。 ユニットテスト全体の実行には時間がかかります。 実行するコードの分岐が減るため、この変更でビルド結果の最適化がわずかに弱まる可能性があります。 ビルドが大幅に遅くなっても構わない場合は、./configure [..] PROFILE_TASK="-m test --pgo-extended" で以前の動作に戻せます。 どちらの PGO タスク群がより高速なビルド結果を生むかは保証しません。 結果は環境、負荷、コンパイラのツールチェーンによって変わるため、気になる場合は用途に合ったベンチマークを実行してください。 (詳細は bpo-36044 と bpo-37707 を参照してください。)

C API の変更

新しい機能

  • PEP 573: モジュールとクラスを関連付ける PyType_FromModuleAndSpec()、そのモジュールと状態を取得する PyType_GetModule() と PyType_GetModuleState()、メソッドが自分の定義されたクラスにアクセスできるようにする PyCMethod と METH_METHOD が追加されました。 (Contributed by Marcel Plch and Petr Viktorin in bpo-38787.)

  • フレームのコードを取得する PyFrame_GetCode() 関数と、フレームの一つ外側のフレームを取得する PyFrame_GetBack() 関数が追加されました。 (Contributed by Victor Stinner in bpo-40421.)

  • 限定 C API に PyFrame_GetLineNumber() が追加されました。 (Contributed by Victor Stinner in bpo-40421.)

  • インタープリタを取得する PyThreadState_GetInterpreter() と PyInterpreterState_Get() 関数が追加されました。 Python スレッド状態の現在のフレームを取得する PyThreadState_GetFrame() 関数と、Python スレッド状態の一意な識別子を取得する PyThreadState_GetID() 関数も追加されました。 (Contributed by Victor Stinner in bpo-39947.)

  • 引数なしで Python の呼び出し可能オブジェクトを呼び出す公開関数 PyObject_CallNoArgs() が C API に追加されました。 引数なしで Python の呼び出し可能オブジェクトを呼び出す最も効率的な方法です。 (Contributed by Victor Stinner in bpo-37194.)

  • 限定 C API (Py_LIMITED_API マクロを定義した場合) の変更:

    • 限定 API で Py_EnterRecursiveCall() と Py_LeaveRecursiveCall() を通常の関数として提供するようになりました。 以前はマクロとして定義されていましたが、限定 C API ではコンパイルできませんでした。 限定 C API では構造体が不透明なため、PyThreadState.recursion_depth フィールドにアクセスできないからです。

    • 実装の詳細を隠すため、PyObject_INIT() と PyObject_INIT_VAR() が通常の「不透明な」関数になりました。

    (Victor Stinner による貢献、bpo-38644 と bpo-39542。)

  • モジュールへの型の追加を支援する PyModule_AddType() 関数が追加されました。 (Contributed by Donghee Na in bpo-40024.)

  • 公開 API に PyObject_GC_IsTracked() と PyObject_GC_IsFinalized() 関数が追加されました。 それぞれ、Python オブジェクトが現在ガベージコレクタの追跡対象か、すでにガベージコレクタによってファイナライズされているかを調べられます。 (Contributed by Pablo Galindo Salgado in bpo-40241.)

  • 関数のようなオブジェクトの、ユーザーに分かりやすい文字列表現を取得する _PyObject_FunctionStr() が追加されました。 (Jeroen Demeyer によるパッチ、bpo-37645。)

  • 一つの位置引数を渡してオブジェクトを呼び出す PyObject_CallOneArg() が追加されました。 (Jeroen Demeyer によるパッチ、bpo-37483。)

Python 3.9への移植

  • PyInterpreterState.eval_frame (PEP 523) に必須パラメータ tstate (PyThreadState*) が追加されました。 (Contributed by Victor Stinner in bpo-38500.)

  • 拡張モジュール: モジュール状態が要求されていてもまだ割り当てられていない場合、PyModuleDef の m_traverse、m_clear、m_free 関数を呼び出さなくなりました。 これは、モジュールの作成直後から実行 (Py_mod_exec 関数) までの間に当てはまります。 正確には、m_size が 0 より大きく、モジュール状態 (PyModule_GetState() の戻り値) が NULL の場合に、これらの関数を呼び出しません。

    モジュール状態を持たない拡張モジュール (m_size <= 0) は影響を受けません。

  • サブインタープリタで Py_AddPendingCall() を呼び出すと、関数はメインインタープリタではなく、そのサブインタープリタから呼び出されるように登録されます。 サブインタープリタごとに、呼び出し予定の関数のリストを持つようになりました。 (Contributed by Victor Stinner in bpo-39984.)

  • -E オプションを使った場合 (PyConfig.use_environment が 0 の場合)、sys.path の初期化に Windows レジストリを使わなくなりました。 Windows で Python を埋め込む場合に重要な変更です。 (Contributed by Zackery Spytz in bpo-8901.)

  • グローバル変数 PyStructSequence_UnnamedField が定数になり、定数文字列を参照するようになりました。 (Contributed by Serhiy Storchaka in bpo-38650.)

  • PyGC_Head 構造体が不透明になりました。 内部 C API (pycore_gc.h) だけで定義されています。 (Contributed by Victor Stinner in bpo-40241.)

  • Py_UNICODE_COPY、Py_UNICODE_FILL、PyUnicode_WSTR_LENGTH、PyUnicode_FromUnicode()、PyUnicode_AsUnicode()、_PyUnicode_AsUnicode、PyUnicode_AsUnicodeAndSize() が、C でも非推奨とマークされました。 これらは PEP 393 によって Python 3.3 から非推奨になっていました。 (Contributed by Inada Naoki in bpo-36346.)

  • Py_LIMITED_API マクロが定義されている場合を除き、Py_FatalError() 関数が、現在の関数名を自動的に記録するマクロに置き換えられました。 (Contributed by Victor Stinner in bpo-39882.)

  • vectorcall プロトコルでは、呼び出し側がキーワード名として渡せるのが文字列だけになりました。 (詳細は bpo-37540 を参照してください。)

  • いくつかのマクロや関数の実装の詳細が隠されるようになりました:

    (詳細は bpo-40170 を参照してください。)

削除

  • pyfpe.h の PyFPE_START_PROTECT() と PyFPE_END_PROTECT() マクロが限定 C API から除外されました。 (Contributed by Victor Stinner in bpo-38835.)

  • PyTypeObject の tp_print スロットが削除されました。 Python 2.7 以前ではオブジェクトをファイルに出力するために使われていました。 Python 3.0 からは無視され、使われていませんでした。 (Contributed by Jeroen Demeyer in bpo-36974.)

  • 限定 C API (Py_LIMITED_API マクロを定義した場合) の変更:

    • 次の関数が限定 C API から除外されました:

      • PyThreadState_DeleteCurrent() (Contributed by Joannah Nanjekye in bpo-37878.)

      • _Py_CheckRecursionLimit

      • _Py_NewReference()

      • _Py_ForgetReference()

      • _PyTraceMalloc_NewReference()

      • _Py_GetRefTotal()

      • 限定 C API では元々動作していなかった trashcan の仕組み。

      • PyTrash_UNWIND_LEVEL

      • Py_TRASHCAN_BEGIN_CONDITION

      • Py_TRASHCAN_BEGIN

      • Py_TRASHCAN_END

      • Py_TRASHCAN_SAFE_BEGIN

      • Py_TRASHCAN_SAFE_END

    • 次の関数と定義が内部 C API に移されました:

      • _PyDebug_PrintTotalRefs()

      • _Py_PrintReferences()

      • _Py_PrintReferenceAddresses()

      • _Py_tracemalloc_config

      • _Py_AddToAllObjects() (Py_TRACE_REFS ビルド専用)

    (Victor Stinner による貢献、bpo-38644 と bpo-39542。)

  • _PyRuntime.getframe フックと、その別名だった _PyThreadState_GetFrame マクロが削除されました。 これらは内部 C API だけで公開されていました。 PyThreadFrameGetter 型も削除されました。 (Contributed by Victor Stinner in bpo-39946.)

  • 次の関数が C API から削除されました。 すべてのフリーリストを空にするには、PyGC_Collect() を明示的に呼び出してください。 (Contributed by Inada Naoki and Victor Stinner in bpo-37340, bpo-38896 and bpo-40428.)

    • PyAsyncGen_ClearFreeLists()

    • PyContext_ClearFreeList()

    • PyDict_ClearFreeList()

    • PyFloat_ClearFreeList()

    • PyFrame_ClearFreeList()

    • PyList_ClearFreeList()

    • PyMethod_ClearFreeList() と PyCFunction_ClearFreeList(): 束縛メソッドオブジェクトのフリーリストは削除されました。

    • PySet_ClearFreeList(): 集合のフリーリストは Python 3.4 で削除されました。

    • PyTuple_ClearFreeList()

    • PyUnicode_ClearFreeList(): Unicode のフリーリストは Python 3.3 で削除されました。

  • _PyUnicode_ClearStaticStrings() 関数が削除されました。 (Contributed by Victor Stinner in bpo-39465.)

  • Py_UNICODE_MATCH が削除されました。 PEP 393 によって非推奨になり、Python 3.3 から動作しなくなっていました。 代わりに PyUnicode_Tailmatch() 関数を使えます。 (Contributed by Inada Naoki in bpo-36346.)

  • ヘッダーファイルから、定義はあるものの実装がないインターフェースが整理・削除されました。 削除された公開 API のシンボルは _PyBytes_InsertThousandsGroupingLocale、_PyBytes_InsertThousandsGrouping、_Py_InitializeFromArgs、_Py_InitializeFromWideArgs、_PyFloat_Repr、_PyFloat_Digits、_PyFloat_DigitsInit、PyFrame_ExtendStack、_PyAIterWrapper_Type、PyNullImporter_Type、PyCmpWrapper_Type、PySortWrapper_Type、PyNoArgsFunction です。 (Contributed by Pablo Galindo Salgado in bpo-39372.)

Python 3.9.1 での重要な変更点

typing

typing.Literal の動作を変更し、PEP 586 に準拠するとともに、PEP で指定されている静的型チェッカーの動作に合わせました。

  1. Literal がパラメータの重複を取り除くようになりました。

  2. Literal オブジェクト間の等価性比較が、順序に依存しなくなりました。

  3. Literal の比較が型を区別するようになりました。 例えば Literal[0] == Literal[False] は以前 True でしたが、今は False になります。 この変更を実現するため、内部の型キャッシュも型を区別するようになりました。

  4. Literal オブジェクトの等価比較で、パラメータのいずれかが hashable でない場合に TypeError を送出するようになりました。 ミュータブルなパラメータを指定して Literal を宣言するだけではエラーになりません。

    >>> from typing import Literal
    >>> Literal[{0}]
    >>> Literal[{0}] == Literal[{False}]
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'set'
    

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

macOS 11.0 (Big Sur) と Appleシリコンの Mac のサポート

3.9.1 から、macOS 11.0 (Big Sur) と Apple Silicon Mac (ARM64 アーキテクチャ) での Python のビルドと実行を完全にサポートするようになりました。 一組の実行ファイルで ARM64 と Intel 64 の両方をネイティブにサポートする、新しいユニバーサルビルド universal2 が利用できます。 また、現在の macOS でビルドしたバイナリを、さまざまな古い macOS バージョン (10.9 までテスト済み) に配布できるようになりました。 その際、実行時の OS バージョンに応じて、新しい OS の関数やオプションの一部を条件付きで利用できます (「弱いリンク」)。

(bpo-41100 でのRonald OussorenとLawrence D'Annaの貢献による)

Python 3.9.2 での重要な変更点

collections.abc

collections.abc.Callable ジェネリックは、typing.Callable と同様に型パラメータを平坦化するようになりました。 このため、collections.abc.Callable[[int, str], str] の __args__ は、以前の ([int, str], str) ではなく (int, str, str) になります。 この変更を可能にするため、types.GenericAlias をサブクラス化できるようになり、collections.abc.Callable 型に添字を付けるとサブクラスを返します。 typing.get_args() または __args__ から引数にアクセスするコードは、この変更を考慮する必要があります。 Python 3.9.1 では黙って受け付けていた collections.abc.Callable の不正なパラメータ指定で、DeprecationWarning が出る場合があります。 この DeprecationWarning は Python 3.10 で TypeError になります。 (Contributed by Ken Jin in bpo-42195.)

urllib.parse

以前の Python では urllib.parse.parse_qs() と urllib.parse.parse_qsl() のクエリパラメータの区切りに ; と & の両方を使えました。 セキュリティ上の懸念と、新しい W3C 勧告への準拠のため、区切りは 1 種類のみとなり、デフォルトは & に変更されました。 これらの関数を内部で使う cgi.parse() と cgi.parse_multipart() も影響を受けます。 詳しくは各関数のドキュメントを参照してください。 (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967.)

Python 3.9.3 での重要な変更点

セキュリティ修正により、ftplib.FTP はパッシブデータチャネルを確立するとき、リモートサーバーから送られた IPv4 アドレスを信頼しなくなりました。 代わりに FTP サーバーの IP アドレスを再利用します。 従来の動作が必要な特殊なコードでは、FTP インスタンスの trust_server_pasv_ipv4_address 属性を True に設定してください (gh-87451 を参照)。

Python 3.9.5での重要な変更点

urllib.parse

URL の一部に改行文字やタブ文字があると、特定の種類の攻撃が可能になります。 RFC 3986 を更新する WHATWG の仕様に従い、urllib.parse のパーサーは ASCII の改行文字 \n、\r とタブ文字 \t を URL から取り除き、この種の攻撃を防ぎます。 除去する文字は、新しいモジュール変数 urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE で制御します。 (gh-88048 を参照)

3.9.14 の注目すべきセキュリティ機能

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

3.9.17 の注目すべき変更

tarfile

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