What's New In Python 3.10
*************************

編集者:
   Pablo Galindo Salgado

この記事では Python 3.9 と比較した Python 3.10 の新機能を解説します。
Python 3.10 は2021年10月4日にリリースされました。全詳細については 変更
履歴 をご覧ください。


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

新たな文法機能:

* **PEP 634**、構造的パターンマッチ: 仕様

* **PEP 635**、構造的パターンマッチ: モチベーションと原理

* **PEP 636**、構造的パターンマッチ: チュートリアル

* bpo-12782、カッコ内のコンテキストマネージャーが正式にサポート

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

* **PEP 618**、zipに長さチェックのオプション引数が追加

インタプリタの改善:

* **PEP 626**, デバッグおよびその他のツール用の正確な行番号。

新しい型ヒントの機能:

* **PEP 604**、ユニオン型を X | Y と書けるように

* **PEP 612**, パラメータ指定変数

* **PEP 613**, 明示的型エイリアス

* **PEP 647**, ユーザ定義型ガード

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

* **PEP 644**, OpenSSL 1.1.1 以降の必須化

* **PEP 632**, distutilsモジュールが非推奨に

* **PEP 623**, PyUnicodeObject の wstr メンバーの非推奨・削除への準備

* **PEP 624**, Py_UNICODE エンコーダAPIの削除

* **PEP 597**, 任意のEncodingWarningを追加


新しい機能
==========


カッコ内のコンテキストマネージャー
----------------------------------

コンテキストマネージャーを複数行で継続して記述する場合に、カッコで囲む
ことができるようになりました。複数行でたくさんのコンテキストマネージャ
ーを記述するときに、従来のimport文と同じようにフォーマットできます。た
とえば、以下のすべての例は有効です:

   with (CtxManager() as example):
       ...

   with (
       CtxManager1(),
       CtxManager2()
   ):
       ...

   with (CtxManager1() as example,
         CtxManager2()):
       ...

   with (CtxManager1(),
         CtxManager2() as example):
       ...

   with (
       CtxManager1() as example1,
       CtxManager2() as example2
   ):
       ...

カッコに囲まれたグループの最後の要素に対する、末尾のカンマも指定可能で
す。

   with (
       CtxManager1() as example1,
       CtxManager2() as example2,
       CtxManager3() as example3,
   ):
       ...

この新しい構文は、新パーサーによるLL(1)以外の能力を使用しています。詳
細は **PEP 617** を参照してください。

(Guido van Rossum、Pablo Galindo、Lysandros Nikolaou の貢献による
bpo-12782、bpo-40334)


エラーメッセージの改善
----------------------


SyntaxErrors
~~~~~~~~~~~~

閉じられていない括弧やブラケットを含むコードを解析する際、インタープリ
タはこれまでのように *SyntaxError: unexpected EOF while parsing* を表
示したり、誤った位置を指したりするのではなく、未閉鎖の括弧やブラケット
の位置を示すようになりました。たとえば、次のコードを考えてみましょう（
未閉鎖の '{' に注目してください）:

   expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
               38: 4, 39: 4, 45: 5, 46: 5, 47: 5, 48: 5, 49: 5, 54: 6,
   some_other_code = foo()

以前のバージョンのインタープリタは、構文エラーの位置として混乱する場所
を報告していました:

   File "example.py", line 3
       some_other_code = foo()
                       ^
   SyntaxError: invalid syntax

