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'}
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):andwith (yield from asyncio.lock):statements are not longer supported, useasync with lockinstead. The same is correct forasyncio.Conditionandasyncio.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
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_OPis と is not の判定用の
IS_OPin と not in の判定用の
CONTAINS_OPtry-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()が通常の「不透明な」関数になりました。
モジュールへの型の追加を支援する
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 を参照してください。)
いくつかのマクロや関数の実装の詳細が隠されるようになりました:
PyObject_IS_GC()マクロが関数に変わりました。PyObject_NEW()マクロはPyObject_Newマクロの別名に、PyObject_NEW_VAR()マクロはPyObject_NewVarマクロの別名になりました。PyTypeObject.tp_basicsizeメンバーに直接アクセスしなくなりました。PyTypeObject.tp_weaklistoffsetメンバーに直接アクセスしていたPyObject_GET_WEAKREFS_LISTPTR()マクロが関数に変わりました。PyTypeObject.tp_as_bufferメンバーに直接アクセスしていたPyObject_CheckBuffer()マクロが関数に変わりました。PyIndex_Check()は、実装の詳細を隠すため常に不透明な関数として宣言されるようになりました。PyTypeObject.tp_as_numberメンバーに直接アクセスしていたPyIndex_Check()マクロは削除されました。
(詳細は 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_LEVELPy_TRASHCAN_BEGIN_CONDITIONPy_TRASHCAN_BEGINPy_TRASHCAN_ENDPy_TRASHCAN_SAFE_BEGINPy_TRASHCAN_SAFE_END
次の関数と定義が内部 C API に移されました:
_PyDebug_PrintTotalRefs()_Py_PrintReferences()_Py_PrintReferenceAddresses()_Py_tracemalloc_config_Py_AddToAllObjects()(Py_TRACE_REFSビルド専用)
_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 で指定されている静的型チェッカーの動作に合わせました。
Literalがパラメータの重複を取り除くようになりました。Literalオブジェクト間の等価性比較が、順序に依存しなくなりました。Literalの比較が型を区別するようになりました。 例えばLiteral[0] == Literal[False]は以前Trueでしたが、今はFalseになります。 この変更を実現するため、内部の型キャッシュも型を区別するようになりました。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 での貢献。)