Python 3.10

Python 3.10.0(最終版)は2021年10月4日にリリースされました。3.10の機能は PEP 619 で定義されており、変更点の詳細な説明は What's New in Python 3.10 で確認できます。

新しい構文機能

ステータス

PEP 634

構造的パターンマッチング: 仕様

[1]

PEP 635

構造的パターンマッチング: 動機と論拠

[1]

PEP 636

構造的パターンマッチング: チュートリアル

[1]

bpo-12782

括弧で囲んだコンテキストマネージャが正式に許可されました

標準ライブラリの新機能

PEP 618

zip にオプションの長さチェックを追加

インタプリタの改善

PEP 626

デバッグやその他のツール向けの正確な行番号

新しい型付け機能

PEP 604

ユニオン型を X | Y と記述できるようにする

PEP 613

明示的な型エイリアス

PEP 612

パラメータ仕様変数

重要な非推奨化、削除、または制限

PEP 644

OpenSSL 1.1.1 以降を必須にする

PEP 632

distutils モジュールを非推奨にする。

関連なし

PEP 623

PyUnicodeObject の wstr メンバを非推奨にし、削除に向けて準備する。

関連なし

PEP 624

Py_UNICODE エンコーダ API を削除

関連なし

PEP 597

オプションの EncodingWarning を追加

その他の言語の変更点:

int 型に新しいメソッド int.bit_count() が追加されました。これは指定された整数の2進数表現に含まれる1の個数を返すもので、ポピュレーションカウントとも呼ばれます。

dict.keys()dict.values()dict.items() が返すビューはすべて mapping 属性を持つようになり、元の辞書をラップした types.MappingProxyType オブジェクトを返します。

PEP 618: zip() 関数にオプションの strict フラグが追加されました。これはすべてのイテラブルが等しい長さであることを要求するために使用します。

整数引数を取る組み込み関数および拡張関数は、DecimalFraction、および損失を伴わずには整数に変換できないその他のオブジェクト(例えば __int__() メソッドは持つが __index__() メソッドは持たないもの)を受け付けなくなりました。

object.__ipow__()NotImplemented を返す場合、演算子は期待どおりに object.__pow__()object.__rpow__() へ正しくフォールバックします。

代入式は、集合リテラルと集合内包表記の中、およびシーケンスのインデックス(ただしスライスは除く)の中で、括弧で囲まずに使用できるようになりました。

関数に新しい __builtins__ 属性が追加されました。これは関数の実行時に組み込みシンボルを探すために使用され、__globals__['__builtins__'] を参照する代わりに使われます。この属性は __globals__["__builtins__"] が存在すればそこから、なければ現在の組み込みから初期化されます。

2つの新しい組み込み関数 aiter()anext() が追加され、それぞれ iter()next() の非同期版を提供します。

静的メソッド(@staticmethod)とクラスメソッド(@classmethod)が、メソッド属性(__module____name____qualname____doc____annotations__)を継承するようになり、新しい __wrapped__ 属性を持つようになりました。さらに、静的メソッドは通常の関数として呼び出せるようになりました。

複雑なターゲット(PEP 526 で定義された simple name ターゲット以外のすべて)に対するアノテーションは、from __future__ import annotations のもとでは実行時の影響を一切引き起こさなくなりました。

クラスオブジェクトとモジュールオブジェクトは、必要に応じて空のアノテーション辞書を遅延生成するようになりました。アノテーション辞書は後方互換性のためにオブジェクトの __dict__ に格納されます。これにより __annotations__ を扱う際のベストプラクティスが改善されます。

yieldyield fromawait、または名前付き式から成るアノテーションは、その副作用のため、from __future__ import annotations のもとでは禁止されるようになりました。

アノテーションとしての未束縛変数、super()、およびシンボルテーブルの処理を変えうるその他の式の使用は、from __future__ import annotations のもとでは効果を持たないようになりました。

