Python3.9の新機能
- リリース
- 日にち
- 2021年10月17日
- 編集者
- ŁukaszLanga
この記事では、3.8と比較したPython3.9の新機能について説明します。 Python3.9は2020年10月5日にリリースされました。
詳細については、 changelog を参照してください。
概要–リリースのハイライト
新しい構文機能:
新しい組み込み機能:
- PEP 616 、プレフィックスとサフィックスを削除する文字列メソッド。
標準ライブラリの新機能:
- PEP 593 、柔軟な関数と変数の注釈。
- os.pidfd_open()が追加され、競合やシグナルなしでプロセス管理が可能になりました。
通訳の改善:
- PEP 573 、C拡張タイプのメソッドからモジュール状態への高速アクセス。
- PEP 617 、CPythonはPEGに基づく新しいパーサーを使用するようになりました。
- 多くのPythonビルトイン(range、tuple、set、frozenset、list、dict)が、 PEP 590 vectorcallを使用して高速化されました。
- ガベージコレクションは、復活したオブジェクトをブロックしません。
- 多数のPythonモジュール(
_abc
、 audioop 、_bz2
、_codecs
、_contextvars
、_crypt
、[ X101X] 、_json
、_locale
、 math 、演算子、リソース、時間[X200X ]、_weakref
)は、PEP489で定義されているマルチフェーズ初期化を使用するようになりました。 - 多数の標準ライブラリモジュール( audioop 、 ast 、 grp 、
_hashlib
、 pwd 、 [ X113X]、 random 、 select 、 struct 、 termios 、 zlib )は、定義された安定したABIを使用しています。 PEP384による。
新しいライブラリモジュール:
- PEP 615 、IANAタイムゾーンデータベースが zoneinfo モジュールの標準ライブラリに存在するようになりました。
- トポロジカルソートのグラフの実装が、新しい graphlib モジュールで提供されるようになりました。
リリースプロセスの変更:
- PEP 602 、CPythonは年次リリースサイクルを採用しています。
コードでDeprecationWarningを確認する必要があります
Python 2.7がまだサポートされていたとき、Python3の多くの機能はPython2.7との下位互換性のために保持されていました。 Python 2のサポートが終了すると、これらの下位互換性レイヤーは削除されたか、まもなく削除されます。 それらのほとんどは、数年間 DeprecationWarning 警告を発しました。 たとえば、collections.abc.Mapping
の代わりにcollections.Mapping
を使用すると、2012年にリリースされたPython 3.3以降、 DeprecationWarning が発行されます。
-W default
コマンドラインオプションを使用してアプリケーションをテストし、 DeprecationWarning および PendingDeprecationWarning を確認するか、 -W [ X167X] error
は、それらをエラーとして扱います。 警告フィルターを使用して、サードパーティのコードからの警告を無視できます。
Python 3.9は、Python 2の下位互換性レイヤーを提供する最後のバージョンであり、PythonプロジェクトのメンテナーがPython 2サポートの削除を整理し、Python3.9のサポートを追加するための時間を確保します。
collections モジュールの Abstract Base Classes へのエイリアスは、 collections.abc.Mapping へのcollections.Mapping
エイリアスのように下位互換性。 これらはPython3.10から削除されます。
より一般的には、 Python開発モードでテストを実行してみてください。これは、次のPythonバージョンと互換性を持たせるためのコードの準備に役立ちます。
注:このバージョンの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 を参照してください。 (:issue: `36144` のBrandtBucherによる寄稿。)
プレフィックスとサフィックスを削除するための新しい文字列メソッド
str.removeprefix(prefix)および str.removesuffix(suffix)が追加され、文字列から不要なプレフィックスまたはサフィックスを簡単に削除できるようになりました。 対応するbytes
、bytearray
、およびcollections.UserString
メソッドも追加されました。 詳細については、 PEP 616 を参照してください。 (:issue: `39939` でDennisSweeneyによって寄稿されました。)
標準コレクションのタイプヒントジェネリック
型注釈では、対応する大文字の型をインポートする代わりに、list
やdict
などの組み込みのコレクション型をジェネリック型として使用できるようになりました(例: typing
のList
またはDict
)。 queue.Queue
など、標準ライブラリの他のいくつかのタイプも汎用になりました。
例:
def greet_all(names: list[str]) -> None:
for name in names:
print("Hello", name)
詳細については、 PEP 585 を参照してください。 (:issue: `39481` で、Guido van Rossum、Ethan Smith、およびBatuhanTaşkayaによって寄稿されました。)
新しいパーサー
Python 3.9は、 LL(1)の代わりに PEG に基づく新しいパーサーを使用します。 新しいパーサーのパフォーマンスは古いパーサーのパフォーマンスとほぼ同等ですが、新しい言語機能の設計に関しては、PEG形式はLL(1)よりも柔軟性があります。 Python3.10以降でこの柔軟性の使用を開始します。
ast モジュールは新しいパーサーを使用し、古いパーサーと同じASTを生成します。
Python 3.10では、古いパーサーが削除され、それに依存するすべての機能も削除されます(主に、長い間非推奨となったパーサーモジュール)。 Python 3.9 only では、コマンドラインスイッチ(-X oldparser
)または環境変数(PYTHONOLDPARSER=1
)を使用して、LL(1)パーサーに戻すことができます。
詳細については、 PEP 617 を参照してください。 (:issue: `40334` で、Guido van Rossum、Pablo Galindo、Lysandros Nikolaouによって寄稿されました。)
その他の言語の変更
__ import __()は、相対インポートが最上位パッケージを通過したときに発生していた ValueError ではなく、 ImportError を発生させるようになりました。 (:issue: `37444` でNgalimSiregarによって寄稿されました。)
Pythonは、コマンドラインで指定されたスクリプトファイル名の絶対パスを取得するようになりました(例:
python3 script.py
): __ main __ モジュールの__file__
属性は、むしろ絶対パスになりました相対パスよりも。 これらのパスは、現在のディレクトリが os.chdir()によって変更された後も有効なままになります。 副作用として、この場合、トレースバックは __ main __ モジュールフレームの絶対パスも表示します。 (:issue: `20443` でVictorStinnerによって寄稿されました。)Python開発モードおよびデバッグビルドで、 encoding および errors 引数が、文字列のエンコードおよびデコード操作についてチェックされるようになりました。 例: open()、 str.encode()、 bytes.decode()。
デフォルトでは、最高のパフォーマンスを得るには、 errors 引数は最初のエンコード/デコードエラーでのみチェックされ、 encoding 引数は空の文字列に対して無視されることがあります。 (:issue: `37388` でVictorStinnerによって寄稿されました。)
"".replace("", s, n)
は、ゼロ以外のすべてのn
に対して、空の文字列ではなくs
を返すようになりました。"".replace("", s)
と一致するようになりました。 bytes オブジェクトと bytearray オブジェクトにも同様の変更があります。 (:issue: `28029` のSerhiyStorchakaによる寄稿。)有効な式をデコレータとして使用できるようになりました。 以前は、文法ははるかに制限的でした。 詳細については、 PEP 614 を参照してください。 (:issue: `39702` のBrandtBucherによる寄稿。)
タイピングモジュールのヘルプが改善されました。 すべての特殊な形式と特殊な汎用エイリアス(
Union
やList
など)のDocstringが表示されるようになりました。 help()をList[int]
のような汎用エイリアスとともに使用すると、対応する具象タイプ(この場合はlist
)のヘルプが表示されます。 (:issue: `40257` でSerhiyStorchakaによって寄稿されました。)aclose()
/asend()
/athrow()
の並列実行が禁止され、ag_running
が非同期ジェネレーターの実際の実行ステータスを反映するようになりました。 (:issue: `30773` でYurySelivanovによって寄稿されました。)__iter__
メソッドを呼び出す際の予期しないエラーは、 in 演算子および関数 contains()、 indexOf( )演算子モジュールのおよび countOf()。 (:issue: `40824` のSerhiyStorchakaによる寄稿。)括弧で囲まれていないラムダ式は、内包表記およびジェネレーター式の
if
句の式部分にはできなくなりました。 詳細については、:issue: `41848` および:issue:` 43755` を参照してください。
新しいモジュール
zoneinfo
zoneinfo モジュールは、IANAタイムゾーンデータベースのサポートを標準ライブラリにもたらします。 これは、システムのタイムゾーンデータに裏打ちされた具体的な datetime.tzinfo 実装である zoneinfo.ZoneInfo を追加します。
例:
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> # Daylight saving time
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
2020-10-31 12:00:00-07:00
>>> dt.tzname()
'PDT'
>>> # Standard time
>>> dt += timedelta(days=7)
>>> print(dt)
2020-11-07 12:00:00-08:00
>>> print(dt.tzname())
PST
IANAデータベースを出荷しないプラットフォームのデータのフォールバックソースとして、 tzdata モジュールがファーストパーティパッケージとしてリリースされました。PyPIを介して配布され、CPythonコアチームによって保守されています。
graphlib
グラフのトポロジカルソートを実行する機能を提供する graphlib.TopologicalSorter クラスを含む新しいモジュール graphlib が追加されました。 (:issue: `17005` でPabloGalindo、Tim Peters、Larry Hastingsによって寄稿されました。)
改善されたモジュール
ast
indent オプションを dump()に追加しました。これにより、複数行のインデントされた出力を生成できます。 (:issue: `37995` でSerhiyStorchakaによって寄稿されました。)
ast.unparse()を ast モジュールの関数として追加しました。この関数を使用して、 ast.AST オブジェクトを解析解除し、次のようなコードで文字列を生成できます。解析時に同等の ast.AST オブジェクトを生成します。 (:issue: `38870` でPabloGalindoとBatuhanTaskayaによって寄稿されました。)
そのノードを構築するために使用されるASDL署名を含むドキュメント文字列をASTノードに追加しました。 (:issue: `39638` でBatuhanTaskayaによって寄稿されました。)
asyncio
重大なセキュリティ上の懸念により、asyncio.loop.create_datagram_endpoint()
の reuse_address パラメーターはサポートされなくなりました。 これは、UDPのソケットオプションSO_REUSEADDR
の動作が原因です。 詳細については、loop.create_datagram_endpoint()
のドキュメントを参照してください。 (:issue: `37228` で、Kyle Stanley、Antoine Pitrou、およびYury Selivanovによって寄稿されました。)
新しいコルーチン shutdown_default_executor()
を追加しました。これは、 ThreadPoolExecutor が終了するのを待機するデフォルトのエグゼキューターのシャットダウンをスケジュールします。 また、 asyncio.run()が更新され、新しいコルーチンが使用されるようになりました。 (:issue: `34037` でKyleStanleyによって寄稿されました。)
プロセスファイル記述子をポーリングするLinux固有の子ウォッチャー実装である asyncio.PidfdChildWatcher を追加しました。 (:issue: `38692` )
新しいコルーチン asyncio.to_thread()
を追加しました。 これは主に、イベントループのブロックを回避するために、別のスレッドでIOバウンド関数を実行するために使用され、基本的に、キーワード引数を直接受け取ることができるrun_in_executor()
の高レベルバージョンとして機能します。 (:issue: `32309` でKyleStanleyとYurySelivanovによって寄稿されました。)
タイムアウトのためにタスクをキャンセルする場合、asyncio.wait_for()
キャンセルが完了するまで待つようになりました。 タイムアウト正のタイムアウトの場合と同様に、は<= 0です。 (:issue: `32751` でElvisPranskevichusによって寄稿されました。)
asyncio は、 ssl.SSLSocket ソケットを使用して互換性のないメソッドを呼び出すときに、TyperError
を発生させるようになりました。 (:issue: `37404` でIdoMichaelによって寄稿されました。)
compileall
複製された.pyc
ファイルにハードリンクを使用する新しい可能性が追加されました: hardlink_dupes パラメーターと–hardlink-dupesコマンドラインオプション。 (:issue: `40495` のLumír'Frenzy'Balharによる寄稿。)
結果の.pyc
ファイルにパス操作の新しいオプションを追加しました: stripdir 、 appenddir 、 limit_sl_dest パラメーターおよび-s、-p、-eコマンドラインオプション。 最適化レベルのオプションを複数回指定する可能性が追加されました。 (:issue: `38112` のLumír'Frenzy'Balharによる寄稿。)
コンカレント.futures
新しい cancel_futures パラメーターを concurrent.futures.Executor.shutdown()に追加しました。これは、実行を開始する前に完了するのを待つのではなく、実行を開始していないすべての保留中の先物をキャンセルします。 。 (:issue: `39349` でKyleStanleyによって寄稿されました。)
ThreadPoolExecutor および ProcessPoolExecutor からデーモンスレッドを削除しました。 これにより、サブインタープリターとの互換性とシャットダウンプロセスの予測可能性が向上します。 (:issue: `39812` でKyleStanleyによって寄稿されました。)
ProcessPoolExecutor のワーカーは、再利用できるアイドル状態のワーカーがない場合にのみ、オンデマンドで生成されるようになりました。 これにより、起動のオーバーヘッドが最適化され、アイドル状態のワーカーが失うCPU時間の量が削減されます。 (:issue: `39207` でKyleStanleyによって寄稿されました。)
のろい
curses.get_escdelay()、 curses.set_escdelay()、 curses.get_tabsize()、および curses.set_tabsize()関数が追加されました。 (:issue: `38312` のAnthonySottileによる寄稿。)
日付時刻
datetime.date の isocalendar()および datetime.datetime メソッドの isocalendar()は、 namesedtuple()を返すようになりました。 タプルの代わりに。 (:issue: `24416` のDong-hee Naによる寄稿。)
distutils
upload コマンドは、SHA2-256およびBlake2b-256ハッシュダイジェストを作成するようになりました。 MD5ダイジェストをブロックするプラットフォームではMD5をスキップします。 (:issue: `40698` でChristianHeimesによって寄稿されました。)
ftplib
FTP および FTP_TLS は、コンストラクターに指定されたタイムアウトがゼロの場合に ValueError を発生させ、非ブロッキングソケットの作成を防止するようになりました。 (:issue: `39259` のDong-hee Naによる寄稿。)
gc
ガベージコレクターが、一部のオブジェクトが復活するコレクションを作成する場合(ファイナライザーが実行された後、分離されたサイクルの外部から到達可能)、まだ到達できないすべてのオブジェクトのコレクションをブロックしないでください。 (:issue: `38379` でPabloGalindoとTimPetersによって寄稿されました。)
オブジェクトがガベージコレクターによってファイナライズされているかどうかを確認するための新しい関数 gc.is_finalized()が追加されました。 (:issue: `39322` のPabloGalindoによる寄稿。)
hashlib
hashlib モジュールは、利用可能な場合、SHA3ハッシュとOpenSSLからのSHAKEXOFを使用できるようになりました。 (:issue: `37630` でChristianHeimesによって寄稿されました。)
組み込みのハッシュモジュールは、./configure --without-builtin-hashlib-hashes
で無効にするか、たとえばで選択的に有効にすることができます。 ./configure --with-builtin-hashlib-hashes=sha3,blake2
は、OpenSSLベースの実装の使用を強制します。 (:issue: `40479` のChristianHeimesによる寄稿)
http
http.HTTPStatus に、HTTPステータスコード103 EARLY_HINTS
、418 IM_A_TEAPOT
、425 TOO_EARLY
が追加されました。 (:issue: `39509` のDong-heeNaと:issue:` 39507` のRossRhodesによる寄稿。)
IDLEとidlelib
カーソルの点滅をオフに切り替えるオプションが追加されました。 (:issue: `4603` のZackerySpytzによる寄稿。)
エスケープキーは、IDLE完了ウィンドウを閉じるようになりました。 (:issue: `38944` でJohnnyNajeraによって寄稿されました。)
モジュール名補完リストにキーワードを追加しました。 (TerryJによる寄稿。 のReedy:issue: `37765` 。)
上記の変更は、3.8メンテナンスリリースにバックポートされています。
imaplib
IMAP4 および IMAP4_SSL に、コンストラクター用のオプションの timeout パラメーターが追加されました。 また、 open()メソッドには、この変更によりオプションの timeout パラメーターが追加されました。 この変更には、 IMAP4_SSL および IMAP4_stream のオーバーライドされたメソッドが適用されました。 (:issue: `38615` のDong-hee Naによる寄稿。)
imaplib.IMAP4.unselect()が追加されました。 imaplib.IMAP4.unselect()は、選択されたメールボックスに関連付けられているサーバーのリソースを解放し、サーバーを認証済みの状態に戻します。 このコマンドは、 imaplib.IMAP4.close()と同じアクションを実行しますが、現在選択されているメールボックスからメッセージが完全に削除されない点が異なります。 (:issue: `40375` のDong-hee Naによる寄稿。)
importlib
インポートステートメントとの一貫性を向上させるために、 importlib.util.resolve_name()は、無効な相対インポート試行に対して ValueError ではなく ImportError を発生させるようになりました。 (:issue: `37444` でNgalimSiregarによって寄稿されました。)
不変のモジュールオブジェクトを公開するインポートローダーは、個々のモジュールに加えて不変のパッケージを公開できるようになりました。 (:issue: `39336` でDinoViehlandによって寄稿されました。)
importlib.resources.files()関数を追加し、パッケージデータのサブディレクトリをサポートし、importlib_resources
バージョン1.5のバックポートと一致させました。 (JasonRによる寄稿。 のクーム:問題: `39791` 。)
importlib_metadata
バージョン1.6.1からimportlib.metadata
を更新しました。
検査する
inspect.BoundArguments.arguments がOrderedDict
から通常のdictに変更されました。 (:issue: `36350` および:issue:` 39775` で稲田直樹によって寄稿されました。)
IPアドレス
ipaddress は、IPv6スコープアドレス(サフィックス%<scope_id>
が付いたIPv6アドレス)をサポートするようになりました。
スコープ付きIPv6アドレスは、 ipaddress.IPv6Address を使用して解析できます。 存在する場合、スコープゾーンIDは scope_id 属性を介して利用できます。 (:issue: `34788` でOleksandrPavliukによって寄稿されました。)
Python 3.9.5以降、 ipaddress モジュールはIPv4アドレス文字列の先行ゼロを受け入れなくなりました。 (:issue: `36384` のChristianHeimesによる寄稿)。
算数
math.gcd()関数を拡張して、複数の引数を処理できるようにしました。 以前は、2つの引数しかサポートしていませんでした。 (:issue: `39648` でSerhiyStorchakaによって寄稿されました。)
math.lcm()を追加しました:指定された引数の最小公倍数を返します。 (Mark Dickinson、Ananthakrishnan、Serhiy Storchakaによる:issue: `39479` および:issue:` 39648` の寄稿)
math.nextafter()を追加しました: x の次の浮動小数点値を y に返します。 (:issue: `39288` でVictorStinnerによって寄稿されました。)
追加された math.ulp():浮動小数点の最下位ビットの値を返します。 (:issue: `39310` でVictorStinnerによって寄稿されました。)
マルチプロセッシング
multiprocessing.SimpleQueue クラスには、キューを明示的に閉じるための新しい close()メソッドがあります。 (:issue: `30966` でVictorStinnerによって寄稿されました。)
nntplib
NNTP および NNTP_SSL は、コンストラクターに指定されたタイムアウトがゼロの場合に ValueError を発生させ、非ブロッキングソケットの作成を防止するようになりました。 (:issue: `39259` のDong-hee Naによる寄稿。)
os
si_code
に CLD_KILLED と CLD_STOPPED を追加しました。 (:issue: `38493` のDong-hee Naによる寄稿。)
Linux固有の os.pidfd_open()(:issue: `38692` )および os.P_PIDFD (:issue:` 38713`)を公開しました)ファイル記述子を使用したプロセス管理用。
os.unsetenv()関数がWindowsでも使用できるようになりました。 (:issue: `39413` でVictorStinnerによって寄稿されました。)
os.putenv()および os.unsetenv()関数が常に使用できるようになりました。 (:issue: `39395` でVictorStinnerによって寄稿されました。)
os.waitstatus_to_exitcode()関数が追加されました:待機ステータスを終了コードに変換します。 (:issue: `40094` でVictorStinnerによって寄稿されました。)
pathlib
os.readlink()と同様に機能する pathlib.Path.readlink()を追加しました。 (:issue: `30618` のGirtsFolkmanisによる寄稿)
pdb
Windowsでは、 Pdb が~/.pdbrc
をサポートするようになりました。 (:issue: `20523` でTimHopperとDanLidral-Porterによって寄稿されました。)
poplib
POP3 および POP3_SSL は、コンストラクターに指定されたタイムアウトがゼロの場合に ValueError を発生させ、非ブロッキングソケットの作成を防止するようになりました。 (:issue: `39259` のDong-hee Naによる寄稿。)
pprint
pprint は types.SimpleNamespace をきれいに印刷できるようになりました。 (:issue: `37376` でCarlBordum Hansenによって寄稿されました。)
pydoc
ドキュメント文字列は、クラス、関数、メソッドなどだけでなく、独自の__doc__
属性を持つすべてのオブジェクトに対して表示されるようになりました。 (:issue: `40257` でSerhiyStorchakaによって寄稿されました。)
ランダム
新しいrandom.Random.randbytes
メソッドを追加しました:ランダムバイトを生成します。 (:issue: `40286` でVictorStinnerによって寄稿されました。)
信号
pidの代わりにファイル記述子を使用してプロセスにシグナルを送信するためのLinux固有の signal.pidfd_send_signal()を公開しました。 (:issue: `38712` )
smtplib
SMTP および SMTP_SSL は、コンストラクターに指定されたタイムアウトがゼロの場合に ValueError を発生させ、非ブロッキングソケットの作成を防止するようになりました。 (:issue: `39259` のDong-hee Naによる寄稿。)
LMTP コンストラクターに、オプションの timeout パラメーターが追加されました。 (:issue: `39329` のDong-hee Naによる寄稿。)
ソケット
socket モジュールは、Linux4.1以降で CAN_RAW_JOIN_FILTERS 定数をエクスポートするようになりました。 (:issue: `25780` でStefanTatschnerとZackerySpytzによって寄稿されました。)
ソケットモジュールは、それをサポートするプラットフォームで CAN_J1939 プロトコルをサポートするようになりました。 (:issue: `40291` のKarlDingによる寄稿。)
ソケットモジュールに socket.send_fds()および socket.recv_fds()関数が追加されました。 (:issue: `28724` で、Joannah Nanjekye、Shinya Okano、Victor Stinnerによって寄稿されました。)
時間
AIXでは、 thread_time()は、10ミリ秒の解像度を持つclock_gettime(CLOCK_THREAD_CPUTIME_ID)
ではなく、ナノ秒の解像度を持つthread_cputime()
で実装されるようになりました。 (:issue: `40192` のBatuhanTaskayaによる寄稿)
sys
新しい sys.platlibdir 属性が追加されました:プラットフォーム固有のライブラリディレクトリの名前。 これは、標準ライブラリのパスとインストールされた拡張モジュールのパスを構築するために使用されます。 ほとんどのプラットフォームで"lib"
と同じです。 FedoraおよびSuSEでは、64ビットプラットフォームの"lib64"
と同じです。 (:issue: `1294959` で、JanMatějek、MatějCepl、Charalampos Stratakis、Victor Stinnerによって寄稿されました。)
以前は、 sys.stderr は非対話型のときにブロックバッファリングされていました。 現在、stderr
はデフォルトで常にラインバッファリングされています。 (:issue: `13601` でJendrikSeippによって寄稿されました。)
tracemalloc
tracemalloc.reset_peak()を追加して、トレースされたメモリブロックのピークサイズを現在のサイズに設定し、特定のコードのピークを測定します。 (:issue: `40630` でHuonWilsonによって寄稿されました。)
タイピング
PEP 593 は、 typing.Annotated タイプを導入して、既存のタイプをコンテキスト固有のメタデータで装飾し、 typingに新しいinclude_extras
パラメーターを追加しました。 get_type_hints()を使用して、実行時にメタデータにアクセスします。 (TillVaroquauxとKonstantinKashinによる寄稿。)
venv
venv によって提供されるアクティベーションスクリプトはすべて、__VENV_PROMPT__
で指定された値を常に使用することにより、プロンプトのカスタマイズを一貫して指定するようになりました。 以前は、一部のスクリプトは無条件に__VENV_PROMPT__
を使用し、他のスクリプトはたまたま設定された場合にのみ使用し(デフォルトの場合)、代わりに__VENV_NAME__
を使用していました。 (:issue: `37663` のBrettCannonによる寄稿。)
xml
xml.etree.ElementTree をXMLファイルにシリアル化するときに、属性内の空白文字が保持されるようになりました。 EOLNは「n」に正規化されなくなりました。 これは、XML仕様のセクション2.11を解釈する方法についての議論の結果です。 (:issue: `39011` でMefistotelisによって寄稿されました。)
最適化
内包表記で一時変数を割り当てるためのイディオムを最適化しました。 現在、内包表記の
for y in [expr]
は、単純な割り当てy = expr
と同じくらい高速です。 例えば:sums = [s for s in [0] for x in data for s in [s + x]]
:=
演算子とは異なり、このイディオムは変数を外部スコープにリークしません。(:issue: `32856` のSerhiyStorchakaによる寄稿。)
マルチスレッドアプリケーションでの最適化された信号処理。 メインスレッドとは異なるスレッドがシグナルを受信した場合、バイトコード評価ループは、処理できない保留中のシグナルをチェックするために、各バイトコード命令で中断されなくなりました。 メインインタプリタのメインスレッドのみがシグナルを処理できます。
以前は、メインスレッドがシグナルを処理するまで、バイトコード評価ループは各命令で中断されていました。 (:issue: `40010` でVictorStinnerによって寄稿されました。)
closefrom()
を使用して、FreeBSDのサブプロセスモジュールを最適化しました。 (:issue: `38061` でEdMaste、Conrad Meyer、Kyle Evans、Kubilay Kocak、Victor Stinnerによって寄稿されました。)PyLong_FromDouble()は、 long に収まる値で最大1.87倍高速になりました。 (:issue: `37986` でSergeyFedoseevによって寄稿されました。)
多数のPython組み込み(範囲、タプル、セット、凍結セット、リスト、 dict )は、 PEP 590 vectorcallプロトコルを使用して高速化されました。 (:issue: `37207` で、Dong-hee Na、Mark Shannon、Jeroen Demeyer、Petr Viktorinによって寄稿されました。)
他のセットが基本セットよりもはるかに大きい場合に最適化された
difference_update()
。 (:issue: `8425` でMicheleOrrùによって提供されたコードを使用して、Evgeny Kapunによって提案されました。)Pythonのスモールオブジェクトアロケータ(
obmalloc.c
)では、OSに戻さなくても、空のアリーナを1つ(最大)ですぐに再利用できるようになりました。 これにより、反復ごとにアリーナが新たに作成および破棄される可能性がある単純なループでのスラッシングが防止されます。 (:issue: `37257` でTimPetersによって寄稿されました。)浮動小数点演算のフロア分割のパフォーマンスが向上しました。 また、この操作の ZeroDivisionError のメッセージが更新されます。 (:issue: `39434` のDong-hee Naによる寄稿。)
UTF-8およびasciiコーデックを使用した短いASCII文字列のデコードは、約15 % f asterになりました。 (:issue: `37348` で稲田直樹によって寄稿されました。)
Python3.4からPython3.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
の可変アクセスベンチマークスクリプトから生成されました。 ベンチマークスクリプトは、タイミングをナノ秒単位で表示します。 ベンチマークは、 python.org にあるmacOS64ビットビルドを実行するIntel®Core™i7-4960HQプロセッサで測定されました。
非推奨
distutils
bdist_msi
コマンドは非推奨になりました。代わりに、bdist_wheel
(ホイールパッケージ)を使用してください。 (:issue: `39586` のHugovan Kemenadeによる寄稿。)現在、 math.factorial()は、負でない整数値(
5.0
など)を持つ float インスタンスを受け入れます。 非整数および負の浮動小数点数に対して ValueError を発生させます。 現在は非推奨です。 将来のPythonバージョンでは、すべてのフロートに対して TypeError が発生します。 (:issue: `37315` のSerhiyStorchakaによる寄稿。)parser および symbol モジュールは非推奨であり、Pythonの将来のバージョンで削除される予定です。 ほとんどのユースケースでは、ユーザーは ast モジュールを使用して、抽象構文木(AST)の生成およびコンパイル段階を活用できます。
パブリックCAPI関数 PyParser_SimpleParseStringFlags()、 PyParser_SimpleParseStringFlagsFilename()、 PyParser_SimpleParseFileFlags()および
PyNode_Compile()
は廃止されます。古いパーサーと一緒に。ブールコンテキストでの NotImplemented の使用は、ほとんど排他的に不適切なリッチコンパレータの実装の結果であるため、非推奨になりました。 Pythonの将来のバージョンでは、 TypeError になります。 (:issue: `35712` でJoshRosenbergによって寄稿されました。)
random モジュールは現在、可能なシード値としてハッシュ可能なタイプを受け入れます。 残念ながら、これらのタイプの一部は、決定論的なハッシュ値を持つことが保証されていません。 Python 3.9以降、モジュールはシードを None 、 int 、 float 、 str 、 bytes に制限します。 、および bytearray 。
mode 引数を指定せずに GzipFile ファイルを書き込み用に開くことは非推奨です。 将来のPythonバージョンでは、デフォルトで常に読み取り用に開かれます。 警告の書き込みと消音のために開くには、 mode 引数を指定します。 (:issue: `28286` のSerhiyStorchakaによる寄稿。)
_tkinter.TkappType
のsplit()
メソッドを廃止し、より一貫性のある予測可能な動作を行うsplitlist()
メソッドを採用しました。 (:issue: `38371` でSerhiyStorchakaによって寄稿されました。)asyncio.wait()
へのコルーチンオブジェクトの明示的な受け渡しは非推奨になり、バージョン3.11で削除される予定です。 (:issue: `34790` でYurySelivanovとKyleStanleyによって寄稿されました。)binhex4およびhexbin4標準は非推奨になりました。 binhex モジュールと次の binascii 関数は非推奨になりました。
(:issue: `39353` でVictorStinnerによって寄稿されました。)
ast クラス
slice
、Index
、およびExtSlice
は非推奨と見なされ、将来のPythonバージョンで削除される予定です。Index(value)
の代わりにvalue
自体を使用する必要があります。ExtSlice(slices)
の代わりにTuple(slices, Load())
を使用する必要があります。 (:issue: `34822` のSerhiyStorchakaによる寄稿。)ast クラス
Suite
、Param
、AugLoad
、AugStore
は非推奨と見なされ、将来のPythonバージョンで削除される予定です。 それらはパーサーによって生成されず、Python3のコードジェネレーターによって受け入れられませんでした。 (:issue: `39639` および:issue:` 39969` のBatuhanTaskayaおよび:issue: `39988` のSerhiyStorchakaによる寄稿。)PyEval_InitThreads()および PyEval_ThreadsInitialized()関数は非推奨になり、Python3.11で削除される予定です。 PyEval_InitThreads()を呼び出しても、何も実行されなくなりました。 GIL は、Python3.7以降の Py_Initialize()によって初期化されます。 (:issue: `39877` でVictorStinnerによって寄稿されました。)
shlex.split()関数への最初の引数として
None
を渡すことは非推奨になりました。 (:issue: `33262` のZackerySpytzによる寄稿。)smtpd.MailmanProxy()は、外部モジュール
mailman
がないと使用できないため、非推奨になりました。 (:issue: `35800` でSamuelColvinによって寄稿されました。)lib2to3 モジュールが PendingDeprecationWarning を発行するようになりました。 Python 3.9はPEGパーサーに切り替わり( PEP 617 を参照)、Python 3.10には、lib2to3のLL(1)パーサーでは解析できない新しい言語構文が含まれている場合があります。
lib2to3
モジュールは、将来のPythonバージョンで標準ライブラリから削除される可能性があります。 LibCST や parso などのサードパーティの代替品を検討してください。 (:issue: `40360` でCarlMeyerによって寄稿されました。)random.shuffle()の random パラメーターは非推奨になりました。 (:issue: `40465` のRaymondHettingerによる寄稿)
NS
unittest.mock.__version__
の誤ったバージョンは削除されました。- nntplib.NNTP :
xpath()
およびxgtitle()
メソッドが削除されました。 これらのメソッドは、Python3.3以降非推奨になりました。 通常、これらの拡張機能はNNTPサーバー管理者によってサポートされていないか、有効になっていません。xgtitle()
の場合は、代わりに nntplib.NNTP.descriptions()または nntplib.NNTP.description()を使用してください。 (:issue: `39366` のDong-hee Naによる寄稿。) - array.array :
tostring()
およびfromstring()
メソッドは削除されました。 これらはtobytes()
およびfrombytes()
のエイリアスであり、Python3.2以降非推奨になりました。 (:issue: `38916` でVictorStinnerによって寄稿されました。) - 文書化されていない
sys.callstats()
関数は削除されました。 Python 3.7以降、非推奨になり、常に None が返されました。 Python3.7ですでに削除されている特別なビルドオプションCALL_PROFILE
が必要でした。 (:issue: `37414` でVictorStinnerによって寄稿されました。) sys.getcheckinterval()
およびsys.setcheckinterval()
機能は削除されました。 これらはPython3.2以降非推奨になりました。 代わりに、 sys.getswitchinterval()および sys.setswitchinterval()を使用してください。 (:issue: `37392` でVictorStinnerによって寄稿されました。)- C関数
PyImport_Cleanup()
は削除されました。 次のように文書化されています。「モジュールテーブルを空にします。 内部使用のみ。" (:issue: `36710` でVictorStinnerによって寄稿されました。) _dummy_thread
およびdummy_threading
モジュールは削除されました。 これらのモジュールは、スレッドのサポートを必要とするPython3.7以降非推奨になりました。 (:issue: `37312` でVictorStinnerによって寄稿されました。)aifc.openfp()
エイリアスからaifc.open()
、sunau.openfp()
エイリアスからsunau.open()
、wave.openfp()
エイリアスから wave.open()削除されました。 Python3.7以降は非推奨になりました。 (:issue: `37320` でVictorStinnerによって寄稿されました。)- threading.Thread の
isAlive()
メソッドは削除されました。 Python3.8以降は非推奨になりました。 代わりに is_alive()を使用してください。 (:issue: `37804` のDong-hee Naによる寄稿。) - ElementTree モジュールのクラス ElementTree および Element のメソッド
getchildren()
およびgetiterator()
は削除されました。 これらはPython3.2で非推奨になりました。x.getchildren()
の代わりにiter(x)
またはlist(x)
を使用し、x.getiterator()
の代わりにx.iter()
またはlist(x.iter())
を使用します。 (:issue: `36543` でSerhiyStorchakaによって寄稿されました。) - 古い plistlib APIは削除され、Python3.4以降非推奨になりました。 load()、 load()、 dump()、および dumps()関数を使用します。 さらに、 use_builtin_types パラメーターが削除され、代わりに標準の bytes オブジェクトが常に使用されます。 (:issue: `36409` でJonJanzenによって寄稿されました。)
- C関数
PyGen_NeedsFinalizing
は削除されました。 PEP 442 の実装後、CPython内のどこにも文書化、テスト、または使用されていませんでした。 JoannahNanjekyeによるパッチ。 (:issue: `15088` のJoannahNanjekyeによる寄稿) base64.encodestring()
およびbase64.decodestring()
、Python 3.1以降非推奨のエイリアスは削除されました。代わりに、 base64.encodebytes()および base64.decodebytes()を使用してください。 (:issue: `39351` でVictorStinnerによって寄稿されました。)fractions.gcd()
関数は削除され、Python 3.5(:issue: `22486` )以降非推奨になりました。代わりに math.gcd()を使用してください。 (:issue: `39350` でVictorStinnerによって寄稿されました。)- bz2.BZ2File の buffering パラメーターが削除されました。 Python 3.0以降、無視され、使用すると DeprecationWarning が発生しました。 開いているファイルオブジェクトを渡して、ファイルを開く方法を制御します。 (:issue: `39357` でVictorStinnerによって寄稿されました。)
- json.loads()の encoding パラメーターが削除されました。 Python 3.1以降、非推奨になり、無視されました。 これを使用すると、Python3.8以降 DeprecationWarning が発生します。 (:issue: `39377` の稲田直樹による寄稿)
with (await asyncio.lock):
およびwith (yield from asyncio.lock):
ステートメントはサポートされなくなりました。代わりに、async with lock
を使用してください。asyncio.Condition
とasyncio.Semaphore
についても同じことが言えます。 (Andrew Svetlovによる:issue: `34793` での寄稿。)sys.getcounts()
関数、-X showalloccount
コマンドラインオプション、およびC構造体 PyConfig のshow_alloc_count
フィールドが削除されました。COUNT_ALLOCS
マクロを定義して、特別なPythonビルドが必要でした。 (:issue: `39489` でVictorStinnerによって寄稿されました。)- typing.NamedTuple クラスの
_field_types
属性は削除されました。 Python3.8以降は非推奨になりました。 代わりに__annotations__
属性を使用してください。 (:issue: `40182` のSerhiyStorchakaによる寄稿。) symtable.SymbolTable.has_exec()
メソッドは削除されました。 2006年から非推奨になり、呼び出されたときにのみFalse
が返されます。 (:issue: `40208` のBatuhanTaskayaによる寄稿)asyncio.Task.current_task()
とasyncio.Task.all_tasks()
は削除されました。 これらはPython3.7以降非推奨になり、代わりに asyncio.current_task()および asyncio.all_tasks()を使用できます。 (:issue: `40967` のRémiLapeyreによる寄稿)- html.parser.HTMLParser クラスの
unescape()
メソッドは削除されました(Python 3.4以降非推奨になりました)。 html.unescape()は、文字参照を対応するUnicode文字に変換するために使用する必要があります。
Python3.9への移植
このセクションでは、コードの変更が必要になる可能性のある、前述の変更とその他のバグ修正を示します。
PythonAPIの変更
- __ import __()および importlib.util.resolve_name()は、以前 ValueError を発生させていた場所で ImportError を発生させるようになりました。 特定の例外タイプをキャッチし、Python 3.9以前のバージョンの両方をサポートする呼び出し元は、
except (ImportError, ValueError):
を使用して両方をキャッチする必要があります。 - venv アクティベーションスクリプトは、
__VENV_PROMPT__
が""
に設定されている場合の特殊なケースではなくなりました。 - select.epoll.unregister()メソッドは、 EBADF エラーを無視しなくなりました。 (:issue: `39239` でVictorStinnerによって寄稿されました。)
- buffering パラメータが削除されたため、 bz2.BZ2File の compresslevel パラメータはキーワードのみになりました。 (:issue: `39357` でVictorStinnerによって寄稿されました。)
- サブスクリプション用の簡略化されたAST。 単純なインデックスはその値で表され、拡張スライスはタプルで表されます。
Index(value)
はvalue
自体を返し、ExtSlice(slices)
はTuple(slices, Load())
を返します。 (:issue: `34822` のSerhiyStorchakaによる寄稿。) - importlib モジュールは、 -E または -I コマンドラインオプションが使用されています。
- encoding パラメーターが、キーワードのみのパラメーターとしてクラス ftplib.FTP および ftplib.FTP_TLS に追加され、デフォルトのエンコーディングがLatin-から変更されました。 RFC 2640 に続くUTF-8への1。
asyncio.loop.shutdown_default_executor()
が AbstractEventLoop に追加されました。つまり、それを継承する代替イベントループでこのメソッドを定義する必要があります。 (:issue: `34037` でKyleStanleyによって寄稿されました。)- __ future __ モジュールのfutureフラグの定数値は、コンパイラフラグとの衝突を防ぐために更新されます。 以前は、
PyCF_ALLOW_TOP_LEVEL_AWAIT
はCO_FUTURE_DIVISION
と衝突していました。 (:issue: `39562` のBatuhanTaskayaによる寄稿) array('u')
は、Py_UNICODE
の代わりにwchar_t
をCタイプとして使用するようになりました。Py_UNICODE
はPython3.3以降のwchar_t
のエイリアスであるため、この変更はその動作に影響しません。 (:issue: `34538` で稲田直樹によって寄稿されました。)- logging.getLogger() APIは、
'root'
という名前が渡されたときにルートロガーを返すようになりましたが、以前は'root'
という名前の非ルートロガーを返していました。 これは、ユーザーコードが'root'
という名前の非ルートロガーを明示的に必要とする場合、または'root.py'
と呼ばれるトップレベルモジュールでlogging.getLogger(__name__)
を使用してロガーをインスタンス化する場合に影響する可能性があります。 (:issue: `37742` のVinaySajipによる寄稿。) - PurePath の分割処理は、
str
または PurePath のインスタンス以外のものが渡されたときに、 TypeError を発生させる代わりに、NotImplemented
を返すようになりました。 ]。 これにより、前述のタイプから継承しない互換性のあるクラスを作成できます。 (:issue: `34775` でRogerAiudiによって寄稿されました)。 - Python 3.9.5以降、 ipaddress モジュールはIPv4アドレス文字列の先行ゼロを受け入れなくなりました。 先行ゼロはあいまいであり、一部のライブラリでは8進表記として解釈されます。 たとえば、レガシー関数 socket.inet_aton()は、先行ゼロを8進表記として扱います。 最新の inet_pton()のglibc実装は、先行ゼロを受け入れません。 (:issue: `36384` のChristianHeimesによる寄稿)。
- codecs.lookup()は、 codecs.lookup()も名前を小文字に変換することを除いて、
encodings.normalize_encoding()
と同じ方法でエンコード名を正規化するようになりました。 たとえば、"latex+latin1"
エンコーディング名は"latex_latin1"
に正規化されるようになりました。 (:issue: `37751` のJordonXuによる寄稿。)
CAPIの変更
ヒープに割り当てられた型のインスタンス( PyType_FromSpec()および同様のAPIで作成されたものなど)は、Python3.8以降の型オブジェクトへの参照を保持します。 Python3.8の「CAPIの変更」に示されているように、ほとんどの場合、副作用はありませんが、カスタム tp_traverse 関数を持つタイプの場合は、すべてのカスタム[X208X ] ヒープ割り当て型の関数は、オブジェクトの型にアクセスします。
例:
int foo_traverse(foo_struct *self, visitproc visit, void *arg) { // Rest of the traverse function #if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (Python issue 35810 and 40217) Py_VISIT(Py_TYPE(self)); #endif }
トラバース関数がその基本クラス(または別のタイプ)の
tp_traverse
に委任する場合は、Py_TYPE(self)
に1回だけアクセスするようにしてください。tp_traverse
のタイプにアクセスするのはヒープタイプのみであることに注意してください。たとえば、
tp_traverse
関数に次のものが含まれている場合:base->tp_traverse(self, visit, arg)
それから加えて:
#if PY_VERSION_HEX >= 0x03090000 // This was not needed before Python 3.9 (Python issue 35810 and 40217) if (base->tp_flags & Py_TPFLAGS_HEAPTYPE) { // a heap type's tp_traverse already visited Py_TYPE(self) } else { Py_VISIT(Py_TYPE(self)); } #else
(詳細については、:issue: `35810` および:issue:` 40217` を参照してください。)
関数
PyEval_CallObject
、PyEval_CallFunction
、PyEval_CallMethod
、およびPyEval_CallObjectWithKeywords
は非推奨になりました。 代わりに、 PyObject_Call()とそのバリアントを使用してください。 (詳細については、:issue: `29548` を参照してください。)
CPythonバイトコードの変更
:opcode: `LOAD_ASSERTION_ERROR` オペコードは、 assert ステートメントを処理するために追加されました。 以前は、 AssertionError 例外がシャドウされていた場合、assertステートメントは正しく機能しませんでした。 (:issue: `34880` のZackerySpytzによる寄稿。)
:opcode: `COMPARE_OP` オペコードは、次の4つの異なる命令に分割されました。
豊富な比較のための
COMPARE_OP
IS_OP
の「is」および「isnot」テストCONTAINS_OP
「in」および「notin」テストの場合JUMP_IF_NOT_EXC_MATCH
「try-except」ステートメントの例外をチェックします。
(:issue: `39156` でMarkShannonによって寄稿されました。)
ビルドの変更
--with-platlibdir
オプションをconfigure
スクリプトに追加しました。新しい sys.platlibdir 属性に格納されているプラットフォーム固有のライブラリディレクトリの名前です。 詳細については、 sys.platlibdir 属性を参照してください。 (:issue: `1294959` で、JanMatějek、MatějCepl、Charalampos Stratakis、Victor Stinnerによって寄稿されました。)COUNT_ALLOCS
特殊ビルドマクロは削除されました。 (:issue: `39489` でVictorStinnerによって寄稿されました。)- Windows以外のプラットフォームでは、Pythonをビルドするために
setenv()
およびunsetenv()
関数が必要になりました。 (:issue: `39395` でVictorStinnerによって寄稿されました。) - Windows以外のプラットフォームでは、
bdist_wininst
インストーラーの作成は正式にサポートされなくなりました。 (詳細については、:issue: `10945` を参照してください。) - ソースからmacOSでPythonをビルドする場合、
_tkinter
は、以前のリリースのmacOSの場合と同様に、/Library/Frameworks
にインストールされている場合、非システムTclおよびTkフレームワークとリンクするようになりました。--enable-universalsdk=
または-isysroot
を使用してmacOSSDKが明示的に構成されている場合、SDK自体のみが検索されます。 デフォルトの動作は、--with-tcltk-includes
および--with-tcltk-libs
でオーバーライドできます。 (:issue: `34956` でNedDeilyによって寄稿されました。) - PythonをWindows10ARM64用に構築できるようになりました。 (:issue: `33125` でSteveDowerによって寄稿されました。)
--pgo
を使用すると、一部の個別のテストがスキップされるようになりました。 問題のテストでは、PGOタスク時間が大幅に増加し、最終的な実行可能ファイルの最適化の改善に役立たなかった可能性があります。 これにより、タスクが約15倍高速化されます。 フルユニットテストスイートの実行には時間がかかります。 この変更により、実行されるコードブランチの数が少なくなるため、ビルドの最適化がわずかに低下する可能性があります。 はるかに遅いビルドを待つ場合は、./configure [..] PROFILE_TASK="-m test --pgo-extended"
を使用して古い動作を復元できます。 どのPGOタスクセットがより高速なビルドを生成するかについては保証しません。 結果は環境、ワークロード、およびコンパイラツールチェーンに依存する可能性があるため、気になるユーザーは独自の関連ベンチマークを実行する必要があります。 (詳細については、:issue: `36044` および:issue:` 37707` を参照してください。)
CAPIの変更
新機能
PEP 573 :モジュールをクラスに関連付けるための PyType_FromModuleAndSpec()を追加しました。 PyType_GetModule()および PyType_GetModuleState()を使用して、モジュールとその状態を取得します。 PyCMethod および
METH_METHOD
は、メソッドが定義されたクラスにアクセスできるようにします。 (:issue: `38787` でMarcelPlchとPetrViktorinによって寄稿されました。)PyFrame_GetCode()関数を追加しました:フレームコードを取得します。 PyFrame_GetBack()関数を追加しました:フレームを次の外側のフレームに取得します。 (:issue: `40421` でVictorStinnerによって寄稿されました。)
制限付きCAPIに PyFrame_GetLineNumber()を追加しました。 (:issue: `40421` でVictorStinnerによって寄稿されました。)
PyThreadState_GetInterpreter()および PyInterpreterState_Get()関数を追加して、インタープリターを取得します。 Pythonスレッド状態の現在のフレームを取得するための PyThreadState_GetFrame()関数が追加されました。 PyThreadState_GetID()関数が追加されました:Pythonスレッド状態の一意の識別子を取得します。 (:issue: `39947` でVictorStinnerによって寄稿されました。)
新しいパブリック PyObject_CallNoArgs()関数をC APIに追加しました。この関数は、引数なしで呼び出し可能なPythonオブジェクトを呼び出します。 これは、引数なしで呼び出し可能なPythonオブジェクトを呼び出すための最も効率的な方法です。 (:issue: `37194` でVictorStinnerによって寄稿されました。)
制限付きCAPIの変更(
Py_LIMITED_API
マクロが定義されている場合):制限付きAPIの通常の関数として、 Py_EnterRecursiveCall()および Py_LeaveRecursiveCall()を提供します。 以前はマクロとして定義されていましたが、これらのマクロは
PyThreadState.recursion_depth
フィールドにアクセスできない制限付きCAPIでコンパイルされませんでした(制限付きC APIでは構造が不透明です)。PyObject_INIT()
とPyObject_INIT_VAR()
は、実装の詳細を非表示にする通常の「不透明」関数になります。
(:issue: `38644` および:issue:` 39542` でVictorStinnerによって寄稿されました。)
PyModule_AddType()関数が追加され、モジュールに型を追加できるようになりました。 (:issue: `40024` のDong-hee Naによる寄稿。)
関数 PyObject_GC_IsTracked()および PyObject_GC_IsFinalized()をパブリックAPIに追加して、Pythonオブジェクトが現在追跡されているか、ガベージコレクターによってすでにファイナライズされているかをクエリできるようにしました。 (:issue: `40241` のPabloGalindo Salgadoによる寄稿。)
関数のようなオブジェクトのユーザーフレンドリーな文字列表現を取得するために
_PyObject_FunctionStr()
を追加しました。 (:issue: `37645` のJeroenDemeyerによるパッチ。)1つの位置引数を持つオブジェクトを呼び出すための PyObject_CallOneArg()を追加しました(:issue: `37483` のJeroenDemeyerによるパッチ)。
Python3.9への移植
PyInterpreterState.eval_frame
( PEP 523 )には、新しい必須の tstate パラメーター(PyThreadState*
)が必要になりました。 (:issue: `38500` でVictorStinnerによって寄稿されました。)拡張モジュール: PyModuleDef の m_traverse 、 m_clear 、および m_free 関数は、モジュールの状態が要求されたがまだ割り当てられていない場合は呼び出されなくなりました。 これは、モジュールが作成された直後で、モジュールが実行される前の場合です( Py_mod_exec 関数)。 より正確には、 m_size が0より大きく、モジュールの状態( PyModule_GetState()によって返される)が
NULL
の場合、これらの関数は呼び出されません。モジュール状態のない拡張モジュール(
m_size <= 0
)は影響を受けません。Py_AddPendingCall()がサブインタープリターで呼び出された場合、関数はメインインタープリターから呼び出されるのではなく、サブインタープリターから呼び出されるようにスケジュールされます。 各サブインタープリターには、スケジュールされた通話の独自のリストがあります。 (:issue: `39984` でVictorStinnerによって寄稿されました。)
-E
オプションが使用されている場合( PyConfig.use_environment が0
に設定されている場合)、Windowsレジストリは sys.path の初期化に使用されなくなりました。 。 これは、WindowsにPythonを埋め込む場合に重要です。 (:issue: `8901` のZackerySpytzによる寄稿。)グローバル変数 PyStructSequence_UnnamedField は定数になり、定数文字列を参照します。 (:issue: `38650` でSerhiyStorchakaによって寄稿されました。)
PyGC_Head
構造が不透明になりました。 これは、内部C API(pycore_gc.h
)でのみ定義されています。 (:issue: `40241` でVictorStinnerによって寄稿されました。)Py_UNICODE_COPY
、Py_UNICODE_FILL
、PyUnicode_WSTR_LENGTH
、 PyUnicode_FromUnicode()、 PyUnicode_AsUnicode()、_PyUnicode_AsUnicode
、および PyUnicode_AsUnicodeAndSize()は、Cで非推奨としてマークされています。 Python 3.3以降、 PEP 393 で非推奨になりました。 (:issue: `36346` で稲田直樹によって寄稿されました。)Py_FatalError()関数は、
Py_LIMITED_API
マクロが定義されていない限り、現在の関数の名前を自動的にログに記録するマクロに置き換えられます。 (:issue: `39882` でVictorStinnerによって寄稿されました。)vectorcallプロトコルでは、呼び出し元がキーワード名として文字列のみを渡す必要があります。 (詳細については、:issue: `37540` を参照してください。)
多くのマクロと関数の実装の詳細が非表示になりました。
PyObject_IS_GC()マクロが関数に変換されました。
PyObject_NEW()
マクロは PyObject_New()マクロのエイリアスになり、PyObject_NEW_VAR()
マクロは PyObject_NewVar()マクロのエイリアスになります。 PyTypeObject.tp_basicsize メンバーに直接アクセスしなくなりました。PyType_HasFeature()は常に PyType_GetFlags()を呼び出すようになりました。 以前は、制限付きC APIが使用されていない場合、 PyTypeObject.tp_flags メンバーに直接アクセスしていました。
PyObject_GET_WEAKREFS_LISTPTR()
マクロが関数に変換されました。マクロは PyTypeObject.tp_weaklistoffset メンバーに直接アクセスしました。PyObject_CheckBuffer()マクロが関数に変換されました:マクロは PyTypeObject.tp_as_buffer メンバーに直接アクセスしました。
PyIndex_Check()は、実装の詳細を非表示にする不透明な関数として常に宣言されるようになりました。
PyIndex_Check()
マクロが削除されました。 PyTypeObject.tp_as_number メンバーに直接アクセスされるマクロ。
(詳細については、:issue: `40170` を参照してください。)
NS
pyfpe.h
のPyFPE_START_PROTECT()
およびPyFPE_END_PROTECT()
マクロを制限付きCAPIから除外しました。 (:issue: `38835` でVictorStinnerによって寄稿されました。)PyTypeObject の
tp_print
スロットが削除されました。 Python2.7以前ではオブジェクトをファイルに出力するために使用されていました。 Python 3.0以降、無視され、使用されていません。 (:issue: `36974` でJeroenDemeyerによって寄稿されました。)制限付きCAPIの変更(
Py_LIMITED_API
マクロが定義されている場合):制限付きCAPIから次の関数を除外しました。
PyThreadState_DeleteCurrent()
(:issue: `37878` でJoannahNanjekyeによって寄稿されました。)_Py_CheckRecursionLimit
_Py_NewReference()
_Py_ForgetReference()
_PyTraceMalloc_NewReference()
_Py_GetRefTotal()
限られたCAPIでは機能しなかったゴミ箱メカニズム。
PyTrash_UNWIND_LEVEL
Py_TRASHCAN_BEGIN_CONDITION
Py_TRASHCAN_BEGIN
Py_TRASHCAN_END
Py_TRASHCAN_SAFE_BEGIN
Py_TRASHCAN_SAFE_END
以下の関数と定義を内部CAPIに移動しました。
_PyDebug_PrintTotalRefs()
_Py_PrintReferences()
_Py_PrintReferenceAddresses()
_Py_tracemalloc_config
_Py_AddToAllObjects()
(Py_TRACE_REFS
ビルドに固有)
(:issue: `38644` および:issue:` 39542` でVictorStinnerによって寄稿されました。)
_PyRuntime.getframe
フックを削除し、_PyRuntime.getframe
のエイリアスである_PyThreadState_GetFrame
マクロを削除しました。 それらは内部CAPIによってのみ公開されました。PyThreadFrameGetter
タイプも削除しました。 (:issue: `39946` でVictorStinnerによって寄稿されました。)CAPIから次の関数を削除しました。
PyGC_Collect()
を明示的に呼び出して、すべての空きリストをクリアします。 (:issue: `37340` 、:issue:` 38896` 、:issue: `40428` で稲田直樹とVictorStinnerによって寄稿されました。)PyAsyncGen_ClearFreeLists()
PyContext_ClearFreeList()
PyDict_ClearFreeList()
PyFloat_ClearFreeList()
PyFrame_ClearFreeList()
PyList_ClearFreeList()
PyMethod_ClearFreeList()
およびPyCFunction_ClearFreeList()
:バインドされたメソッドオブジェクトの空きリストが削除されました。PySet_ClearFreeList()
:Python3.4でセットフリーリストが削除されました。PyTuple_ClearFreeList()
PyUnicode_ClearFreeList()
:UnicodeフリーリストはPython3.3で削除されました。
_PyUnicode_ClearStaticStrings()
機能を削除しました。 (:issue: `39465` でVictorStinnerによって寄稿されました。)Py_UNICODE_MATCH
を削除しました。 PEP 393 で非推奨になり、Python3.3以降で壊れています。 代わりに、 PyUnicode_Tailmatch()関数を使用できます。 (:issue: `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
。 (:issue: `39372` のPabloGalindo Salgadoによる寄稿。)
Python3.9.1での注目すべき変更
タイピング
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'
(:issue: `42345` のYuriiKarabasによる寄稿。)
macOS 11.0(Big Sur)およびApple SiliconMacのサポート
3.9.1以降、PythonはmacOS 11.0(Big Sur)およびApple Silicon Mac(ARM64
アーキテクチャに基づく)でのビルドと実行を完全にサポートするようになりました。 新しいユニバーサルビルドバリアントuniversal2
が利用可能になり、1セットの実行可能ファイルでARM64
とIntel 64
の両方をネイティブにサポートできるようになりました。 バイナリは、現在のバージョンのmacOSで構築して、さまざまな古いmacOSバージョン(10.9でテスト済み)にデプロイできるようになりました。また、実行時に使用されているオペレーティングシステムのバージョンに基づいて、いくつかの新しいOS機能とオプションを条件付きで利用できるようにしています(「ウィークリンク」)。 )。
(:issue: `41100` でRonaldOussorenとLawrenceD'Annaによって寄稿されました。)
Python3.9.2での注目すべき変更
collections.abc
collections.abc.Callable ジェネリックは、 typing.Callable が現在行っているのと同様に、型パラメーターをフラット化するようになりました。 これは、collections.abc.Callable[[int, str], str]
が(int, str, str)
の__args__
を持つことを意味します。 以前は([int, str], str)
でした。 この変更を可能にするために、 types.GenericAlias をサブクラス化できるようになり、 collections.abc.Callable タイプをサブスクリプト化するとサブクラスが返されます。 typing.get_args()または__args__
を介して引数にアクセスするコードは、この変更を考慮する必要があります。 DeprecationWarning は、Python3.9.1でサイレントに渡された可能性のある無効な形式のパラメーター化 collections.abc.Callable に対して発行される場合があります。 この DeprecationWarning は、Python3.10では TypeError になります。 (:issue: `42195` でKenJinによって寄稿されました。)
urllib.parse
以前のPythonバージョンでは、 urllib.parse.parse_qs()および urllib.parse.parse_qsl()のクエリパラメーター区切り文字として;
と&
の両方を使用できました。 ]。 セキュリティ上の懸念と、新しいW3Cの推奨事項に準拠するために、これは、&
をデフォルトとして、単一の区切りキーのみを許可するように変更されました。 この変更は、影響を受ける関数を内部で使用するため、 cgi.parse()および cgi.parse_multipart()にも影響します。 詳細については、それぞれのドキュメントを参照してください。 (:issue: `42967` でAdamGoldschmidt、Senthil Kumaran、Ken Jinによって寄稿されました。)
Python3.9.3での注目すべき変更
セキュリティ修正により、 ftplib.FTP の動作が変更され、パッシブデータチャネルを設定するときにリモートサーバーから送信されたIPv4アドレスが信頼されなくなります。 代わりに、ftpサーバーのIPアドレスを再利用します。 古い動作を必要とする異常なコードの場合は、FTPインスタンスのtrust_server_pasv_ipv4_address
属性をTrue
に設定します。 (:issue: `43285` を参照)
Python3.9.5での注目すべき変更
urllib.parse
URLの一部に改行文字またはタブ文字が含まれていると、何らかの形の攻撃が可能になります。 RFC 3986 を更新するWHATWG仕様に従って、ASCII改行\n
、\r
、およびタブ\t
文字がURLから削除されます urllib.parse のパーサーによってそのような攻撃を防ぎます。 削除文字は、新しいモジュールレベル変数urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE
によって制御されます。 (:issue: `43882` を参照)