Python 3.9の新機能—Pythonドキュメント

提供:Dev Guides
< PythonPython/docs/3.9/whatsnew/3.9
移動先:案内検索

Python3.9の新機能

リリース
日にち
2021年10月17日
編集者
ŁukaszLanga

この記事では、3.8と比較したPython3.9の新機能について説明します。 Python3.9は2020年10月5日にリリースされました。

詳細については、 changelog を参照してください。

も参照してください

PEP 596 -Python3.9リリーススケジュール


概要–リリースのハイライト

新しい構文機能:

  • PEP 584dictに結合演算子が追加されました。
  • PEP 585 、標準コレクションのタイプヒントジェネリック。
  • PEP 614 、デコレータの文法制限が緩和されました。

新しい組み込み機能:

  • 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モジュール(_abcaudioop_bz2_codecs_contextvars_crypt、[ X101X] 、_json_localemath演算子リソース、時間[X200X ]、_weakref)は、PEP489で定義されているマルチフェーズ初期化を使用するようになりました。
  • 多数の標準ライブラリモジュール( audioopastgrp_hashlibpwd 、 [ X113X]、 randomselectstructtermioszlib )は、定義された安定した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)が追加され、文字列から不要なプレフィックスまたはサフィックスを簡単に削除できるようになりました。 対応するbytesbytearray、およびcollections.UserStringメソッドも追加されました。 詳細については、 PEP 616 を参照してください。 (:issue: `39939` でDennisSweeneyによって寄稿されました。)


標準コレクションのタイプヒントジェネリック

型注釈では、対応する大文字の型をインポートする代わりに、listdictなどの組み込みのコレクション型をジェネリック型として使用できるようになりました(例: typingListまたは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による寄稿。)

  • タイピングモジュールのヘルプが改善されました。 すべての特殊な形式と特殊な汎用エイリアス(UnionListなど)の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コアチームによって保守されています。

も参照してください

PEP 615 –標準ライブラリでのIANAタイムゾーンデータベースのサポート
PaulGanssleによって作成および実装されたPEP


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ファイルにパス操作の新しいオプションを追加しました: stripdirappenddirlimit_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.dateisocalendar()および datetime.datetime メソッドの isocalendar()は、 namesedtuple()を返すようになりました。 タプルの代わりに。 (:issue: `24416` のDong-hee Naによる寄稿。)


distutils

upload コマンドは、SHA2-256およびBlake2b-256ハッシュダイジェストを作成するようになりました。 MD5ダイジェストをブロックするプラットフォームではMD5をスキップします。 (:issue: `40698` でChristianHeimesによって寄稿されました。)


fcntl

定数F_OFD_GETLKF_OFD_SETLKF_OFD_SETLKWを追加しました。 (:issue: `38602` のDong-hee Naによる寄稿。)


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_HINTS418 IM_A_TEAPOT425 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.argumentsOrderedDictから通常の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_codeCLD_KILLEDCLD_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

pprinttypes.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による寄稿。)


unicodedata

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


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以降、モジュールはシードを Noneintfloatstrbytes に制限します。 、および bytearray

  • mode 引数を指定せずに GzipFile ファイルを書き込み用に開くことは非推奨です。 将来のPythonバージョンでは、デフォルトで常に読み取り用に開かれます。 警告の書き込みと消音のために開くには、 mode 引数を指定します。 (:issue: `28286` のSerhiyStorchakaによる寄稿。)

  • _tkinter.TkappTypesplit()メソッドを廃止し、より一貫性のある予測可能な動作を行うsplitlist()メソッドを採用しました。 (:issue: `38371` でSerhiyStorchakaによって寄稿されました。)

  • asyncio.wait()へのコルーチンオブジェクトの明示的な受け渡しは非推奨になり、バージョン3.11で削除される予定です。 (:issue: `34790` でYurySelivanovとKyleStanleyによって寄稿されました。)

  • binhex4およびhexbin4標準は非推奨になりました。 binhex モジュールと次の binascii 関数は非推奨になりました。

    :issue: `39353` でVictorStinnerによって寄稿されました。)

  • ast クラスsliceIndex、およびExtSliceは非推奨と見なされ、将来のPythonバージョンで削除される予定です。 Index(value)の代わりにvalue自体を使用する必要があります。 ExtSlice(slices)の代わりにTuple(slices, Load())を使用する必要があります。 (:issue: `34822` のSerhiyStorchakaによる寄稿。)

  • ast クラスSuiteParamAugLoadAugStoreは非推奨と見なされ、将来の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バージョンで標準ライブラリから削除される可能性があります。 LibCSTparso などのサードパーティの代替品を検討してください。 (:issue: `40360` でCarlMeyerによって寄稿されました。)

  • random.shuffle()random パラメーターは非推奨になりました。 (:issue: `40465` のRaymondHettingerによる寄稿)


NS

  • unittest.mock.__version__の誤ったバージョンは削除されました。
  • nntplib.NNTPxpath()およびxgtitle()メソッドが削除されました。 これらのメソッドは、Python3.3以降非推奨になりました。 通常、これらの拡張機能はNNTPサーバー管理者によってサポートされていないか、有効になっていません。 xgtitle()の場合は、代わりに nntplib.NNTP.descriptions()または nntplib.NNTP.description()を使用してください。 (:issue: `39366` のDong-hee Naによる寄稿。)
  • array.arraytostring()および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.ThreadisAlive()メソッドは削除されました。 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.BZ2Filebuffering パラメーターが削除されました。 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.Conditionasyncio.Semaphoreについても同じことが言えます。 (Andrew Svetlovによる:issue: `34793` での寄稿。)
  • sys.getcounts()関数、-X showalloccountコマンドラインオプション、およびC構造体 PyConfigshow_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.BZ2Filecompresslevel パラメータはキーワードのみになりました。 (: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_AWAITCO_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_CallObjectPyEval_CallFunctionPyEval_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によって寄稿されました。)

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

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

  • Py_AddPendingCall()がサブインタープリターで呼び出された場合、関数はメインインタープリターから呼び出されるのではなく、サブインタープリターから呼び出されるようにスケジュールされます。 各サブインタープリターには、スケジュールされた通話の独自のリストがあります。 (:issue: `39984` でVictorStinnerによって寄稿されました。)

  • -Eオプションが使用されている場合( PyConfig.use_environment0に設定されている場合)、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_COPYPy_UNICODE_FILLPyUnicode_WSTR_LENGTHPyUnicode_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` を参照してください。)

  • 多くのマクロと関数の実装の詳細が非表示になりました。

    (詳細については、:issue: `40170` を参照してください。)


NS

  • pyfpe.hPyFPE_START_PROTECT()およびPyFPE_END_PROTECT()マクロを制限付きCAPIから除外しました。 (:issue: `38835` でVictorStinnerによって寄稿されました。)

  • PyTypeObjecttp_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_DigitsInitPyFrame_ExtendStack_PyAIterWrapper_TypePyNullImporter_TypePyCmpWrapper_TypePySortWrapper_TypePyNoArgsFunction。 (:issue: `39372` のPabloGalindo Salgadoによる寄稿。)


Python3.9.1での注目すべき変更

タイピング

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'

: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セットの実行可能ファイルでARM64Intel 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` を参照)