float 型と decimal.Decimal 型の両方の NaN 値のハッシュは、オブジェクトの同一性に依存するようになりました。以前は、NaN 値は互いに等しくないにもかかわらず、常に 0 にハッシュされていました。これは複数の NaN を含む辞書や集合を作成する際に過剰なハッシュ衝突を引き起こし、潜在的に二次的な実行時挙動を招いていました。

__debug__ 定数を削除しようとすると、(NameError ではなく)SyntaxError が送出されるようになりました。

SyntaxError 例外に end_linenoend_offset 属性が追加されました。これらは決定できない場合 None になります。

組み込みモジュールの変更点:

asyncio

欠けていた connect_accepted_socket() メソッドを追加。

array

array.arrayindex() メソッドに、オプションの start および stop パラメータが追加されました。

gc

gc.get_objects()gc.get_referrers()gc.get_referents() に監査フックを追加。

hashlib

hashlib モジュールは OpenSSL 1.1.1 以降を必要とします。

hashlib モジュールは OpenSSL 3.0.0 を暫定的にサポートしています。

pbkdf2_hmac() の純粋な Python によるフォールバックは非推奨になりました。今後、PBKDF2-HMAC は Python が OpenSSL サポート付きでビルドされた場合にのみ利用できます。

os

VxWorks RTOS 向けに os.cpu_count() のサポートを追加。

Linux の eventfd2 システムコールをラップする新しい関数 os.eventfd() と関連ヘルパーを追加。

カーネルアドレス空間とユーザーアドレス空間の間でコピーすることなく2つのファイルディスクリプタ間でデータを移動できる os.splice() を追加。ファイルディスクリプタの一方はパイプを参照していなければなりません。

macOS 向けに O_EVTONLYO_FSYNCO_SYMLINKO_NOFOLLOW_ANY を追加。

platform

freedesktop.org os-release 標準ファイルからオペレーティングシステムの識別情報を取得する platform.freedesktop_os_release() を追加。

socket

例外 socket.timeoutTimeoutError のエイリアスになりました。

IPPROTO_MPTCP を使って MPTCP ソケットを作成するオプションを追加。

サービスタイプ(ToS)または DSCP/ECN フィールドを受信するための IP_RECVTOS オプションを追加。

ssl

ssl モジュールは OpenSSL 1.1.1 以降を必要とします。

ssl モジュールは OpenSSL 3.0.0 を暫定的にサポートし、新しいオプション OP_IGNORE_UNEXPECTED_EOF が追加されました。

非推奨の関数の使用および非推奨の定数の使用は、DeprecationWarning を発生させるようになりました。ssl.SSLContext.options はデフォルトで OP_NO_SSLv2OP_NO_SSLv3 が設定されているため、再度フラグを設定しても警告できません。

ssl モジュールはより安全なデフォルト設定になりました。前方秘匿性のない暗号や SHA-1 MAC はデフォルトで無効になっています。セキュリティレベル2では、112ビット未満のセキュリティしか持たない脆弱な RSA、DH、ECC 鍵が禁止されます。SSLContext は最小プロトコルバージョンとしてデフォルトで TLS 1.2 を使用します。これらの設定は Hynek Schlawack の研究に基づいています。

非推奨のプロトコルである SSL 3.0、TLS 1.0、TLS 1.1 は正式にはサポートされなくなりました。Python はこれらを積極的にブロックすることはありません。ただし、OpenSSL のビルドオプション、ディストリビューションの設定、ベンダーのパッチ、暗号スイートによってはハンドシェイクが成功しない場合があります。

ssl.get_server_certificate() 関数に timeout パラメータを追加。

ssl モジュールはヒープ型と多段階初期化を使用するようになりました。

新しい検証フラグ VERIFY_X509_PARTIAL_CHAIN が追加されました。

sys

sys.orig_argv 属性を追加。これは Python 実行ファイルに渡された元のコマンドライン引数のリストです。

標準ライブラリのモジュール名のリストを含む sys.stdlib_module_names を追加。

_thread

_thread.interrupt_main() は、シミュレートするシグナル番号をオプションで受け取れるようになりました(デフォルトは引き続き signal.SIGINT です)。

注記