しかしPython 3.10ではより有益なエラーが出力されます:

   File "example.py", line 1
       expected = {9: 1, 18: 2, 19: 2, 27: 3, 28: 3, 29: 3, 36: 4, 37: 4,
                  ^
   SyntaxError: '{' was never closed

同様に、閉じられていない文字列リテラル（シングルクォートおよびトリプル
クォート）に関するエラーも、これまでのように EOF/EOL を報告するのでは
なく、文字列の開始位置を指すようになりました。

これらの改善は PyPy インタプリタのこれまでの取組から着想を得ました。

(Pablo Galindoの貢献による bpo-42864、Batuhan Taskayaの貢献による
bpo-40176)

インタープリタが送出する "SyntaxError" 例外は、問題を検出した箇所だけ
でなく、構文エラーを構成する式の範囲全体を強調表示するようになりました
。 Python 3.10 より前では、次のように表示されていました:

   >>> foo(x, z for z in range(10), t, w)
     File "<stdin>", line 1
       foo(x, z for z in range(10), t, w)
              ^
   SyntaxError: Generator expression must be parenthesized

Python 3.10 では例外は次のように表示されるようになります:

   >>> foo(x, z for z in range(10), t, w)
     File "<stdin>", line 1
       foo(x, z for z in range(10), t, w)
              ^^^^^^^^^^^^^^^^^^^^
   SyntaxError: Generator expression must be parenthesized

この改善は Pablo Galindo の貢献で実現しました bpo-43914。

"SyntaxError" 例外の状況に応じた具体的なメッセージが多数追加されました
。 特に注目すべきものを以下に示します。

* ブロックの前の ":" が存在しない:

     >>> if rocket.position > event_horizon
       File "<stdin>", line 1
         if rocket.position > event_horizon
                                           ^
     SyntaxError: expected ':'

  (Pablo Galindo の貢献による bpo-42997)

* 内包表記のターゲットにカッコのないタプルを使用:

     >>> {x,y for x,y in zip('abcd', '1234')}
       File "<stdin>", line 1
         {x,y for x,y in zip('abcd', '1234')}
          ^
     SyntaxError: did you forget parentheses around the comprehension target?

  (Pablo Galindo の貢献による bpo-43017)

* コレクションリテラルや式の間のカンマが存在しない:

     >>> items = {
     ... x: 1,
     ... y: 2
     ... z: 3,
       File "<stdin>", line 3
         y: 2
            ^
     SyntaxError: invalid syntax. Perhaps you forgot a comma?

  (Pablo Galindo の貢献による bpo-43822)

* 複数の例外の型をカッコで囲んでいない:

     >>> try:
     ...     build_dyson_sphere()
     ... except NotEnoughScienceError, NotEnoughResourcesError:
       File "<stdin>", line 3
         except NotEnoughScienceError, NotEnoughResourcesError:
                ^
     SyntaxError: multiple exception types must be parenthesized

  (Pablo Galindo の貢献による bpo-43149)

* 辞書のリテラルで ":" と値が存在しない:

     >>> values = {
     ... x: 1,
     ... y: 2,
     ... z:
     ... }
       File "<stdin>", line 4
         z:
          ^
     SyntaxError: expression expected after dictionary key and ':'

     >>> values = {x:1, y:2, z w:3}
       File "<stdin>", line 1
         values = {x:1, y:2, z w:3}
                             ^
     SyntaxError: ':' expected after dictionary key

  (Pablo Galindo の貢献による bpo-43823)

* "try" ブロックに "except" または "finally" ブロックが存在しない:

     >>> try:
     ...     x = 2
     ... something = 3
       File "<stdin>", line 3
         something  = 3
         ^^^^^^^^^
     SyntaxError: expected 'except' or 'finally' block

  (Pablo Galindo の貢献による bpo-44305)

* 比較で "==" の代わりに "=" を使用している:

     >>> if rocket.position = event_horizon:
       File "<stdin>", line 1
         if rocket.position = event_horizon:
                            ^
     SyntaxError: cannot assign to attribute here. Maybe you meant '==' instead of '='?

  (Pablo Galindo の貢献による bpo-43797)

* f-stringで "*" を使用している:

     >>> f"Black holes {*all_black_holes} and revelations"
       File "<stdin>", line 1
         (*all_black_holes)
          ^
     SyntaxError: f-string: cannot use starred expression here

  (Pablo Galindo の貢献による bpo-41064)


IndentationErrors
~~~~~~~~~~~~~~~~~

多くの "IndentationError" 例外において、どの種類のブロックでインデント
が期待されていたのか、その文の位置に関する情報が追加されるようになりま
した。

   >>> def foo():
   ...    if lel:
   ...    x = 2
     File "<stdin>", line 3
       x = 2
       ^
   IndentationError: expected an indented block after 'if' statement in line 2


AttributeErrors
~~~~~~~~~~~~~~~

"AttributeError" を表示するとき、"PyErr_Display()" は例外の発生元のオ
ブジェクトにある似た属性名を候補として提示するようになりました:

   >>> collections.namedtoplo
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   AttributeError: module 'collections' has no attribute 'namedtoplo'. Did you mean: namedtuple?

(Pablo Galindo の貢献による bpo-38530)

警告:

  エラーの表示に "PyErr_Display()" が呼び出されない場合、この機能は働
  きません。 独自のエラー表示関数を使う場合などが該当します。 IPython
  などの REPL ではよくある状況です。


NameErrors
~~~~~~~~~~

インタープリタが送出した "NameError" を表示するとき、"PyErr_Display()"
は例外が発生した関数にある似た変数名を候補として提示するようになりまし
た:

   >>> schwarzschild_black_hole = None
   >>> schwarschild_black_hole
   Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
   NameError: name 'schwarschild_black_hole' is not defined. Did you mean: schwarzschild_black_hole?

(Pablo Galindo の貢献による bpo-38530)

警告:

  エラーの表示に "PyErr_Display()" が呼び出されない場合、この機能は働
  きません。 独自のエラー表示関数を使う場合などが該当します。 IPython
  などの REPL ではよくある状況です。


PEP 626: デバッグおよびその他のツール用の正確な行番号。
-------------------------------------------------------

PEP 626 により、デバッグ、プロファイリング、カバレッジのツールで使う行
番号がより正確で信頼できるものになりました。 実行されたコードのすべて
の行について、正しい行番号を持つトレースイベントが生成されます。 実行
されていない行では生成されません。

フレームオブジェクトの "f_lineno" 属性には、常に期待どおりの行番号が格
納されるようになります。

コードオブジェクト の "codeobject.co_lnotab" 属性は非推奨となり、3.12
で削除される予定です。 オフセットを行番号に変換するコードでは、代わり
に新しい "co_lines()" メソッドを使ってください。


PEP 634: 構造的パターンマッチ
-----------------------------

Structural pattern matching has been added in the form of a *match
statement* and *case statements* of patterns with associated actions.
Patterns consist of sequences, mappings, primitive data types as well
as class instances. Pattern matching enables programs to extract
information from complex data types, branch on the structure of data,
and apply specific actions based on different forms of data.


構文と演算
~~~~~~~~~~

パターンマッチングの一般的な構文は次のとおりです:

   match subject:
       case <pattern_1>:
           <action_1>
       case <pattern_2>:
           <action_2>
       case <pattern_3>:
           <action_3>
       case _:
           <action_wildcard>

match 文は式を取り、その値を 1 つ以上の case ブロックで指定されたパタ
ーンと順に比較します。具体的には、パターンマッチングは次の手順で動作し
ます:

1. 型と構造を持つデータ（"subject"）を使用する

2. "match" 文内で "subject" を評価する

3. "case" 文の各パターンと上から順に比較し、一致が確認されるまで進める

4. 一致が確認されたパターンに関連付けられた処理を実行する

5. 完全一致するパターンがない場合、最後にワイルドカード "_" が指定され
   ていれば、それが一致ケースとして使用されます。完全一致もワイルドカ
   ードも存在しない場合、 match ブロック全体は何も実行されません（no-
   op となります）。


宣言的なアプローチ
~~~~~~~~~~~~~~~~~~

読者の中には、C、Java、JavaScript（およびその他多くの言語）における
switch 文を通じて、対象（データオブジェクト）をリテラル（パターン）と
照合する単純な例として、パターンマッチングに馴染みがある方もいるでしょ
う。多くの場合、 switch 文はオブジェクトや式を、リテラルを含む複数の
case 文と比較するために使用されます。

より強力なパターンマッチングの例は、Scala や Elixir のような言語で見ら
れます。構造的パターンマッチングでは、アプローチは「宣言的」であり、デ
ータが一致するための条件（パターン）を明示的に記述します。

これに対して、「命令的」なアプローチでは、入れ子になった if 文を用いて
構造的パターンマッチングと同様の処理を実現することも可能ですが、「宣言
的」な方法ほど明確ではありません。宣言的アプローチでは、一致のために満
たすべき条件を明示的なパターンとして記述するため、より読みやすくなりま
す。構造的パターンマッチングは、最も単純な形では case 文で変数とリテラ
ルを比較するものとして使用できますが、 Python における真の価値は、対象
の型や構造を扱える点にあります。


単純パターン: リテラルとのマッチ
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

最も基本的な形のパターンマッチングの例を見てみましょう。ここでは、値（
＝対象、subject）が複数のリテラル、すなわちパターンと照合されます。以
下の例では、"status" が match 文の対象です。 各 case 文のパターンは、
リクエストのステータスコードを表すリテラルです。一致が見つかると、その
case に対応する処理が実行されます。

   def http_error(status):
       match status:
           case 400:
               return "Bad request"
           case 404:
               return "Not found"
           case 418:
               return "I'm a teapot"
           case _:
               return "Something's wrong with the internet"

上記の関数に "status" として 418 が渡された場合は、 "I'm a teapot" が
返されます。一方、 500 が渡された場合には、ワイルドカードとして機能す
る "_" を使用した case 文が一致し、 "Something's wrong with the
internet" が返されます。ここで、最後のブロックに注目してください。変数
名 "_" はワイルドカードとして機能し、対象と必ず一致することを保証しま
す。なお、 "_" の使用は任意です。

複数のリテラルを "|" ("or")を使用して組み合わせて1つのパターンにできま
す。

   case 401 | 403 | 404:
       return "Not allowed"


ワイルドカードがないときの振る舞い
""""""""""""""""""""""""""""""""""

上記の例から最後の case ブロックを削除すると、次のようになります:

   def http_error(status):
       match status:
           case 400:
               return "Bad request"
           case 404:
               return "Not found"
           case 418:
               return "I'm a teapot"

case 文で "_" を使用しない場合、一致するパターンが存在しない可能性があ
ります。一致するパターンがない場合、その処理は何も実行されずスキップさ
れます。たとえば、 "status" に 500 が渡された場合、この例では何も起こ
りません。


リテラルと変数を組み合わせたパターン
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

パターンはアンパック代入のように記述することで、変数をバインドするため
に使用することもできます。次の例では、データポイントを展開して、その x
座標と y 座標を取得しています:

   # point は (x, y) のタプル
   match point:
       case (0, 0):
           print("Origin")
       case (0, y):
           print(f"Y={y}")
       case (x, 0):
           print(f"X={x}")
       case (x, y):
           print(f"X={x}, Y={y}")
       case _:
           raise ValueError("Not a point")

最初のパターン "(0, 0)" は 2 つのリテラルから構成されており、上で示し
たリテラルパターン拡張と考えることができます。次の 2 つのパターンでは
、リテラルと変数が組み合わされており、変数は対象（"point"）から値を取
り出して変数にバインドします。4 番目のパターンは 2 つの値を同時に取得
しており、これはアンパック代入 "(x, y) = point" と概念的に似ています。


パターンとクラス
~~~~~~~~~~~~~~~~

データを構造化するためにクラスを使用している場合は、クラス名の後ろにコ
ンストラクタのように引数リストを指定することで、クラスをパターンとして
使用できます。このパターンでは、インスタンスの属性を変数にバインドする
ことが可能です:

   class Point:
       def __init__(self, x, y):
           self.x = x
           self.y = y

   def location(point):
       match point:
           case Point(x=0, y=0):
               print("原点")
           case Point(x=0, y=y):
               print(f"Y座標は {y} で点はY軸上にある")
           case Point(x=x, y=0):
               print(f"X座標は {x} で点はX軸上にある")
           case Point():
               print("点は平面上のそれ以外のどこかにある")
           case _:
               print("座標ではない")


位置パラメータを用いたパターン
""""""""""""""""""""""""""""""

属性の順序を定めている一部の組み込みクラス (例えばデータクラス) では、
位置パラメータを使えます。 また、クラスの特殊属性 "__match_args__" を
設定して、パターン内で各属性が占める位置を定義することもできます。 こ
れを ("x", "y") に設定した場合、次のパターンはすべて等価で、いずれも属
性 "y" の値を変数 "var" に束縛します。

   Point(1, var)
   Point(1, y=var)
   Point(x=1, y=var)
   Point(y=var, x=1)


ネストしたパターン
~~~~~~~~~~~~~~~~~~

パターンは任意に入れ子にすることができます。たとえば、データが複数のポ
イントを含む短いリストである場合、次のようにマッチさせることができます
:

   match points:
       case []:
           print("リストに座標がない")
       case [Point(0, 0)]:
           print("リスト中には原点が1つのみある")
       case [Point(x, y)]:
           print(f"リスト中に {x}, {y} の点が1つある")
       case [Point(0, y1), Point(0, y2)]:
           print(f"リスト中にY軸上の2つの点 {y1}、{y2} がある")
       case _:
           print("リスト中にそれ以外のデータが見つかった")


複雑なパターンとワイルドカード
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

ここまでの例では、最後の case 文で "_" を単独のワイルドカードとして使
用してきました。しかし、ワイルドカードはより複雑なパターン内でも使用で
きます。たとえば、 "('error', code, _)" のように使用することができます
。

   match test_variable:
       case ('warning', code, 40):
           print("警告を受け取った")
       case ('error', code, _):
           print(f"エラー {code} が発生した")

上記のケースでは、 "test_variable" は ('error', code, 100) と
('error', code, 800) にマッチします。


ガード
~~~~~~

パターンには「ガード」と呼ばれる "if" 節を追加できます。 ガードが偽の
場合、"match" は次の case ブロックとのマッチを試みます。 値の取り込み
は、ガードの評価より前に行われます。

   match point:
       case Point(x, y) if x == y:
           print(f"座標は対角線 Y=X 上の {x} の位置にある")
       case Point(x, y):
           print(f"座標の位置は対角線上ではない")


その他の主要な機能
~~~~~~~~~~~~~~~~~~

その他のいくつかの主要な機能:

* アンパック代入と同様に、タプルおよびリストのパターンはまったく同じ意
  味を持ち、任意のシーケンスにマッチします。技術的には、対象はシーケン
  スである必要があります。そのため、重要な例外として、パターンはイテレ
  ータにはマッチしません。また、よくある誤りを防ぐために、シーケンスパ
  ターンは文字列にもマッチしません。

* シーケンスパターンではワイルドカードをサポートしています。たとえば、
  "[x, y, *rest]" や "(x, y, *rest)" は、アンパック代入におけるワイル
  ドカードと同様に動作します。"*" の後の名前を "_" にすることもでき、
  "(x, y, *_)" は少なくとも 2 つの要素を持つシーケンスにマッチしますが
  、残りの要素は変数に束縛されません。

* マッピングパターン: "{"bandwidth": b, "latency": l}" では、辞書から
  ""bandwidth"" と ""latency"" の値を取得します。シーケンスパターンと
  は異なり、余分なキーは無視されます。また、ワイルドカード "**rest" も
  サポートされています。（ただし、"**_" は冗長になるため使用できません
  。）

* サブパターンでは "as" キーワードを使用して値を取り込みます:

     case (Point(x1, y1), Point(x2, y2) as p2): ...

  このように書くと x1、y1、x2、y2 は "as" 節を使わないときと同様に、さ
  らにp2に対象の2番目の要素全体がバインドされます。

* ほとんどのリテラルは等価性を比較します。 ただし、シングルトンの
  "True"、"False"、"None" は同一性を比較します。

* 名前を付けた定数をパターンに使用できます。名前を付けた定数を、値を取
  り込む変数として解釈することを防ぐために、ドット付きの変数名にする必
  要があります。

     from enum import Enum
     class Color(Enum):
         RED = 0
         GREEN = 1
         BLUE = 2

     color = Color.GREEN
     match color:
         case Color.RED:
             print("I see red!")
         case Color.GREEN:
             print("Grass is green")
         case Color.BLUE:
             print("I'm feeling the blues :(")

完全な仕様については **PEP 634** を参照してください。モチベーションと
理論的根拠は **PEP 635** に、より詳細なチュートリアルは **PEP 636** に
あります。


任意で有効にする "EncodingWarning" と "encoding="locale"" オプション
--------------------------------------------------------------------

"TextIOWrapper" と "open()" のデフォルトのエンコーディングは、プラット
フォームとロケールに依存します。 ほとんどの Unix プラットフォームでは
UTF-8 を使うため、UTF-8 ファイル (JSON、YAML、TOML、Markdown など) を
開くときに "encoding" オプションを省略するバグが非常によく見られます。
次に例を示します。

   # バグ: "rb" モードまたは encoding="utf-8" を使う必要があります。
   with open("data.json") as f:
       data = json.load(f)

この種のバグを見つけるために、任意で有効にできる "EncodingWarning" を
追加しました。 "sys.flags.warn_default_encoding" が真で、ロケールに依
存するデフォルトのエンコーディングを使った場合に警告されます。

警告を有効にする "-X warn_default_encoding" オプションと
"PYTHONWARNDEFAULTENCODING" を追加しました。

詳しくは テキストのエンコーディング を参照してください。


型ヒントに関連する新しい機能
============================

この節では、**PEP 484** の型ヒントと "typing" モジュールに関わる主な変
更を説明します。


PEP 604: 新しいユニオン型演算子
-------------------------------

新しいユニオン型演算子を導入し、"X | Y" 構文を使えるようになりました。
特に型ヒントで「型 X または型 Y」を表す際に、"typing.Union" よりも簡潔
に書けます。

以前のバージョンの Python では、複数の型の引数を受け取る関数に型ヒント
を付けるために "typing.Union" を使っていました。

   def square(number: Union[int, float]) -> Union[int, float]:
       return number ** 2

型ヒントをより簡潔に書けるようになりました。

   def square(number: int | float) -> int | float:
       return number ** 2

この新しい構文は "isinstance()" と "issubclass()" の第 2 引数でも使え
ます。

   >>> isinstance(1, int | str)
   True

詳しくは Union 型 と **PEP 604** を参照してください。

(Maggie Moss と Philippe Prados による貢献、bpo-41428。 Yurii Karabas
と Serhiy Storchaka による追加、bpo-44490。)


PEP 612: パラメータ指定変数
---------------------------

**PEP 484** の "Callable" について静的型チェッカーに提供する情報を改善
するために、"typing" モジュールに 2 つの新しい機能を追加しました。

1 つ目はパラメータ指定変数です。 ある呼び出し可能オブジェクトのパラメ
ータの型を別の呼び出し可能オブジェクトに引き継ぐために使います。 これ
は高階関数やデコレータでよく見られるパターンです。 使用例は
"typing.ParamSpec" にあります。 以前は、パラメータの型の依存関係をこの
ように正確に型アノテーションで表す簡単な方法がありませんでした。

2 つ目は新しい "Concatenate" 演算子です。 パラメータ指定変数と組み合わ
せて、別の呼び出し可能オブジェクトのパラメータを追加または削除する高階
の呼び出し可能オブジェクトに型アノテーションを付けます。 使用例は
"typing.Concatenate" にあります。

詳しくは "typing.Callable"、"typing.ParamSpec"、"typing.Concatenate"、
"typing.ParamSpecArgs"、"typing.ParamSpecKwargs"、**PEP 612** を参照し
てください。

(Ken Jin による貢献、bpo-41559。 Jelle Zijlstra による小規模な改善、
bpo-43783。 PEP は Mark Mendoza が執筆しました。)


PEP 613: TypeAlias
------------------

**PEP 484** では型エイリアスという概念を導入し、トップレベルのアノテー
ションのない代入であることだけを要件としていました。 この単純さのため
、特に前方参照や無効な型が含まれる場合、型チェッカーが型エイリアスと通
常の代入を区別しにくいことがありました。 次の例を比較してください。

   StrCache = 'Cache[str]'  # 型エイリアス
   LOG_PREFIX = 'LOG[DEBUG]'  # モジュールの定数

"typing" モジュールに特殊な値 "TypeAlias" を追加し、型エイリアスをより
明示的に宣言できるようにしました。

   StrCache: TypeAlias = 'Cache[str]'  # 型エイリアス
   LOG_PREFIX = 'LOG[DEBUG]'  # モジュールの定数

より詳しくは、 **PEP 613** をご覧ください。

(Mikhail Golubev による貢献、bpo-41923。)


PEP 647: ユーザー定義の型ガード
-------------------------------

"typing" モジュールに "TypeGuard" を追加しました。 型ガード関数にアノ
テーションを付け、型の絞り込み時に静的型チェッカーに提供する情報を改善
できます。 詳しくは "TypeGuard" のドキュメントと **PEP 647** を参照し
てください。

(Ken Jin と Guido van Rossum による貢献、bpo-43766。 PEP は Eric Traut
が執筆しました。)


その他の言語変更
================

* "int" 型に新しいメソッド "int.bit_count()" を追加しました。 整数を 2
  進数で表したときの 1 の個数 (population count とも呼ばれます) を返し
  ます。 (Niklas Fiekas による貢献、bpo-29882。)

* "dict.keys()"、"dict.values()"、"dict.items()" が返すビューのすべて
  に、"mapping" 属性を追加しました。 元の辞書をラップした
  "types.MappingProxyType" オブジェクトを返します。 (Dennis Sweeney に
  よる貢献、bpo-40890。)

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

* 整数の引数を取る組み込み関数や拡張関数は、"Decimal"、"Fraction" など
  、情報を失わずに整数に変換できないオブジェクトを受け付けなくなりまし
  た。 例えば "__int__()" メソッドはあっても "__index__()" メソッドが
  ないオブジェクトです。 (Serhiy Storchaka による貢献、bpo-37999。)

* "object.__ipow__()" が "NotImplemented" を返した場合、演算子は期待ど
  おり "object.__pow__()" と "object.__rpow__()" に正しくフォールバッ
  クするようになりました。 (Alex Shkop による貢献、bpo-38302。)

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

* 関数に新しい "__builtins__" 属性を追加しました。 関数の実行時に組み
  込みの名前を探す際、"__globals__['__builtins__']" を調べる代わりに、
  この属性を使います。 "__globals__["__builtins__"]" が存在する場合は
  その値で、存在しない場合は現在の組み込みの名前空間で初期化されます。
  (Mark Shannon による貢献、bpo-42990。)

* 組み込み関数 "aiter()" と "anext()" を追加しました。 それぞれ
  "iter()" と "next()" に対応する非同期版です。 (Joshua Bronson,
  Daniel Pope、Justin Wang による貢献、bpo-31861。)

* 静的メソッド ("@staticmethod") とクラスメソッド ("@classmethod") が
  、メソッドの属性 ("__module__"、"__name__"、"__qualname__"、
  "__doc__"、"__annotations__") を引き継ぐようになり、新しく
  "__wrapped__" 属性も追加されました。 さらに、静的メソッドを通常の関
  数として呼び出せるようになりました。 (Victor Stinner による貢献、
  bpo-43682。)

* "from __future__ import annotations" を使った場合、複雑な代入先
  (**PEP 526** で定義された "simple name" 以外のすべての代入先) のアノ
  テーションは、実行時に何も影響を及ぼさなくなりました。 (Batuhan
  Taskaya による貢献、bpo-42737。)

* クラスオブジェクトとモジュールオブジェクトは、必要になった時点で空の
  アノテーション辞書を作成するようになりました。 後方互換性のため、ア
  ノテーション辞書はオブジェクトの "__dict__" に格納します。 これによ
  り "__annotations__" を扱う際のベストプラクティスが改善されます。 詳
  しくは アノテーションのベストプラクティス を参照してください。
  (Larry Hastings による貢献、bpo-43901。)

* "from __future__ import annotations" を使った場合、"yield"、"yield
  from"、"await"、代入式を含むアノテーションは、副作用があるため禁止さ
  れるようになりました。 (Batuhan Taskaya による貢献、bpo-42725。)

* "from __future__ import annotations" を使った場合、アノテーションで
  の未束縛の変数、"super()"、その他シンボルテーブルの処理に影響を与え
  うる式の使用は、影響を与えなくなりました。 (Batuhan Taskaya による貢
  献、bpo-42725。)

* "float" 型と "decimal.Decimal" 型の NaN 値のハッシュが、オブジェクト
  の同一性に依存するようになりました。 以前は NaN 値どうしは等しくない
  にもかかわらず、ハッシュは常に "0" でした。 そのため、複数の NaN を
  含む辞書や集合を作るとハッシュの衝突が多発し、実行時間が要素数の 2
  乗に比例する場合がありました。 (Raymond Hettinger による貢献、
  bpo-43475。)

* "__debug__" 定数を削除しようとすると、"NameError" ではなく
  "SyntaxError" が送出されるようになりました。 (Donghee Na による貢献
  、bpo-45000。)

* "SyntaxError" 例外に "end_lineno" 属性と "end_offset" 属性を追加しま
  した。 値が特定できなかった場合は "None" になります。 (Pablo Galindo
  による貢献、bpo-43914。)


新たなモジュール
================

* ありません。


改良されたモジュール
====================


asyncio
-------

抽象イベントループに不足していた "connect_accepted_socket()" メソッド
を追加しました。 (Alex Grönholm による貢献、bpo-41332。)


argparse
--------

argparse のヘルプで、誤解を招く "optional arguments" という表現を
"options" に置き換えました。 出力の完全一致に依存するテストでは、修正
が必要になる場合があります。 (Raymond Hettinger による貢献、bpo-9694。
)


array
-----

"array.array" の "index()" メソッドに、オプションの *start* パラメータ
と *stop* パラメータを追加しました。 (Anders Lorentsen と Zackery
Spytz による貢献、bpo-31956。)


asynchat, asyncore, smtpd
-------------------------

これらのモジュールは Python 3.6 以降、ドキュメントで非推奨とされていま
した。 3 つのモジュールすべてに、インポート時の "DeprecationWarning"
を追加しました。


base64
------

拡張 16 進アルファベットによる Base32 エンコーディングに対応する
"base64.b32hexencode()" と "base64.b32hexdecode()" を追加しました。


bdb
---

設定済みのすべてのブレークポイントをリセットする "clearBreakpoints()"
を追加しました。 (Irit Katriel による貢献、bpo-24160。)


bisect
------

"bisect" モジュールの API に *key* 関数を渡せるようになりました。
(Raymond Hettinger による貢献、bpo-4356。)


codecs
------

コーデック検索関数の登録を解除する "codecs.unregister()" 関数を追加し
ました。 (Hai Shi による貢献、bpo-41842。)


collections.abc
---------------

"collections.abc.Callable" の パラメータ化されたジェネリック の
"__args__" が、"typing.Callable" と一致するようになりました。 ジェネリ
ックの "collections.abc.Callable" は、"typing.Callable" と同様に型引数
を平坦化するようになりました。 つまり、"collections.abc.Callable[[int,
str], str]" の "__args__" は "(int, str, str)" になります。 以前は
"([int, str], str)" でした。 この変更のため、"types.GenericAlias" をサ
ブクラス化できるようにし、"collections.abc.Callable" 型に添字を指定す
るとサブクラスを返すようにしました。 Python 3.9 ではエラーにならなかっ
た "collections.abc.Callable" の無効なパラメータ化で、"TypeError" が送
出される場合があることに注意してください。 (Ken Jin による貢献、
bpo-42195。)


contextlib
----------

非同期ジェネレータや、非同期に解放するリソースを表すオブジェクトを安全
に閉じるための "contextlib.aclosing()" コンテキストマネージャーを追加
しました。 (Joongi Kim と John Belmonte による貢献、bpo-41229。)

"contextlib.nullcontext()" が非同期コンテキストマネージャーに対応しま
した。 (Tom Gringauz による貢献、bpo-41543。)

非同期コンテキストマネージャーをデコレータとして使うための
"AsyncContextDecorator" を追加しました。


curses
------

ncurses 6.1 で追加された拡張カラー関数を、"curses.color_content()"、
"curses.init_color()"、"curses.init_pair()"、"curses.pair_content()"
が透過的に使うようになりました。 新しい関数
"curses.has_extended_color_support()" は、基盤となる ncurses ライブラ
リが拡張カラーに対応しているかを示します。 (Jeffrey Kintscher と Hans
Petter Jansson による貢献、bpo-36982。)

基盤となる curses ライブラリが提供している場合、"curses" モジュールで
"BUTTON5_*" 定数を利用できるようになりました。 (Zackery Spytz による貢
献、bpo-39273。)


dataclasses
-----------


__slots__
~~~~~~~~~

"@dataclasses.dataclass" デコレータに "slots" パラメータを追加しました
。 (Yurii Karabas による貢献、bpo-42269。)


キーワード専用フィールド
~~~~~~~~~~~~~~~~~~~~~~~~

dataclasses が、生成する __init__ メソッドでキーワード専用になるフィー
ルドに対応しました。 キーワード専用フィールドを指定する方法はいくつか
あります。

すべてのフィールドをキーワード専用に指定できます:

   from dataclasses import dataclass

   @dataclass(kw_only=True)
   class Birthday:
       name: str
       birthday: datetime.date

生成される __init__ メソッドでは、"name" と "birthday" の両方がキーワ
ード専用パラメータになります。

フィールドごとにキーワード専用を指定することもできます:

   from dataclasses import dataclass, field

   @dataclass
   class Birthday:
       name: str
       birthday: datetime.date = field(kw_only=True)

この例では "birthday" だけがキーワード専用です。 個々のフィールドで
"kw_only" を設定する場合、キーワード専用フィールドをそれ以外のフィール
ドより後に置く必要があるため、フィールドの並べ替えの規則があることに注
意してください。 詳しくは dataclasses のドキュメントを参照してください
。

KW_ONLY マーカー以降のすべてのフィールドをキーワード専用にすることもで
きます。 おそらくこれが最も一般的な使い方になるでしょう:

   from dataclasses import dataclass, KW_ONLY

   @dataclass
   class Point:
       x: float
       y: float
       _: KW_ONLY
       z: float = 0.0
       t: float = 0.0

この例では "z" と "t" がキーワード専用パラメータになり、"x" と "y" は
そうなりません。 (Eric V. Smith による貢献、bpo-43532。)


distutils
---------

"distutils" パッケージ全体を非推奨とし、Python 3.12 で削除する予定です
。 パッケージのビルドを指定する機能は、サードパーティーのパッケージ
"setuptools" と "packaging" によってすでに完全に置き換えられています。
その他のよく使われる API の大半も、標準ライブラリの別の場所
("platform"、"shutil"、"subprocess"、"sysconfig" など) で利用できます
。 "distutils" のそれ以外の機能を移行する計画はありません。 それらの機
能を使っているアプリケーションでは、コードを独自にコピーして保持するこ
とを検討してください。 議論については **PEP 632** を参照してください。

Python 3.8 で非推奨となった "bdist_wininst" コマンドを削除しました。
Windows でバイナリパッケージを配布するには、"bdist_wheel" コマンドを推
奨します。 (Victor Stinner による貢献、bpo-42802。)


doctest
-------

モジュールに "__loader__" が定義されていない場合、"__spec__.loader" に
フォールバックします。 (Brett Cannon による貢献、bpo-42133。)


encodings
---------

"encodings.normalize_encoding()" が非 ASCII 文字を無視するようになりま
した。 (Hai Shi による貢献、bpo-39337。)


enum
----

"Enum" "__repr__()" now returns "enum_name.member_name" and
"__str__()" now returns "member_name".  Stdlib enums available as
module constants have a "repr()" of "module_name.member_name".
(Contributed by Ethan Furman in bpo-40066.)

Add "enum.StrEnum" for enums where all members are strings.
(Contributed by Ethan Furman in bpo-41816.)


fileinput
---------

"fileinput.input()" と "fileinput.FileInput" に *encoding* パラメータ
と *errors* パラメータを追加しました。 (Inada Naoki による貢献、
bpo-43712。)

*mode* が "r" でファイルが圧縮されている場合、
"fileinput.hook_compressed()" は非圧縮ファイルの場合と同様に
"TextIOWrapper" オブジェクトを返すようになりました。 (Inada Naoki によ
る貢献、bpo-5758。)


faulthandler
------------

"faulthandler" モジュールが、ガベージコレクション中に致命的なエラーが
発生したかどうかを検出するようになりました。 (Victor Stinner による貢
献、bpo-44466。)


gc
--

"gc.get_objects()"、"gc.get_referrers()"、"gc.get_referents()" に監査
フックを追加しました。 (Pablo Galindo による貢献、bpo-43439。)


glob
----

"glob()" と "iglob()" に *root_dir* パラメータと *dir_fd* パラメータを
追加しました。 検索の起点となるディレクトリを指定できます。 (Serhiy
Storchaka による貢献、bpo-38144。)


hashlib
-------

hashlib モジュールには OpenSSL 1.1.1 以降が必要になりました。
(Christian Heimes による貢献、**PEP 644** と bpo-43669。)

hashlib モジュールに OpenSSL 3.0.0 の予備的なサポートを追加しました。
(Christian Heimes による貢献、bpo-38820 など。)

"pbkdf2_hmac()" の Python のみで書かれたフォールバック実装を非推奨とし
ました。 将来、PBKDF2-HMAC は OpenSSL をサポートする構成でビルドした
Python でのみ利用できるようになります。 (Christian Heimes による貢献、
bpo-43880。)


hmac
----

hmac モジュールが内部で OpenSSL の HMAC 実装を使うようになりました。
(Christian Heimes による貢献、bpo-40645。)


IDLE と idlelib
---------------

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

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

上記の変更は 3.9 のメンテナンスリリースにバックポートされました。

シェルのサイドバーを追加しました。 プライマリプロンプト ('>>>') をサイ
ドバーに移動し、セカンダリプロンプト ('...') もサイドバーに追加しまし
た。 エディタの行番号のサイドバーと同様に、左クリックやドラッグで 1 行
以上のテキストを選択できます。 行を選択してから右クリックすると、コン
テキストメニューに 'copy with prompts' が表示されます。 これはサイドバ
ーのプロンプトと選択したテキストの各行を組み合わせてコピーします。 こ
のオプションはテキストのコンテキストメニューにも表示されます。 (Tal
Einat による貢献、bpo-37903。)

対話的なコードのインデントにタブではなくスペースを使うようにしました。
これにより、入力した対話的なコードの表示が適切になります。 これを実現
することが、シェルのサイドバーを追加した主な動機でした。 (Terry Jan
Reedy による貢献、bpo-37892。)

パターンマッチ文で新しい ソフトキーワード "match"、"case"、"_" を強調
表示するようにしました。 ただし、この強調表示は完全ではなく、"case" パ
ターン内の一部の "_" など、まれな場合に誤った表示になります。 (Tal
Einat による貢献、bpo-44010。)

3.10 のメンテナンスリリースで追加した変更です。

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

入力と出力を含むシェルの内容を保存するときに、プロンプトも含めるように
しました。 (Terry Jan Reedy による貢献、gh-95191。)


importlib.metadata
------------------

"importlib_metadata" 4.6 と同等の機能になりました (履歴)。

importlib.metadata のエントリーポイント が、新しい
importlib.metadata.EntryPoints クラスを通じて、グループや名前でエント
リーポイントを選びやすくなりました。 非推奨化と使い方の詳細は、ドキュ
メントの互換性に関する注記を参照してください。

トップレベルの Python モジュールやパッケージに対応する
importlib.metadata.Distribution を調べるための、
importlib.metadata.packages_distributions() を追加しました。


inspect
-------

モジュールに "__loader__" が定義されていない場合、"__spec__.loader" に
フォールバックします。 (Brett Cannon による貢献、bpo-42133。)

オブジェクトに定義されたアノテーションを安全に取得する
"inspect.get_annotations()" を追加しました。 さまざまな種類のオブジェ
クトのアノテーションにアクセスする際の特殊な挙動に対処し、調べるオブジ
ェクトについてほとんど仮定を置きません。 "inspect.get_annotations()"
は文字列化されたアノテーションを正しく元に戻すこともできます。 任意の
Python オブジェクトに定義されたアノテーション辞書にアクセスするには、
"inspect.get_annotations()" を使うのがベストプラクティスになりました。
アノテーションを扱う際のベストプラクティスについては アノテーションの
ベストプラクティス を参照してください。 関連する変更として、
"inspect.signature()"、"inspect.Signature.from_callable()"、
"inspect.Signature.from_function()" が "inspect.get_annotations()" を
呼び出してアノテーションを取得するようになりました。 このため
"inspect.signature()" と "inspect.Signature.from_callable()" も文字列
化されたアノテーションを元に戻せるようになりました。 (Larry Hastings
による貢献、bpo-43817。)


itertools
---------

"itertools.pairwise()" を追加しました。 (Raymond Hettinger による貢献
、bpo-38200。)


linecache
---------

モジュールに "__loader__" が定義されていない場合、"__spec__.loader" に
フォールバックします。 (Brett Cannon による貢献、bpo-42133。)


os
--

VxWorks RTOS で "os.cpu_count()" を使えるようにしました。 (Peixing Xin
による貢献、bpo-41440。)

Linux の "eventfd2" システムコールをラップする、新しい関数
"os.eventfd()" と関連する補助関数を追加しました。 (Christian Heimes に
よる貢献、bpo-41001。)

カーネル空間とユーザー空間の間でコピーせずに、2 つのファイル記述子の間
でデータを移動する "os.splice()" を追加しました。 いずれかのファイル記
述子がパイプを参照している必要があります。 (Pablo Galindo による貢献、
bpo-41625。)

macOS 向けに "O_EVTONLY"、"O_FSYNC"、"O_SYMLINK"、"O_NOFOLLOW_ANY" を
追加しました。 (Donghee Na による貢献、bpo-43106。)


os.path
-------

"os.path.realpath()" にキーワード専用引数 *strict* を追加しました。
"True" を指定すると、パスが存在しない場合やシンボリックリンクの循環が
見つかった場合に "OSError" を送出します。 (Barney Gale による貢献、
bpo-43757。)


pathlib
-------

"PurePath.parents" がスライスに対応しました。 (Joshua Cannon による貢
献、bpo-35498。)

"PurePath.parents" が負のインデックスに対応しました。 (Yaroslav
Pankovych による貢献、bpo-21041。)

"link_to()" に代わる "Path.hardlink_to" メソッドを追加しました。 新し
いメソッドの引数の順序は "symlink_to()" と同じです。 (Barney Gale によ
る貢献、bpo-39950。)

"os" モジュールの対応する関数と一致させるため、"pathlib.Path.stat()"
と "chmod()" にキーワード専用引数 *follow_symlinks* を追加しました。
(Barney Gale による貢献、bpo-39906。)


platform
--------

freedesktop.org os-release 規格のファイルからオペレーティングシステム
の識別情報を取得する "platform.freedesktop_os_release()" を追加しまし
た。 (Christian Heimes による貢献、bpo-28468。)


pprint
------

"pprint.pprint()" に新しいキーワード引数 "underscore_numbers" を追加し
ました。 (sblondon による貢献、bpo-42914。)

"pprint" が "dataclasses.dataclass" のインスタンスを整形して表示できる
ようになりました。 (Lewis Gaul による貢献、bpo-43080。)


py_compile
----------

"py_compile" のコマンドラインインターフェースに "--quiet" オプションを
追加しました。 (Gregory Schevchenko による貢献、bpo-38731。)


pyclbr
------

"pyclbr.readmodule()" と "pyclbr.readmodule_ex()" が返すツリー内の
"Function" オブジェクトと "Class" オブジェクトに、"end_lineno" 属性を
追加しました。 既存の (開始行を表す) "lineno" に対応します。 (Aviral
Srivastava による貢献、bpo-38307。)


shelve
------

"shelve" モジュールが棚を作成するとき、デフォルトで "pickle" のプロト
コル "3" の代わりに "pickle.DEFAULT_PROTOCOL" を使うようになりました。
(Zackery Spytz による貢献、bpo-34204。)


statistics
----------

共分散を求める "covariance()"、ピアソンの相関係数を求める
"correlation()"、単回帰を行う "linear_regression()" を追加しました。
(Tymoteusz Wołodźko による貢献、bpo-38490。)


site
----

モジュールに "__loader__" が定義されていない場合、"__spec__.loader" に
フォールバックします。 (Brett Cannon による貢献、bpo-42133。)


socket
------

"socket.timeout" 例外が "TimeoutError" の別名になりました。 (Christian
Heimes による貢献、bpo-42413。)

"IPPROTO_MPTCP" を使って MPTCP ソケットを作成するオプションを追加しま
した。 (Rui Cunha による貢献、bpo-43571。)

サービスタイプ (ToS) または DSCP/ECN フィールドを受信する "IP_RECVTOS"
オプションを追加しました。 (Georg Sauthoff による貢献、bpo-44077。)


ssl
---

ssl モジュールには OpenSSL 1.1.1 以降が必要になりました。 (Christian
Heimes による貢献、**PEP 644** と bpo-43669。)

ssl モジュールに OpenSSL 3.0.0 の予備的なサポートと、新しいオプション
"OP_IGNORE_UNEXPECTED_EOF" を追加しました。 (Christian Heimes による貢
献、bpo-38820、bpo-43794、bpo-43788、bpo-43791、bpo-43799、bpo-43920、
bpo-43789、bpo-43811。)

非推奨の関数や定数を使うと "DeprecationWarning" が発生するようになりま
した。 "ssl.SSLContext.options" ではデフォルトで "OP_NO_SSLv2" と
"OP_NO_SSLv3" が設定されているため、これらのフラグを再設定しても警告で
きません。 非推奨の機能の一覧は 非推奨の節 にあります。 (Christian
Heimes による貢献、bpo-43880。)

The ssl module now has more secure default settings. Ciphers without
forward secrecy or SHA-1 MAC are disabled by default. Security level 2
prohibits weak RSA, DH, and ECC keys with less than 112 bits of
security. "SSLContext" defaults to minimum protocol version TLS 1.2.
Settings are based on Hynek Schlawack's research. (Contributed by
Christian Heimes in bpo-43998.)

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

"ssl.get_server_certificate()" 関数に *timeout* パラメータを追加しまし
た。 (Zackery Spytz による貢献、bpo-31870。)

ssl モジュールがヒープ型と複数フェーズの初期化を使うようになりました。
(Christian Heimes による貢献、bpo-42333。)

新しい検証フラグ "VERIFY_X509_PARTIAL_CHAIN" を追加しました。 (l0x に
よる貢献、bpo-40849。)


sqlite3
-------

"connect()"、"enable_load_extension()"、"load_extension()" に監査イベ
ントを追加しました。 (Erlend E. Aasland による貢献、bpo-43762。)


sys
---

"sys.orig_argv" 属性を追加しました。 Python 実行ファイルに渡された元の
コマンドライン引数のリストです。 (Victor Stinner による貢献、bpo-23427
。)

標準ライブラリのモジュール名の一覧を格納する "sys.stdlib_module_names"
を追加しました。 (Victor Stinner による貢献、bpo-42955。)


_thread
-------

"_thread.interrupt_main()" に、模擬的に発生させるシグナルの番号をオプ
ションで指定できるようになりました。 デフォルトは従来どおり
"signal.SIGINT" です。 (Antoine Pitrou による貢献、bpo-43356。)


threading
---------

"threading.settrace()" と "threading.setprofile()" で設定した関数をそ
れぞれ取得する、"threading.gettrace()" と "threading.getprofile()" を
追加しました。 (Mario Corchero による貢献、bpo-42251。)

"threading.excepthook()" が動作しない値や別の値に設定された場合に元の
値を取得できるよう、"threading.__excepthook__" を追加しました。 (Mario
Corchero による貢献、bpo-42308。)


traceback
---------

"format_exception()"、"format_exception_only()"、"print_exception()"
関数に、位置専用引数として例外オブジェクトを渡せるようになりました。
(Zackery Spytz と Matthias Bussonnier による貢献、bpo-26389。)


types
-----

"types.EllipsisType"、"types.NoneType"、"types.NotImplementedType" ク
ラスを再導入しました。 型チェッカーが容易に解釈できる型が新たに加わり
ます。 (Bas van Beek による貢献、bpo-41810。)


typing
------

主な変更については 型ヒントに関連する新しい機能 を参照してください。

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

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

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

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

4. "Literal" オブジェクトの等価性比較では、いずれかのパラメータが
   *hashable* でない場合に "TypeError" 例外を送出するようになりました
   。 ハッシュ不可能なパラメータで "Literal" を宣言するだけならエラー
   にはなりません。

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

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

アノテーションが "typing.TypedDict" かどうかを調べる新しい関数
"typing.is_typeddict()" を追加しました。 (Patrick Reader による貢献、
bpo-41792。)

データ変数の宣言だけを持つ "typing.Protocol" のサブクラスを
"isinstance" で調べるとき、"@~typing.runtime_checkable" でデコレートさ
れていなければ "TypeError" を送出するようになりました。 以前はこの検査
でエラーが発生しませんでした。 実行時のプロトコルを使いたい場合は、サ
ブクラスを "@runtime_checkable" デコレータでデコレートしてください。
(Yurii Karabas による貢献、bpo-38908。)

"typing.io" と "typing.re" サブモジュールからインポートすると、
"DeprecationWarning" が発生するようになりました。 これらのサブモジュー
ルは Python 3.8 以降非推奨で、将来の Python で削除される予定です。 こ
れらに属するものは、代わりに "typing" から直接インポートしてください。
(Sebastian Rittau による貢献、bpo-38291。)


unittest
--------

既存の "assertLogs()" を補完する、新しいメソッド "assertNoLogs()" を追
加しました。 (Kit Yan Choi による貢献、bpo-39385。)


urllib.parse
------------

Python 3.10 より前のバージョンでは、"urllib.parse.parse_qs()" と
"urllib.parse.parse_qsl()" のクエリパラメータの区切り文字として ";" と
"&" の両方を使えました。 セキュリティ上の懸念と新しい W3C の勧告に合わ
せるため、区切り文字を 1 種類だけ受け付けるように変更し、デフォルトを
"&" としました。 内部でこれらの関数を使っている "cgi.parse()" と
"cgi.parse_multipart()" にも、この変更は影響します。 詳しくは各関数の
ドキュメントを参照してください。 (Adam Goldschmidt, Senthil Kumaran と
Ken Jin による貢献、bpo-42967。)

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


xml
---

"xml.sax.handler" モジュールに "LexicalHandler" クラスを追加しました。
(Jonathan Gossage と Zackery Spytz による貢献、bpo-35018。)


zipimport
---------

**PEP 451** に関連するメソッド "find_spec()"、
"zipimport.zipimporter.create_module()"、
"zipimport.zipimporter.exec_module()" を追加しました。 (Brett Cannon
による貢献、bpo-42131。)

"invalidate_caches()" メソッドを追加しました。 (Desmond Cheong による
貢献、bpo-14678。)


最適化
======

* コンストラクタ "str()"、"bytes()"、"bytearray()" が高速化しました (
  小さいオブジェクトでは約 30～40%)。 (Serhiy Storchaka による貢献、
  bpo-41334。)

* "runpy" モジュールがインポートするモジュール数を減らしました。
  "python3 -m module-name" コマンドの起動は平均で 1.4 倍高速になりまし
  た。 Linux では "python3 -I -m module-name" が Python 3.9 で 69 個の
  モジュールをインポートするのに対し、Python 3.10 では 51 個だけになり
  ます (18 個減)。 (Victor Stinner による貢献、bpo-41006 と bpo-41718
  。)

* "LOAD_ATTR" 命令が、新しい「オペコードごとのキャッシュ」の仕組みを使
  うようになりました。 通常の属性では約 36%、スロットでは約 44% 高速に
  なります。 (PyPy と MicroPython で最初に実装されたアイデアに基づき、
  Pablo Galindo と Yury Selivanov が bpo-42093、Guido van Rossum が
  bpo-42927 で貢献しました。)

* "--enable-optimizations" を指定して Python をビルドすると、コンパイ
  ル時とリンク時の両方のコマンドラインに "-fno-semantic-interposition"
  が追加されるようになりました。 これにより、"gcc" で "--enable-
  shared" を指定してビルドした Python インタープリタが最大 30% 高速に
  なります。 詳しくは この記事 を参照してください。 (Victor Stinner と
  Pablo Galindo による貢献、bpo-38980。)

* "bz2" / "lzma" / "zlib" モジュールで新しい出力バッファ管理のコードを
  使い、"_compression.DecompressReader" クラスに ".readall()" 関数を追
  加しました。 bz2 の展開は 1.09～1.17 倍、lzma の展開は 1.20～1.32 倍
  、"GzipFile.read(-1)" は 1.11～1.18 倍高速になります。 (Ma Lin によ
  る貢献、Gregory P. Smith によるレビュー、bpo-41486。)

* 文字列化されたアノテーションを使う場合、関数の作成時にはアノテーショ
  ン辞書を作成しなくなりました。 代わりに文字列のタプルとして保持し、
  必要になった時点で関数オブジェクトがアノテーション辞書に変換します。
  この最適化により、アノテーション付きの関数を定義するために必要な CPU
  時間が半減します。 (Yurii Karabas と Inada Naoki による貢献、
  bpo-42202。)

* "str1 in str2" や "str2.find(str1)" などの部分文字列検索で、長い文字
  列での処理時間が 2 乗に比例することを避けるため、Crochemore と
  Perrin の "Two-Way" 文字列検索アルゴリズムを使う場合があるようになり
  ました。 (Dennis Sweeney による貢献、bpo-41972。)

* "_PyType_Lookup()" に小規模な最適化を加え、キャッシュにヒットする一
  般的な場合での型属性キャッシュの検索を高速化しました。 これにより、
  インタープリタは平均で 1.04 倍高速になります。 (Dino Viehland による
  貢献、bpo-43452。)

* 次の組み込み関数が、より高速な **PEP 590** の vectorcall 呼び出し規
  約に対応しました: "map()"、"filter()"、"reversed()"、"bool()"、
  "float()"。 (Donghee Na と Jeroen Demeyer による貢献、bpo-43575、
  bpo-43287、bpo-41922、bpo-41873 と bpo-41870。)

* 内部の "RLock" を削除して "BZ2File" の性能を改善しました。 このため
  、複数のスレッドが同時に読み書きする場合、"BZ2File" はスレッドセーフ
  ではなくなります。 "gzip" と "lzma" の対応するクラスは以前から同様の
  動作でした。 (Inada Naoki による貢献、bpo-43785。)


非推奨
======

* 現在の Python では、"0in x"、"1or x"、"0if 1else 2" のように、数値リ
  テラルの直後にキーワードを書くことができます。 このため "[0x1for x
  in y]" のような分かりにくく曖昧な式が許されます ("[0x1 for x in y]"
  とも "[0x1f or x in y]" とも解釈できます)。 このリリースから、数値リ
  テラルの直後にキーワード "and"、"else"、"for"、"if"、"in"、"is"、
  "or" のいずれかが続く場合、非推奨の警告が発生します。 将来のリリース
  では構文の警告に変わり、最終的には構文エラーになります。 (Serhiy
  Storchaka による貢献、bpo-43833。)

* このリリースから、Python 2.7 との互換性のために維持してきた古いイン
  ポートの動作を整理する取り組みを進めます。 具体的には、
  "find_loader()"/"find_module()" ("find_spec()" が後継)、
  "importlib.abc.Loader.load_module" ("exec_module()" が後継)、
  "module_repr()" (インポートシステムが処理を担います)、"__package__"
  属性 ("__spec__.parent" が後継)、"__loader__" 属性
  ("__spec__.loader" が後継)、"__cached__" 属性 ("__spec__.cached" が
  後継) を段階的に削除します。 "importlib" の他のクラスやメソッドも対
  象です。 この移行中に更新が必要なコードを特定できるよう、適切に
  "ImportWarning" や "DeprecationWarning" が発生します。

* "distutils" 名前空間全体を非推奨とし、Python 3.12 で削除する予定です
  。 詳しくは モジュールの変更 の節を参照してください。

* "random.randrange()" に整数以外の引数を渡すことを非推奨としました。
  "ValueError" の送出も非推奨とし、代わりに "TypeError" を送出するよう
  にします。 (Serhiy Storchaka と Raymond Hettinger による貢献、
  bpo-37319。)

* "importlib" の各種 "load_module()" メソッドは Python 3.6 からドキュ
  メントで非推奨とされていましたが、"DeprecationWarning" も発生するよ
  うになりました。 代わりに "exec_module()" を使ってください。 (Brett
  Cannon による貢献、bpo-26131。)

* "zipimport.zipimporter.load_module()" has been deprecated in
  preference for "exec_module()". (Contributed by Brett Cannon in
  bpo-26131.)

* インポートシステムが "importlib.abc.Loader.load_module" を使うと
  "ImportWarning" が発生するようになりました。 "exec_module()" の使用
  が推奨されます。 (Brett Cannon による貢献、bpo-26131。)

* インポートシステムが "importlib.abc.MetaPathFinder.find_module()" と
  "importlib.abc.PathEntryFinder.find_module()" を使うと、
  "ImportWarning" が発生するようになりました。 それぞれ
  "importlib.abc.MetaPathFinder.find_spec()" と
  "importlib.abc.PathEntryFinder.find_spec()" の使用が推奨されます。
  移行には "importlib.util.spec_from_loader()" が役立ちます。 (Brett
  Cannon による貢献、bpo-42134。)

* インポートシステムが "importlib.abc.PathEntryFinder.find_loader()"
  を使うと、"ImportWarning" が発生するようになりました。
  "importlib.abc.PathEntryFinder.find_spec()" の使用が推奨されます。
  移行には "importlib.util.spec_from_loader()" が役立ちます。 (Brett
  Cannon による貢献、bpo-43672。)

* "importlib.abc.MetaPathFinder.find_module()" の各実装
  ("importlib.machinery.BuiltinImporter.find_module()"、
  "importlib.machinery.FrozenImporter.find_module()"、
  "importlib.machinery.WindowsRegistryFinder.find_module()"、
  "importlib.machinery.PathFinder.find_module()"、
  "importlib.abc.MetaPathFinder.find_module()")、
  "importlib.abc.PathEntryFinder.find_module()" の実装
  ("importlib.machinery.FileFinder.find_module()")、
  "importlib.abc.PathEntryFinder.find_loader()" の実装
  ("importlib.machinery.FileFinder.find_loader()") が
  "DeprecationWarning" を発生させるようになりました。 Python 3.12 で削
  除する予定です (以前は Python 3.4 でドキュメント上非推奨とされていま
  した)。 (Brett Cannon による貢献、bpo-42135。)

* "importlib.abc.Finder" と、その唯一のメソッド "find_module()" を非推
  奨としました。 "importlib.abc.MetaPathFinder" と
  "importlib.abc.PathEntryFinder" は、このクラスを継承しなくなりました
  。 代わりに、この 2 つのクラスのうち適切な方を継承してください。
  (Brett Cannon による貢献、bpo-42135。)

* "imp"、"importlib.find_loader()"、
  "importlib.util.set_package_wrapper()"、
  "importlib.util.set_loader_wrapper()"、
  "importlib.util.module_for_loader()"、"pkgutil.ImpImporter"、
  "pkgutil.ImpLoader" の非推奨の記載を更新し、削除予定のバージョンを
  Python 3.12 と明記しました。 これらは以前の Python バージョンから
  "DeprecationWarning" を発生させています。 (Brett Cannon による貢献、
  bpo-43720。)

* モジュールの "__repr__()" メソッドについて、インポートシステムは
  "module_repr()" にフォールバックする前に、モジュールの "__spec__" 属
  性を使うようになりました。 "module_repr()" の使用は Python 3.12 で削
  除する予定です。 (Brett Cannon による貢献、bpo-42137。)

* "importlib.abc.Loader.module_repr()",
  "importlib.machinery.FrozenImporter.module_repr()", and
  "importlib.machinery.BuiltinImporter.module_repr()" are deprecated
  and slated for removal in Python 3.12. (Contributed by Brett Cannon
  in bpo-42136.)

* "sqlite3.OptimizedUnicode" は、"str" の別名となった Python 3.3 以降
  、ドキュメントに記載されず、使われなくなっていました。 今回非推奨と
  なり、Python 3.12 で削除する予定です。 (Erlend E. Aasland による貢献
  、bpo-42264。)

* ドキュメントに記載されていない組み込み関数
  "sqlite3.enable_shared_cache" を非推奨とし、Python 3.12 で削除する予
  定です。 SQLite3 のドキュメントでは、その使用を強く非推奨としていま
  す。 詳しくは SQLite3 のドキュメント を参照してください。 共有キャッ
  シュを使う必要がある場合は、"cache=shared" クエリパラメータを指定し
  、URI モードでデータベースを開いてください。 (Erlend E. Aasland によ
  る貢献、bpo-24464。)

* 以下の "threading" メソッドは非推奨になりました：

  * "threading.currentThread" => "threading.current_thread()"

  * "threading.activeCount" => "threading.active_count()"

  * "threading.Condition.notifyAll" =>
    "threading.Condition.notify_all()"

  * "threading.Event.isSet" => "threading.Event.is_set()"

  * "threading.Thread.setName" => "threading.Thread.name"

  * "threading.Thread.getName" => "threading.Thread.name"

  * "threading.Thread.isDaemon" => "threading.Thread.daemon"

  * "threading.Thread.setDaemon" => "threading.Thread.daemon"

  (Jelle Zijlstra による貢献、gh-87889。)

* "pathlib.Path.link_to()" を非推奨とし、Python 3.12 で削除する予定で
  す。 代わりに "pathlib.Path.hardlink_to()" を使ってください。
  (Barney Gale による貢献、bpo-39950。)

* "cgi.log()" を非推奨とし、Python 3.12 で削除する予定です。 (Inada
  Naoki による貢献、bpo-41139。)

* 次の "ssl" の機能は Python 3.6、Python 3.7、または OpenSSL 1.1.0 か
  ら非推奨となっており、3.11 で削除する予定です:

  * "OP_NO_SSLv2"、"OP_NO_SSLv3"、"OP_NO_TLSv1"、"OP_NO_TLSv1_1"、
    "OP_NO_TLSv1_2"、"OP_NO_TLSv1_3" は、"minimum_version" と
    "maximum_version" に置き換えられます。

  * "PROTOCOL_SSLv2"、"PROTOCOL_SSLv3"、"PROTOCOL_SSLv23"、
    "PROTOCOL_TLSv1"、"PROTOCOL_TLSv1_1"、"PROTOCOL_TLSv1_2"、
    "PROTOCOL_TLS" を非推奨とし、代わりに "PROTOCOL_TLS_CLIENT" と
    "PROTOCOL_TLS_SERVER" を推奨します。

  * "wrap_socket()" は "ssl.SSLContext.wrap_socket()" に置き換えられま
    す。

  * "match_hostname()"

  * "RAND_pseudo_bytes()", "RAND_egd()"

  * "ssl.SSLSocket.selected_npn_protocol()" や
    "ssl.SSLContext.set_npn_protocols()" などの NPN の機能は、ALPN に
    置き換えられます。

* スレッドのデバッグ機能 ("PYTHONTHREADDEBUG" 環境変数) は Python 3.10
  で非推奨となり、Python 3.12 で削除する予定です。 この機能には Python
  のデバッグビルド が必要です。 (Victor Stinner による貢献、bpo-44584
  。)

* "typing.io" と "typing.re" サブモジュールからインポートすると、
  "DeprecationWarning" が発生するようになりました。 これらのサブモジュ
  ールは将来の Python で削除される予定です。 これらに属するものは、代
  わりに "typing" から直接インポートしてください。 (Sebastian Rittau
  による貢献、bpo-38291。)


削除
====

* "complex" クラスの特殊メソッド "__int__"、"__float__"、
  "__floordiv__"、"__mod__"、"__divmod__"、"__rfloordiv__"、"__rmod__"
  、"__rdivmod__" を削除しました。 これらは常に "TypeError" を送出して
  いました。 (Serhiy Storchaka による貢献、bpo-41974。)

* 非公開でドキュメントに記載されていない "_markupbase" モジュールの
  "ParserBase.error()" メソッドを削除しました。
  "html.parser.HTMLParser" が "ParserBase" の唯一のサブクラスで、その
  "error()" の実装は Python 3.5 ですでに削除されています。 (Berker
  Peksag による貢献、bpo-31844。)

* 内部の PyCapsule オブジェクトだった "unicodedata.ucnhash_CAPI" 属性
  を削除しました。 関連する非公開の "_PyUnicode_Name_CAPI" 構造体は内
  部 C API に移動しました。 (Victor Stinner による貢献、bpo-42157。)

* 新しい PEG パーサーへの移行により 3.9 で非推奨となった "parser" モジ
  ュールを削除しました。 "node.h"、"parser.h"、"graminit.h"、
  "grammar.h" など、古いパーサーだけが使っていた C ソースファイルとヘ
  ッダーファイルもすべて削除しました。

* 新しい PEG パーサーへの移行により 3.9 で非推奨となった公開 C API 関
  数 "PyParser_SimpleParseStringFlags"、
  "PyParser_SimpleParseStringFlagsFilename"、
  "PyParser_SimpleParseFileFlags"、"PyNode_Compile" を削除しました。

* Python 3.4 で非推奨となった "formatter" モジュールを削除しました。
  やや時代遅れで、ほとんど使われておらず、テストもありません。 当初は
  Python 3.6 で削除する予定でしたが、この種の削除は Python 2.7 のサポ
  ート終了後まで延期されていました。 使っている場合は、必要なクラスを
  自分のコードにコピーしてください。 (Donghee Na と Terry J. Reedy に
  よる貢献、bpo-42299。)

* "PyModule_GetWarningsModule()" 関数を削除しました。 "_warnings" モジ
  ュールは 2.6 で組み込みモジュールに変わったため、この関数は不要にな
  っていました。 (Hai Shi による貢献、bpo-42599。)

* "collections" モジュールから、コレクション抽象基底クラス への非推奨
  の別名を削除しました。 (Victor Stinner による貢献、bpo-37324。)

* Python 3.8 での非推奨化に続き、"asyncio" の 高水準 API の大半から
  "loop" パラメータを削除しました。 この変更にはいくつかの理由がありま
  す:

  1. 高水準 API が単純になります。

  2. 高水準 API の関数は、Python 3.7 以降、現在のスレッドで実行中のイ
     ベントループを暗黙に取得しています。 通常の使用例の大半では、API
     にイベントループを渡す必要はありません。

  3. 特に異なるスレッドで実行するループを扱う場合、イベントループを渡
     す方法は誤りを招きやすくなります。

  低水準 API は引き続き "loop" を受け付けます。 既存のコードを置き換え
  る例は Python API の変更 を参照してください。

  (Yurii Karabas、Andrew Svetlov、Yury Selivanov、Kyle Stanley による
  貢献、bpo-42392。)


Python 3.10 への移行
====================

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


Python の構文の変更
-------------------

* 数値リテラルの直後にキーワードが続く、以前は有効だった構文 ("0in x"
  など) をコンパイルすると、非推奨の警告が発生するようになりました。
  将来のリリースでは構文の警告に変わり、最終的には構文エラーになります
  。 警告をなくし、将来のリリースと互換性のあるコードにするには、数値
  リテラルとその後のキーワードの間にスペースを追加してください。
  (Serhiy Storchaka による貢献、bpo-43833。)


Python API の変更
-----------------

* "traceback" モジュールの "format_exception()"、
  "format_exception_only()"、"print_exception()" 関数の *etype* パラメ
  ータを *exc* に改名しました。 (Zackery Spytz と Matthias Bussonnier
  による貢献、bpo-26389。)

* "atexit": Python の終了時に "atexit.register()" で登録したコールバッ
  クが失敗すると、その例外がログに記録されるようになりました。 以前は
  一部の例外しか記録されず、最後の例外は常に黙って無視されていました。
  (Victor Stinner による貢献、bpo-42639。)

* ジェネリックの "collections.abc.Callable" は、"typing.Callable" と同
  様に型引数を平坦化するようになりました。 つまり、
  "collections.abc.Callable[[int, str], str]" の "__args__" は "(int,
  str, str)" になります。 以前は "([int, str], str)" でした。
  "typing.get_args()" や "__args__" で引数にアクセスするコードでは、こ
  の変更に対応する必要があります。 さらに、Python 3.9 ではエラーになら
  なかった "collections.abc.Callable" の無効なパラメータ化で、
  "TypeError" が送出される場合があります。 (Ken Jin による貢献、
  bpo-42195。)

* "socket.htons()" と "socket.ntohs()" に渡した値が 16 ビット符号なし
  整数に収まらない場合、"DeprecationWarning" ではなく "OverflowError"
  を送出するようになりました。 (Erlend E. Aasland による貢献、
  bpo-42393。)

* Python 3.8 での非推奨化に続き、"asyncio" の 高水準 API の大半から
  "loop" パラメータを削除しました。

  現在次のようになっているコルーチンは、

     async def foo(loop):
         await asyncio.sleep(1, loop=loop)

  次のように置き換えてください。

     async def foo():
         await asyncio.sleep(1)

  "foo()" を、現在のスレッドで実行中のイベントループで *実行しない* よ
  う意図的に設計している場合 (例えば別のスレッドのイベントループで実行
  する場合) は、代わりに "asyncio.run_coroutine_threadsafe()" の使用を
  検討してください。

  (Yurii Karabas、Andrew Svetlov、Yury Selivanov、Kyle Stanley による
  貢献、bpo-42392。)

* "types.FunctionType" コンストラクタは、*globals* 辞書に
  ""__builtins__"" キーがない場合、"{"None": None}" を組み込みの名前空
  間として使う代わりに、現在の組み込みの名前空間を引き継ぐようになりま
  した。 "eval()" 関数や "exec()" 関数と同じ動作です。 Python の "def
  function(...): ..." で関数を定義する場合には影響しません。 この構文
  ではグローバル名前空間を差し替えられず、同様に現在の組み込みの名前空
  間を引き継ぎます。 (Victor Stinner による貢献、bpo-42990。)


C API の変更
------------

* 新しい PEG パーサーへの移行に伴い、C API 関数
  "PyParser_SimpleParseStringFlags"、
  "PyParser_SimpleParseStringFlagsFilename"、
  "PyParser_SimpleParseFileFlags"、"PyNode_Compile" と、これらの関数が
  使う型 "struct _node" を削除しました。

  ソースコードは、例えば "Py_CompileString()" を使って、直接コードオブ
  ジェクトにコンパイルしてください。 得られたコードオブジェクトは、例
  えば "PyEval_EvalCode()" を使って評価できます。

  具体的には次のようになります:

  * "PyParser_SimpleParseStringFlags" に続けて "PyNode_Compile" を呼び
    出すコードは、"Py_CompileString()" の呼び出しに置き換えられます。

  * "PyParser_SimpleParseFileFlags" を直接置き換える関数はありません。
    "FILE *" 引数からコードをコンパイルするには、C でファイルを読み込
    み、そのバッファを "Py_CompileString()" に渡す必要があります。

  * "char *" のファイル名からファイルをコンパイルするには、ファイルを
    明示的に開いて読み込み、その内容をコンパイルします。 例えば、次の
    ように "io" モジュールを "PyImport_ImportModule()"、
    "PyObject_CallMethod()"、"PyBytes_AsString()"、
    "Py_CompileString()" と組み合わせて使う方法があります。 (宣言とエ
    ラー処理は省略しています。)

       io_module = PyImport_ImportModule("io");
       fileobject = PyObject_CallMethod(io_module, "open", "ss", filename, "rb");
       source_bytes_object = PyObject_CallMethod(fileobject, "read", "");
       result = PyObject_CallMethod(fileobject, "close", "");
       source_buf = PyBytes_AsString(source_bytes_object);
       code = Py_CompileString(source_buf, filename, Py_file_input);

  * For "FrameObject" objects, the "f_lasti" member now represents a
    wordcode offset instead of a simple offset into the bytecode
    string. This means that this number needs to be multiplied by 2 to
    be used with APIs that expect a byte offset instead (like
    "PyCode_Addr2Line()" for example). Notice as well that the
    "f_lasti" member of "FrameObject" objects is not considered
    stable: please use "PyFrame_GetLineNumber()" instead.


CPython バイトコードの変更
==========================

* "MAKE_FUNCTION" 命令が、関数のアノテーションとして辞書と文字列のタプ
  ルのどちらも受け付けるようになりました。 (Yurii Karabas と Inada
  Naoki による貢献、bpo-42202。)


ビルドの変更
============

* **PEP 644**: Python には OpenSSL 1.1.1 以降が必要になりました。
  OpenSSL 1.0.2 はサポートされなくなりました。 (Christian Heimes によ
  る貢献、bpo-43669。)

* Python のビルドに C99 の関数 "snprintf()" と "vsnprintf()" が必要に
  なりました。 (Victor Stinner による貢献、bpo-36020。)

* "sqlite3" には SQLite 3.7.15 以降が必要です。 (Sergey Fedoseev と
  Erlend E. Aasland による貢献、bpo-40744 と bpo-40810。)

* "atexit" モジュールは、常に組み込みモジュールとしてビルドする必要が
  あります。 (Victor Stinner による貢献、bpo-42639。)

* "configure" スクリプトに "--disable-test-modules" オプションを追加し
  ました。 テスト用モジュールをビルドもインストールもしないようにでき
  ます。 (Xavier de Gaye, Thomas Petazzoni と Peixing Xin による貢献、
  bpo-27640。)

* "./configure" スクリプトに "--with-wheel-pkg-dir=PATH オプション" を
  追加しました。 指定すると、"ensurepip" モジュールはそのディレクトリ
  で "setuptools" と "pip" の wheel パッケージを探します。 両方が見つ
  かれば、ensurepip に同梱された wheel パッケージの代わりに使います。

  Linux ディストリビューションによっては、パッケージングの方針で依存パ
  ッケージの同梱を推奨していません。 例えば Fedora は wheel パッケージ
  を "/usr/share/python-wheels/" ディレクトリにインストールし、
  "ensurepip._bundled" パッケージはインストールしません。

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

* "libpythonMAJOR.MINOR.a" 静的ライブラリのビルドと "python.o" オブジ
  ェクトファイルのインストールを行わない、新しい "configure --without-
  static-libpython オプション" を追加しました。

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

* "configure" スクリプトは、"pkg-config" ユーティリティが利用できる場
  合、それを使って Tcl/Tk のヘッダーとライブラリの場所を検出するように
  なりました。 従来どおり、"--with-tcltk-includes" と "--with-tcltk-
  libs" の構成オプションで場所を明示的に指定することもできます。
  (Manolis Stamatogiannakis による貢献、bpo-42603。)

* "configure" スクリプトに "--with-openssl-rpath" オプションを追加しま
  した。 "./configure --with-openssl=/path/to/openssl --with-openssl-
  rpath=auto" のように、独自にインストールした OpenSSL を使って Python
  を簡単にビルドできます。 (Christian Heimes による貢献、bpo-43466。)


C API の変更
============


PEP 652: 安定 ABI の保守
------------------------

拡張モジュールや Python の埋め込み向けの安定 ABI (アプリケーションバイ
ナリインターフェース) を明示的に定義しました。 C API と ABI の安定性
では、C API と ABI の安定性の保証と、安定 ABI を使う際のベストプラクテ
ィスを説明しています。

(Petr Viktorin による貢献、**PEP 652** と bpo-43795。)


新しい機能
----------

* "PyNumber_Index()" の結果の型は、常に厳密に "int" になりました。 以
  前は "int" のサブクラスのインスタンスになる場合がありました。
  (Serhiy Storchaka による貢献、bpo-40792。)

* "PyConfig" 構造体に新しいメンバー "orig_argv" を追加しました。
  Python 実行ファイルに渡された元のコマンドライン引数のリストです。
  (Victor Stinner による貢献、bpo-23427。)

* "datetime.datetime" オブジェクトと "datetime.time" オブジェクトの
  "tzinfo" 属性にアクセスするための、"PyDateTime_DATE_GET_TZINFO()" マ
  クロと "PyDateTime_TIME_GET_TZINFO()" マクロを追加しました。
  (Zackery Spytz による貢献、bpo-30155。)

* コーデック検索関数の登録を解除する "PyCodec_Unregister()" 関数を追加
  しました。 (Hai Shi による貢献、bpo-41842。)

* "StopIteration" 例外を送出せずにイテレータに値を送れるよう、
  "PyIter_Send()" 関数を追加しました。 (Vladimir Matveev による貢献、
  bpo-41756。)

* 制限付き C API に "PyUnicode_AsUTF8AndSize()" を追加しました。 (Alex
  Gaynor による貢献、bpo-41784。)

* "PyModule_AddObjectRef()" 関数を追加しました。
  "PyModule_AddObject()" と似ていますが、成功時に値への参照を奪いませ
  ん。 (Victor Stinner による貢献、bpo-1635741。)

* オブジェクトの参照カウントを増やしてそのオブジェクトを返す、
  "Py_NewRef()" 関数と "Py_XNewRef()" 関数を追加しました。 (Victor
  Stinner による貢献、bpo-42262。)

* "PyType_FromSpecWithBases()" 関数と "PyType_FromModuleAndSpec()" 関
  数の *bases* 引数に、単一のクラスを渡せるようになりました。 (Serhiy
  Storchaka による貢献、bpo-42423。)

* "PyType_FromModuleAndSpec()" 関数が、"tp_doc" スロットの NULL を受け
  付けるようになりました。 (Hai Shi による貢献、bpo-41832。)

* "PyType_GetSlot()" 関数が 静的な型 を受け付けるようになりました。
  (Hai Shi と Petr Viktorin による貢献、bpo-41073。)

* オブジェクトが "set" のインスタンスで、サブタイプのインスタンスでは
  ないことを調べる、新しい "PySet_CheckExact()" 関数を C API に追加し
  ました。 (Pablo Galindo による貢献、bpo-43277。)

* 模擬的に発生させるシグナルの番号を渡せる "PyErr_SetInterruptEx()" を
  追加しました。 (Antoine Pitrou による貢献、bpo-43356。)

* Python をデバッグモードでビルド した場合 ("Py_DEBUG" マクロが定義さ
  れている場合) も、制限付き C API をサポートするようになりました。
  Python がデバッグモードでビルドされ、"Py_LIMITED_API" マクロが
  Python 3.10 以降を対象とする場合、制限付き C API の "Py_INCREF()" 関
  数と "Py_DECREF()" 関数は "PyObject.ob_refcnt" メンバーに直接アクセ
  スせず、内部を隠した関数呼び出しとして実装されます。 Python 3.8 以降
  、リリースモードとデバッグモードで "PyObject" 構造体が同一になったた
  め、デバッグモードでも制限付き C API をサポートできるようになりまし
  た (bpo-36465 を参照)。

  "--with-trace-refs" を使った特殊なビルド ("Py_TRACE_REFS" マクロ) で
  は、引き続き制限付き C API はサポートされません。 (Victor Stinner に
  よる貢献、bpo-43688。)

* Python の "x is y" と同様に、オブジェクト *x* とオブジェクト *y* が
  同一か調べる "Py_Is(x, y)" 関数を追加しました。 また、オブジェクトが
  それぞれ "None"、"True"、"False" のシングルトンかを調べる
  "Py_IsNone()" 関数、"Py_IsTrue()" 関数、"Py_IsFalse()" 関数も追加し
  ました。 (Victor Stinner による貢献、bpo-43753。)

* C コードからガベージコレクタを制御する新しい関数 "PyGC_Enable()"、
  "PyGC_Disable()"、"PyGC_IsEnabled()" を追加しました。 "gc" モジュー
  ルをインポートせずに、C コードからガベージコレクタを有効化、無効化し
  たり、状態を調べたりできます。

* 型のインスタンスの作成を禁止する、新しい型フラグ
  "Py_TPFLAGS_DISALLOW_INSTANTIATION" を追加しました。 (Victor Stinner
  による貢献、bpo-43916。)

* イミュータブルな型オブジェクトを作成するための新しい型フラグ
  "Py_TPFLAGS_IMMUTABLETYPE" を追加しました。 この型の属性は設定も削除
  もできません。 (Victor Stinner と Erlend E. Aasland による貢献、
  bpo-43908。)


Python 3.10 への移行
--------------------

* "PyArg_ParseTuple()" と "Py_BuildValue()" の "#" を使う書式 ("es#"、
  "et#"、"s#"、"u#"、"y#"、"z#"、"U#"、"Z#") を使うには、
  "PY_SSIZE_T_CLEAN" マクロの定義が必要になりました。 引数の解釈と値の
  構築 と **PEP 353** を参照してください。 (Victor Stinner による貢献
  、bpo-40943。)

* "Py_REFCNT()" を static インライン関数に変更したため、
  "Py_REFCNT(obj) = new_refcnt" を "Py_SET_REFCNT(obj, new_refcnt)" に
  置き換える必要があります。 "Py_SET_REFCNT()" (Python 3.9 以降で利用
  可能) を参照してください。 後方互換性のため、次のマクロを使えます。

     #if PY_VERSION_HEX < 0x030900A4
     #  define Py_SET_REFCNT(obj, refcnt) ((Py_REFCNT(obj) = (refcnt)), (void)0)
     #endif

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

* 歴史的な理由で許されていた、*GIL* を保持せずに "PyDict_GetItem()" を
  呼び出すことは、許されなくなりました。 (Victor Stinner による貢献、
  bpo-40839。)

* "PyUnicode_FromUnicode(NULL, size)" と
  "PyUnicode_FromStringAndSize(NULL, size)" が "DeprecationWarning" を
  発生させるようになりました。 初期データなしで Unicode オブジェクトを
  確保するには、"PyUnicode_New()" を使ってください。 (Inada Naoki によ
  る貢献、bpo-36346。)

* PyCapsule API "unicodedata.ucnhash_CAPI" の非公開構造体
  "_PyUnicode_Name_CAPI" を、内部 C API に移動しました。 (Victor
  Stinner による貢献、bpo-42157。)

* "Py_GetPath()"、"Py_GetPrefix()"、"Py_GetExecPrefix()"、
  "Py_GetProgramFullPath()"、"Py_GetPythonHome()"、
  "Py_GetProgramName()" 関数は、"Py_Initialize()" より前 (Python の初
  期化前) に呼び出すと "NULL" を返すようになりました。 Python のパス設
  定 を取得するには、新しい Python 初期化設定 API を使ってください。
  (Victor Stinner による貢献、bpo-42260。)

* "PyList_SET_ITEM()"、"PyTuple_SET_ITEM()"、"PyCell_SET()" マクロを左
  辺値や右辺値として使えなくなりました。 例えば "x =
  PyList_SET_ITEM(a, b, c)" や "PyList_SET_ITEM(a, b, c) = x" はコンパ
  イルエラーになります。 これにより "if (PyList_SET_ITEM (a, b, c) <
  0) ..." のような検査によるバグを防ぎます。 (Zackery Spytz と Victor
  Stinner による貢献、bpo-30459。)

* 制限付き API に含まれないファイル "odictobject.h"、
  "parser_interface.h"、"picklebufobject.h"、"pyarena.h"、"pyctype.h"
  、"pydebug.h"、"pyfpe.h"、"pytime.h" を "Include/cpython" ディレクト
  リに移動しました。 これらは "Python.h" にすでに含まれているため、直
  接インクルードしないでください。 インクルードファイル を参照してくだ
  さい。 直接インクルードしている場合は、代わりに "Python.h" をインク
  ルードすることを検討してください。 (Nicholas Sim による貢献、
  bpo-35134。)

* イミュータブルな型オブジェクトを作成するには、型フラグ
  "Py_TPFLAGS_IMMUTABLETYPE" を使ってください。 型オブジェクトがミュー
  タブルかどうかを判断するために "Py_TPFLAGS_HEAPTYPE" に頼らず、代わ
  りに "Py_TPFLAGS_IMMUTABLETYPE" が設定されているかを調べてください。
  (Victor Stinner と Erlend E. Aasland による貢献、bpo-43908。)

* ドキュメントに記載されていない関数 "Py_FrozenMain" を制限付き API か
  ら削除しました。 この関数は主に Python のカスタムビルドで役立つもの
  です。 (Petr Viktorin による貢献、bpo-26241。)


非推奨
------

* "PyUnicode_InternImmortal()" 関数は非推奨となり、Python 3.12 で削除
  する予定です。 代わりに "PyUnicode_InternInPlace()" を使ってください
  。 (Victor Stinner による貢献、bpo-41692。)


削除
----

* "Py_UNICODE*" 文字列を操作する "Py_UNICODE_str*" 関数を削除しました
  。 (Inada Naoki による貢献、bpo-41123。)

  * "Py_UNICODE_strlen": "PyUnicode_GetLength()" または
    "PyUnicode_GET_LENGTH" を使ってください。

  * "Py_UNICODE_strcat": "PyUnicode_CopyCharacters()" または
    "PyUnicode_FromFormat()" を使ってください。

  * "Py_UNICODE_strcpy"、"Py_UNICODE_strncpy":
    "PyUnicode_CopyCharacters()" または "PyUnicode_Substring()" を使っ
    てください。

  * "Py_UNICODE_strcmp": "PyUnicode_Compare()" を使ってください。

  * "Py_UNICODE_strncmp": "PyUnicode_Tailmatch()" を使ってください。

  * "Py_UNICODE_strchr"、"Py_UNICODE_strrchr": "PyUnicode_FindChar()"
    を使ってください。

* "PyUnicode_GetMax()" を削除しました。 新しい API (**PEP 393**) に移
  行してください。 (Inada Naoki による貢献、bpo-41103。)

* "PyLong_FromUnicode()" を削除しました。 "PyLong_FromUnicodeObject()"
  に移行してください。 (Inada Naoki による貢献、bpo-41103。)

* "PyUnicode_AsUnicodeCopy()" を削除しました。
  "PyUnicode_AsUCS4Copy()" または "PyUnicode_AsWideCharString()" を使
  ってください。 (Inada Naoki による貢献、bpo-41103。)

* "_Py_CheckRecursionLimit" 変数を削除しました。 "PyInterpreterState"
  構造体の "ceval.recursion_limit" に置き換えられています。 (Victor
  Stinner による貢献、bpo-41834。)

* ドキュメントに記載されていないマクロ "Py_ALLOW_RECURSION" と
  "Py_END_ALLOW_RECURSION"、および "PyInterpreterState" 構造体の
  "recursion_critical" フィールドを削除しました。 (Serhiy Storchaka に
  よる貢献、bpo-41936。)

* ドキュメントに記載されていない "PyOS_InitInterrupts()" 関数を削除し
  ました。 Python の初期化時にシグナルハンドラーは暗黙に設定されます。
  "PyConfig.install_signal_handlers" を参照してください。 (Victor
  Stinner による貢献、bpo-41713。)

* "PyAST_Validate()" 関数を削除しました。 公開 C API で AST オブジェク
  ト ("mod_ty" 型) を構築することはできなくなりました。 この関数はすで
  に制限付き C API (**PEP 384**) の対象外でした。 (Victor Stinner によ
  る貢献、bpo-43244。)

* "symtable.h" ヘッダーファイルと、ドキュメントに記載されていない次の
  関数を削除しました:

  * "PyST_GetScope()"

  * "PySymtable_Build()"

  * "PySymtable_BuildObject()"

  * "PySymtable_Free()"

  * "Py_SymtableString()"

  * "Py_SymtableStringObject()"

  "Py_SymtableString()" 関数は誤って安定 ABI に含まれていましたが、
  "symtable.h" ヘッダーファイルが制限付き C API の対象外だったため使え
  ませんでした。

  代わりに Python の "symtable" モジュールを使ってください。 (Victor
  Stinner による貢献、bpo-43244。)

* 制限付き C API のヘッダーと、Windows で安定 ABI を提供するライブラリ
  "python3.dll" から、"PyOS_ReadlineFunctionPointer()" を削除しました
  。 この関数は "FILE*" 引数を取るため、ABI の安定性を保証できません。
  (Petr Viktorin による貢献、bpo-43868。)

* "ast.h"、"asdl.h"、"Python-ast.h" ヘッダーファイルを削除しました。
  これらの関数はドキュメントに記載されておらず、制限付き C API にも含
  まれていませんでした。 これらのヘッダーファイルで定義される名前の大
  半は "Py" で始まっていないため、名前の衝突を起こす可能性がありました
  。 例えば "Python-ast.h" の "Yield" マクロは、Windows の
  "<winbase.h>" ヘッダーが使う名前 "Yield" と衝突していました。 代わり
  に Python の "ast" モジュールを使ってください。 (Victor Stinner によ
  る貢献、bpo-43244。)

* 公開 AST C API の削除に伴い、"struct _mod" 型を使う次のコンパイラ関
  数とパーサー関数を削除しました:

  * "PyAST_Compile()"

  * "PyAST_CompileEx()"

  * "PyAST_CompileObject()"

  * "PyFuture_FromAST()"

  * "PyFuture_FromASTObject()"

  * "PyParser_ASTFromFile()"

  * "PyParser_ASTFromFileObject()"

  * "PyParser_ASTFromFilename()"

  * "PyParser_ASTFromString()"

  * "PyParser_ASTFromStringObject()"

  これらの関数はドキュメントに記載されておらず、制限付き C API にも含
  まれていませんでした。 (Victor Stinner による貢献、bpo-43244。)

* "pyarena.h" ヘッダーファイルと次の関数を削除しました:

  * "PyArena_New()"

  * "PyArena_Free()"

  * "PyArena_Malloc()"

  * "PyArena_AddPyObject()"

  これらの関数はドキュメントに記載されておらず、制限付き C API にも含
  まれず、コンパイラの内部でしか使われていませんでした。 (Victor
  Stinner による貢献、bpo-43244。)

* Python を最適化するために "PyThreadState.use_tracing" メンバーを削除
  しました。 (Mark Shannon による貢献、bpo-43760。)


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

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


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

非推奨の "mailcap" モジュールは、安全でないテキスト (ファイル名、MIME
タイプ、パラメータ) をシェルコマンドに埋め込むことを拒否するようになり
ました。 そのようなテキストを使う代わりに、警告を出して一致する項目が
見つからなかったかのように動作します (テストコマンドの場合は、テストが
失敗したかのように動作します)。 (Petr Viktorin による貢献、gh-98966。)


3.10.12 の注目すべき変更
========================


tarfile
-------

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