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

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

Python3.10の新機能

リリース
日にち
2021年10月17日
編集者
パブロガリンドサルガド

この記事では、Python3.10の新機能を3.9と比較して説明します。

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

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

新しい構文機能:

  • PEP 634 、構造パターンマッチング:仕様
  • PEP 635 、構造パターンマッチング:動機と理論的根拠
  • PEP 636 、構造パターンマッチング:チュートリアル
  • :issue: `12782` 、括弧で囲まれたコンテキストマネージャーが正式に許可されるようになりました。

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

  • PEP 618 、オプションの長さを追加-zipにチェック。

通訳の改善:

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

新しいタイピング機能:

  • PEP 604 、共用体型をXとして記述できるようにする| Y
  • PEP 613 、明示的なタイプエイリアス
  • PEP 612 、パラメーター仕様変数

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

  • PEP 644 、OpenSSL1.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 を確認してください。

:issue: `12782` および:issue:` 40334` で、Guido van Rossum、Pablo Galindo、Lysandros Nikolaouによって寄稿されました。)


より良いエラーメッセージ

SyntaxErrors

閉じられていない括弧または括弧を含むコードを解析する場合、インタープリターは、 SyntaxError:解析中に予期しないEOFを表示したり、誤った場所を指したりする代わりに、閉じられていない括弧の括弧の場所を含めるようになりました。 たとえば、次のコードについて考えてみます(閉じられていない '{'に注意してください)。

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インタープリターでの以前の作業に触発されています。

:issue: `42864` のPabloGalindoと:issue:` 40176` のBatuhanTaskayaによって寄稿されました。)

インタプリタによって発生した 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

これで、Python3.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

この改善は、:issue: `43914` のPabloGalindoによって提供されました。

SyntaxError 例外のためのかなりの量の新しい特殊なメッセージが組み込まれました。 最も注目すべきもののいくつかは次のとおりです。

  • ブロックの前に:がありません:

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

    :issue: `42997` のPabloGalindoによる寄稿)

  • 内包表記の括弧で囲まれていないタプル:

    >>> {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?

    :issue: `43017` のPabloGalindoによる寄稿)

  • コレクションリテラルおよび式の間にコンマがありません:

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

    :issue: `43822` のPabloGalindoによる寄稿)

  • 括弧のない複数の例外タイプ:

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

    :issue: `43149` のPabloGalindoによる寄稿)

  • :と辞書リテラルの値がありません:

    >>> 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

    :issue: `43823` のPabloGalindoによる寄稿)

  • exceptまたはfinallyブロックのないtryブロック:

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

    :issue: `44305` のPabloGalindoによる寄稿)

  • 比較における==の代わりに=の使用法:

    >>> 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 '='?

    :issue: `43797` のPabloGalindoによる寄稿)

  • f文字列での*の使用法:

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

    :issue: `41064` のPabloGalindoによる寄稿)


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?

:issue: `38530` のPabloGalindoによる寄稿。)

警告

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?

:issue: `38530` のPabloGalindoによる寄稿。)

警告

エラーを表示するためにPyErr_Display()が呼び出されない場合、これは機能しないことに注意してください。これは、他のカスタムエラー表示機能が使用されている場合に発生する可能性があります。 これは、IPythonなどの一部のREPLで一般的なシナリオです。


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

PEP 626は、デバッグ、プロファイリング、およびカバレッジツール用のより正確で信頼性の高い行番号を提供します。 正しい行番号のトレースイベントは、実行されたすべてのコード行に対して、および実行されたコード行に対してのみ生成されます。

フレームオブジェクトのf_lineno属性には、常に予想される行番号が含まれます。

コードオブジェクトのco_lnotab属性は非推奨になり、3.12で削除される予定です。 オフセットから行番号に変換する必要があるコードは、代わりに新しいco_lines()メソッドを使用する必要があります。


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

構造パターンマッチングが、アクションが関連付けられたパターンの matchステートメントおよび caseステートメントの形式で追加されました。 パターンは、シーケンス、マッピング、プリミティブデータ型、およびクラスインスタンスで構成されます。 パターンマッチングにより、プログラムは複雑なデータ型から情報を抽出し、データの構造を分岐し、さまざまな形式のデータに基づいて特定のアクションを適用できます。

構文と操作

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

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

matchステートメントは式を受け取り、その値を1つ以上のケースブロックとして指定された連続するパターンと比較します。 具体的には、パターンマッチングは次のように機能します。

  1. タイプと形状のデータを使用する(subject
  2. matchステートメントのsubjectを評価する
  3. 一致が確認されるまで、caseステートメントの各パターンと件名を上から下に比較します。
  4. 確認された一致のパターンに関連付けられたアクションを実行する
  5. 完全一致が確認されない場合、最後のケースであるワイルドカード_が提供されている場合は、一致ケースとして使用されます。 完全一致が確認されておらず、ワイルドカードケースが存在しない場合、一致ブロック全体が無効になります。


宣言型アプローチ

読者は、C、Java、JavaScript(および他の多くの言語)にあるswitchステートメントを使用して、サブジェクト(データオブジェクト)をリテラル(パターン)に照合する簡単な例を通じて、パターンマッチングに気付く場合があります。 多くの場合、switchステートメントは、オブジェクト/式をリテラルを含むcaseステートメントと比較するために使用されます。

パターンマッチングのより強力な例は、ScalaやElixirなどの言語で見つけることができます。 構造パターンマッチングでは、アプローチは「宣言型」であり、データが一致するための条件(パターン)を明示的に示します。

ネストされた「if」ステートメントを使用する「命令型」の一連の命令は、構造パターンマッチングに似たものを実現するために使用できますが、「宣言型」アプローチほど明確ではありません。 代わりに、「宣言型」アプローチは、一致するために満たす条件を示し、その明示的なパターンを通じてより読みやすくなります。 構造パターンマッチングは、caseステートメントで変数をリテラルと比較する最も単純な形式で使用できますが、Pythonの真の価値は、サブジェクトのタイプと形状の処理にあります。


単純なパターン:リテラルに一致

この例を、最も単純な形式でのパターンマッチングとして見てみましょう。値、件名、いくつかのリテラル、パターンとのマッチングです。 以下の例では、statusがmatchステートメントのサブジェクトです。 パターンはそれぞれの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"

上記の関数に418のstatusが渡されると、「私はティーポットです」が返されます。 上記の関数に500のstatusが渡されると、_のcaseステートメントがワイルドカードとして一致し、「インターネットに問題があります」が返されます。 最後のブロックに注意してください。変数名_は、ワイルドカードとして機能し、件名が常に一致することを保証します。 _の使用はオプションです。

|(「または」)を使用して、複数のリテラルを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ステートメントで_を使用しないと、一致が存在しない可能性があります。 一致するものが存在しない場合、動作はノーオペレーションです。 たとえば、500のstatusが渡されると、何も動作しません。


リテラルと変数を持つパターン

パターンは割り当ての解凍のように見える場合があり、パターンを使用して変数をバインドすることができます。 この例では、データポイントをそのx座標とy座標に展開できます。

# point is an (x, y) tuple
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つのパターンは、リテラルと変数を組み合わせ、変数 binds はサブジェクトからの値(point)です。 4番目のパターンは、2つの値をキャプチャします。これにより、概念的には、アンパック割り当て(x, y) = pointと同様になります。


パターンとクラス

クラスを使用してデータを構造化する場合は、クラス名の後にコンストラクターに似た引数リストをパターンとして使用できます。 このパターンには、クラス属性を変数に取り込む機能があります。

class Point:
    x: int
    y: int

def location(point):
    match point:
        case Point(x=0, y=0):
            print("Origin is the point's location.")
        case Point(x=0, y=y):
            print(f"Y={y} and the point is on the y-axis.")
        case Point(x=x, y=0):
            print(f"X={x} and the point is on the x-axis.")
        case Point():
            print("The point is located somewhere else on the plane.")
        case _:
            print("Not a point")
位置パラメータを持つパターン

属性の順序を提供するいくつかの組み込みクラスで位置パラメーターを使用できます(例: データクラス)。 クラスで__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("No points in the list.")
    case [Point(0, 0)]:
        print("The origin is the only point in the list.")
    case [Point(x, y)]:
        print(f"A single point {x}, {y} is in the list.")
    case [Point(0, y1), Point(0, y2)]:
        print(f"Two points on the Y axis at {y1}, {y2} are in the list.")
    case _:
        print("Something else is found in the list.")

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

これまでのところ、例では最後のcaseステートメントで_のみを使用しています。 ワイルドカードは、('error', code, _)などのより複雑なパターンで使用できます。 例えば:

match test_variable:
    case ('warning', code, 40):
        print("A warning has been received.")
    case ('error', code, _):
        print(f"An error {code} occurred.")

上記の場合、test_variableは( 'error'、code、100)と( 'error'、code、800)に一致します。


ガード

「ガード」と呼ばれるパターンにif句を追加できます。 ガードがfalseの場合、matchは次のケースブロックを試行します。 値のキャプチャは、ガードが評価される前に行われることに注意してください。

match point:
    case Point(x, y) if x == y:
        print(f"The point is located on the diagonal Y=X at {x}.")
    case Point(x, y):
        print(f"Point is not on the diagonal.")

その他の主な機能

他のいくつかの重要な機能:

  • 割り当ての解凍と同様に、タプルとリストのパターンはまったく同じ意味を持ち、実際には任意のシーケンスに一致します。 技術的には、件名はシーケンスである必要があります。 したがって、重要な例外は、パターンがイテレータと一致しないことです。 また、よくある間違いを防ぐために、シーケンスパターンは文字列と一致しません。

  • シーケンスパターンはワイルドカードをサポートします。[x, y, *rest]および(x, y, *rest)は、割り当てを解凍する際のワイルドカードと同様に機能します。 *の後の名前も_である可能性があるため、(x, y, *_)は、残りのアイテムをバインドせずに、少なくとも2つのアイテムのシーケンスに一致します。

  • マッピングパターン:{"bandwidth": b, "latency": l}は、dictから"bandwidth"および"latency"の値をキャプチャします。 シーケンスパターンとは異なり、余分なキーは無視されます。 ワイルドカード**restもサポートされています。 (ただし、**_は冗長になるため、許可されていません。)

  • サブパターンは、asキーワードを使用してキャプチャできます。

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

    これにより、as句がないと予想されるように、x1、y1、x2、y2、およびp2がサブジェクトの2番目の項目全体にバインドされます。

  • ほとんどのリテラルは平等によって比較されます。 ただし、シングルトンTrueFalse、およびNoneは同一性によって比較されます。

  • 名前付き定数はパターンで使用できます。 これらの名前付き定数は、定数がキャプチャ変数として解釈されないように、点線の名前にする必要があります。

    from enum import Enum
    class Color(Enum):
        RED = 0
        GREEN = 1
        BLUE = 2
    
    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()のデフォルトのエンコーディングは、プラットフォームとロケールに依存します。 UTF-8はほとんどのUnixプラットフォームで使用されるため、UTF-8ファイルを開くときにencodingオプションを省略します(例: JSON、YAML、TOML、Markdown)は非常に一般的なバグです。 例えば:

# BUG: "rb" mode or encoding="utf-8" should be used.
with open("data.json") as f:
    data = json.load(f)

このタイプのバグを見つけるために、オプションのEncodingWarningが追加されています。 sys.flags.warn_default_encoding がtrueで、ロケール固有のデフォルトエンコーディングが使用されている場合に発行されます。

-X warn_default_encodingオプションと PYTHONWARNDEFAULTENCODING が追加され、警告が有効になります。

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


その他の言語の変更

  • int 型には、新しいメソッド int.bit_count()があり、指定された整数の2進展開で1の数を返します。これは、人口カウントとも呼ばれます。 (:issue: `29882` でNiklasFiekasによって寄稿されました。)
  • dict.keys()dict.values()、および dict.items()によって返されるビューには、すべてmapping属性があります。これにより、元のディクショナリをラップする types.MappingProxyType オブジェクトが提供されます。 (:issue: `40890` でDennisSweeneyによって寄稿されました。)
  • PEP 618zip()関数にオプションのstrictフラグが追加されました。これは、すべての反復可能オブジェクトの長さが等しいことを要求するために使用されます。
  • 整数引数をとる組み込み関数と拡張関数は、 DecimalFraction 、および損失がある場合にのみ整数に変換できるその他のオブジェクトを受け入れなくなりました(例: __ int __()メソッドはありますが、 __ index __()メソッドはありません)。 (:issue: `37999` でSerhiyStorchakaによって寄稿されました。)
  • object .__ ipow __()NotImplemented を返す場合、オペレーターは object .__ pow __()および object .__ rpow __()に正しくフォールバックします。 ] 予想通り。 (:issue: `38302` のAlexShkopによる寄稿。)
  • 代入式は、セットリテラルとセット内包表記内、およびシーケンスインデックス(スライスではない)で括弧なしで使用できるようになりました。
  • 関数には、__globals__['__builtins__']を調べる代わりに、関数の実行時に組み込みシンボルを探すために使用される新しい__builtins__属性があります。 属性は、存在する場合は__globals__["__builtins__"]から初期化され、存在しない場合は現在のビルトインから初期化されます。 (:issue: `42990` でMarkShannonによって寄稿されました。)
  • 2つの新しい組み込み関数– aiter()anext()が追加され、それぞれ iter()next()に対応する非同期関数を提供します。 。 (:issue: `31861` で、Joshua Bronson、Daniel Pope、およびJustin Wangによって寄稿されました。)
  • 静的メソッド( @staticmethod )とクラスメソッド( @classmethod )は、メソッド属性(__module____name____qualname__を継承するようになりました。 ]、__doc____annotations__)であり、新しい__wrapped__属性があります。 さらに、静的メソッドを通常の関数として呼び出すことができるようになりました。 (:issue: `43682` でVictorStinnerによって寄稿されました。)
  • 複雑なターゲット( PEP 526 で定義されたsimple nameターゲット以外のすべて)の注釈は、from __future__ import annotationsでランタイム効果を引き起こしなくなりました。 (:issue: `42737` のBatuhanTaskayaによる寄稿。)
  • クラスオブジェクトとモジュールオブジェクトがレイジーになりました-オンデマンドで空のアノテーションディクテーションを作成します。 注釈辞書は、下位互換性のためにオブジェクトの__dict__に格納されます。 これにより、__annotations__を使用するためのベストプラクティスが向上します。 詳細については、アノテーションのベストプラクティスを参照してください。 (:issue: `43901` のLarryHastingsによる寄稿。)
  • yieldyield fromawaitで構成される注釈、または名前付き式は、副作用のためにfrom __future__ import annotationsで禁止されるようになりました。 (:issue: `42725` のBatuhanTaskayaによる寄稿。)
  • バインドされていない変数、super()、および注釈としてのシンボルテーブルの処理を変更する可能性のあるその他の式の使用は、from __future__ import annotationsでは無効になります。 (:issue: `42725` のBatuhanTaskayaによる寄稿。)
  • float タイプと decimal.Decimal タイプの両方のNaN値のハッシュは、オブジェクトのIDに依存するようになりました。 以前は、NaN値が互いに等しくない場合でも、常に0にハッシュされていました。 これにより、複数のNaNを含む辞書やセットを作成する際の過度のハッシュ衝突により、実行時の動作が2次式になる可能性がありました。 (:issue: `43475` でRaymondHettingerによって寄稿されました。)
  • __ debug __ 定数を削除すると、( NameError ではなく) SyntaxError が発生します。 (:issue: `45000` のDong-hee Naによる寄稿。)
  • SyntaxError 例外にend_linenoおよびend_offset属性が追加されました。 決定されない場合、それらはNoneになります。 (:issue: `43914` のPabloGalindoによる寄稿。)


新しいモジュール

  • まだありません。


改善されたモジュール

asyncio

不足しているconnect_accepted_socket()メソッドを追加します。 (:issue: `41332` のAlexGrönholmによる寄稿。)


argparse

argparseヘルプでは、誤解を招くフレーズ「オプションの引数」が「オプション」に置き換えられました。 一部のテストは、正確な出力の一致に依存している場合、適応が必要になる場合があります。 (:issue: `9694` でRaymondHettingerによって寄稿されました。)


配列

array.arrayindex()メソッドに、オプションの start および stop パラメーターが追加されました。 (:issue: `31956` でAndersLorentsenとZackerySpytzによって寄稿されました。)


asynchat、asyncore、smtpd

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


base64

base64.b32hexencode()および base64.b32hexdecode()を追加して、拡張16進アルファベットを使用したBase32エンコーディングをサポートします。


bdb

clearBreakpoints()を追加して、設定されているすべてのブレークポイントをリセットします。 (:issue: `24160` でIritKatrielによって寄稿されました。)


二等分

bisect モジュールのAPIに key 関数を提供する可能性を追加しました。 (:issue: `4356` でRaymondHettingerによって寄稿されました。)


コーデック

codecs.unregister()関数を追加して、コーデック検索関数の登録を解除します。 (:issue: `41842` のHaiShiによる寄稿。)


collections.abc

collections.abc.Callableパラメーター化されたgeneric__args__は、 typing.Callable と一致するようになりました。 collections.abc.Callable ジェネリックは、 typing.Callable が現在行っているのと同様に、型パラメーターをフラット化するようになりました。 これは、collections.abc.Callable[[int, str], str](int, str, str)__args__を持つことを意味します。 以前は([int, str], str)でした。 この変更を可能にするために、 types.GenericAlias をサブクラス化できるようになり、 collections.abc.Callable タイプをサブスクリプト化するとサブクラスが返されます。 TypeError は、Python3.9でサイレントに渡された可能性のある無効な形式のパラメーター化 collections.abc.Callable に対して発生する可能性があることに注意してください。 (:issue: `42195` でKenJinによって寄稿されました。)


contextlib

contextlib.acloseing()コンテキストマネージャーを追加して、非同期で解放されたリソースを表す非同期ジェネレーターとオブジェクトを安全に閉じます。 (:issue: `41229` でJoongiKimとJohnBelmonteによって寄稿されました。)

contextlib.nullcontext()に非同期コンテキストマネージャーのサポートを追加します。 (:issue: `41543` でTomGringauzによって寄稿されました。)

デコレータとしての非同期コンテキストマネージャの使用をサポートするために、AsyncContextDecoratorを追加します。


のろい

ncurses 6.1で追加された拡張カラー関数は、 curses.color_content()curses.init_color()curses.init_pair()、およびによって透過的に使用されます。 curses.pair_content()。 新しい関数 curses.has_extended_color_support()は、基盤となるncursesライブラリによって拡張カラーサポートが提供されているかどうかを示します。 (:issue: `36982` でJeffreyKintscherとHansPetter Janssonによって寄稿されました。)

BUTTON5_*定数は、基盤となるcursesライブラリによって提供されている場合、 curses モジュールで公開されるようになりました。 (:issue: `39273` のZackerySpytzによる寄稿。)


データクラス

__slots__

dataclasses.dataclass()デコレータにslotsパラメータを追加しました。 (:issue: `42269` のYuriiKarabasによる寄稿)


キーワードのみのフィールド

データクラスは、生成された__init__メソッドでキーワードのみのフィールドをサポートするようになりました。 キーワードのみのフィールドを指定する方法はいくつかあります。

すべてのフィールドはキーワードのみであると言えます。

from dataclasses import dataclass

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

namebirthdayはどちらも、生成された__init__メソッドのキーワードのみのパラメーターです。

キーワードのみをフィールドごとに指定できます。

from dataclasses import dataclass

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

ここでは、birthdayのみがキーワードのみです。 個々のフィールドにkw_onlyを設定する場合、キーワードのみのフィールドは非キーワードのみのフィールドの後に続く必要があるため、フィールドの並べ替えに関する規則があることに注意してください。 詳細については、完全なデータクラスのドキュメントを参照してください。

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

ここで、ztはキーワードのみのパラメーターですが、xyはキーワードのみではありません。 (EricVによる寄稿。 のスミス:issue: `43532`


distutils

distutilsパッケージ全体が非推奨になり、Python3.12で削除される予定です。 パッケージビルドを指定する機能は、すでにサードパーティパッケージsetuptoolsおよびpackagingに完全に置き換えられており、他のほとんどの一般的に使用されるAPIは、標準ライブラリの他の場所(プラットフォームなど)で利用できます。shutilサブプロセスまたは sysconfig )。 distutilsから他の機能を移行する予定はなく、他の機能を使用しているアプリケーションは、コードのプライベートコピーを作成することを計画する必要があります。 詳細については、 PEP 632 を参照してください。

Python3.8で非推奨になったbdist_wininstコマンドは削除されました。 bdist_wheelコマンドは、Windowsでバイナリパッケージを配布するために推奨されるようになりました。 (:issue: `42802` でVictorStinnerによって寄稿されました。)


doctest

モジュールが__loader__を定義していない場合は、__spec__.loaderにフォールバックします。 (:issue: `42133` のBrettCannonによる寄稿。)


エンコーディング

encodings.normalize_encoding()は非ASCII文字を無視するようになりました。 (:issue: `39337` でHaiShiによって寄稿されました。)


fileinput

fileinput.input()および fileinput.FileInputencoding および errors パラメーターを追加します。 (:issue: `43712` で稲田直樹によって寄稿されました。)

fileinput.hook_compressed()は、 mode が「r」で、ファイルが非圧縮ファイルのように圧縮されている場合に、TextIOWrapperオブジェクトを返すようになりました。 (:issue: `5758` で稲田直樹によって寄稿されました。)


フォールトハンドラー

faulthandler モジュールは、ガベージコレクターコレクション中に致命的なエラーが発生したかどうかを検出するようになりました。 (:issue: `44466` でVictorStinnerによって寄稿されました。)


gc

gc.get_objects()gc.get_referrers()、および gc.get_referents()の監査フックを追加します。 (:issue: `43439` のPabloGalindoによる寄稿。)


グロブ

glob()および iglob()root_dir および dir_fd パラメーターを追加して、検索するルートディレクトリを指定できるようにします。 (:issue: `38144` でSerhiyStorchakaによって寄稿されました。)


hashlib

hashlibモジュールには、OpenSSL1.1.1以降が必要です。 ( PEP 644 および:issue: `43669` でChristianHeimesによって寄稿されました。)

hashlibモジュールは、OpenSSL3.0.0を予備的にサポートしています。 (:issue: `38820` およびその他の問題でChristianHeimesによって寄稿されました。)

pbkdf2_hmac()の純粋なPythonフォールバックは非推奨です。 将来的には、PBKDF2-HMACは、PythonがOpenSSLをサポートして構築されている場合にのみ使用できるようになります。 (:issue: `43880` でChristianHeimesによって寄稿されました。)


hmac

hmacモジュールは、OpenSSLのHMAC実装を内部で使用するようになりました。 (:issue: `40645` のChristianHeimesによる寄稿。)


IDLEとidlelib

IDLEに sys.excepthook()を呼び出させます(「-n」なしで開始した場合)。 ユーザーフックは以前は無視されていました。 (:issue: `43008` のKenHiltonによるパッチ。)

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

シェルサイドバーを追加します。 プライマリプロンプト( '>>>')をサイドバーに移動します。 サイドバーにセカンダリプロンプト(「…」)を追加します。 左クリックとオプションのドラッグにより、エディターの行番号サイドバーと同様に、1行以上のテキストが選択されます。 テキスト行を選択した後に右クリックすると、「プロンプト付きでコピー」のコンテキストメニューが表示されます。 これにより、サイドバーからのプロンプトと選択したテキストからの行が一緒に圧縮されます。 このオプションは、テキストのコンテキストメニューにも表示されます。 (:issue: `37903` のTalEinatによる寄稿。)

タブの代わりにスペースを使用して、インタラクティブコードをインデントします。 これにより、インタラクティブなコードエントリが「正しく見える」ようになります。 これを実現可能にすることが、シェルサイドバーを追加する主な動機でした。 :issue: `37892` でTerryJan Reedyによって寄稿されました。)

これらのシェルの変更を将来の3.9メンテナンスリリースにバックポートする予定です。

パターンマッチングステートメントで、新しいソフトキーワード matchcase 、および _ を強調表示します。 ただし、この強調表示は完全ではなく、caseパターンの_ -sなど、まれに正しくない場合があります。 (bpo-44010のTal Einatによる寄稿。)


importlib.metadata

importlib_metadata 4.6( history )と同等の機能。

importlib.metadataエントリポイントは、新しいimportlib.metadata.EntryPointsクラスを介して、グループおよび名前でエントリポイントを選択するためのより優れたエクスペリエンスを提供するようになりました。 非推奨と使用法の詳細については、ドキュメントの互換性に関する注意事項を参照してください。

トップレベルのPythonモジュールとパッケージをimportlib.metadata.Distributionに解決するためのimportlib.metadata.packages_distributions()を追加しました。


検査する

モジュールが__loader__を定義していない場合は、__spec__.loaderにフォールバックします。 (:issue: `42133` のBrettCannonによる寄稿。)

inspect.get_annotations()を追加します。これにより、オブジェクトに定義されている注釈が安全に計算されます。 さまざまなタイプのオブジェクトの注釈にアクセスする際の癖を回避し、調査するオブジェクトについてほとんど想定していません。 inspect.get_annotations()は、文字列化された注釈の文字列を正しく解除することもできます。 inspect.get_annotations()は、Pythonオブジェクトで定義されたアノテーションdictにアクセスするためのベストプラクティスと見なされるようになりました。 注釈を操作するためのベストプラクティスの詳細については、注釈のベストプラクティスを参照してください。 関連して、 inspect.signature()inspect.Signature.from_callable()、およびinspect.Signature.from_function()は、 inspect.get_annotations()を呼び出して取得するようになりました。注釈。 つまり、 inspect.signature()および inspect.Signature.from_callable()でも、文字列化された注釈の文字列を解除できるようになりました。 (:issue: `43817` のLarryHastingsによる寄稿。)


linecache

モジュールが__loader__を定義していない場合は、__spec__.loaderにフォールバックします。 (:issue: `42133` のBrettCannonによる寄稿。)


os

VxWorksRTOSの os.cpu_count()サポートを追加します。 (:issue: `41440` のPeixingXinによる寄稿。)

Linuxでeventfd2システムコールをラップするために、新しい関数 os.eventfd()および関連するヘルパーを追加します。 (:issue: `41001` のChristianHeimesによる寄稿。)

os.splice()を追加します。これにより、カーネルアドレス空間とユーザーアドレス空間の間でコピーすることなく、2つのファイル記述子間でデータを移動できます。ファイル記述子の1つはパイプを参照する必要があります。 (:issue: `41625` のPabloGalindoによる寄稿。)

macOSの場合は O_EVTONLYO_FSYNCO_SYMLINKO_NOFOLLOW_ANY を追加します。 (:issue: `43106` のDong-hee Naによる寄稿。)


os.path

os.path.realpath()は、 strict キーワードのみの引数を受け入れるようになりました。 Trueに設定すると、パスが存在しないか、シンボリックリンクループが発生した場合に、 OSError が発生します。 (:issue: `43757` のBarneyGaleによる寄稿。)


pathlib

PurePath.parents にスライスサポートを追加します。 (:issue: `35498` のJoshuaCannonによる寄稿)

PurePath.parents にネガティブインデックスのサポートを追加します。 (:issue: `21041` のYaroslavPankovychによる寄稿)

link_to()に代わる Path.hardlink_to メソッドを追加します。 新しいメソッドの引数の順序は、 symlink_to()と同じです。 (:issue: `39950` のBarneyGaleによる寄稿。)

pathlib.Path.stat()および chmod()は、 os の対応する関数との一貫性を保つために、 follow_symlinks キーワードのみの引数を受け入れるようになりました。 ]モジュール。 (:issue: `39906` のBarneyGaleによる寄稿。)


プラットホーム

platform.freedesktop_os_release()を追加して、 freedesktop.org os-release 標準ファイルからオペレーティングシステムIDを取得します。 (:issue: `28468` のChristianHeimesによる寄稿)


pprint

pprint.pprint()は、新しいunderscore_numbersキーワード引数を受け入れるようになりました。 (:issue: `42914` のsblondonによる寄稿。)

pprint は、 dataclasses.dataclass インスタンスをきれいに印刷できるようになりました。 (:issue: `43080` でLewisGaulによって寄稿されました。)


py_compile

py_compile のコマンドラインインターフェイスに--quietオプションを追加します。 (:issue: `38731` でGregorySchevchenkoによって寄稿されました。)


pyclbr

pyclbr.readline()およびpyclbr.readline_ex()によって返されるツリー内のFunctionおよびClassオブジェクトにend_lineno属性を追加します。 既存の(開始)linenoと一致します。 (:issue: `38307` のAviralSrivastavaによる寄稿。)


shelve モジュールは、シェルフの作成時に pickle プロトコル3の代わりにデフォルトで pickle.DEFAULT_PROTOCOL を使用するようになりました。 (:issue: `34204` のZackerySpytzによる寄稿。)


統計

covariance()、Pearsonの correlation()、および単純な linear_regression()関数を追加します。 (:issue: `38490` のTymoteuszWołodźkoによる寄稿。)


サイト

モジュールが__loader__を定義していない場合は、__spec__.loaderにフォールバックします。 (:issue: `42133` のBrettCannonによる寄稿。)


ソケット

例外 socket.timeout は、 TimeoutError のエイリアスになりました。 (:issue: `42413` のChristianHeimesによる寄稿。)

IPPROTO_MPTCPでMPTCPソケットを作成するオプションを追加します(:issue: `43571` のRuiCunhaによる寄稿)。

IP_RECVTOSオプションを追加して、Type of Service(ToS)またはDSCP / ECNフィールドを受信します(:issue: `44077` のGeorgSauthoffによる寄稿)。


ssl

sslモジュールにはOpenSSL1.1.1以降が必要です。 ( PEP 644 および:issue: `43669` でChristianHeimesによって寄稿されました。)

sslモジュールは、OpenSSL3.0.0および新しいオプション OP_IGNORE_UNEXPECTED_EOF を予備的にサポートしています。 (:issue: `38820`:issue:` 43794`:issue: `43788`:issueのChristianHeimesによる寄稿: `43791`:issue:` 43799`:issue: `43920`:issue:` 43789` 、[X215X ]:issue: `43811` 。)

非推奨の関数と非推奨の定数の使用により、 DeprecationWarning が発生するようになりました。 ssl.SSLContext.options には OP_NO_SSLv2OP_NO_SSLv3 がデフォルトで設定されているため、フラグの再設定について警告することはできません。 非推奨セクションには、非推奨の機能のリストがあります。 (:issue: `43880` でChristianHeimesによって寄稿されました。)

sslモジュールのデフォルト設定がより安全になりました。 ForwardSecrecyまたはSHA-1MACのない暗号は、デフォルトで無効になっています。 セキュリティレベル2は、112ビット未満のセキュリティを持つ弱いRSA、DH、およびECCキーを禁止します。 SSLContext のデフォルトは最小プロトコルバージョンTLS1.2です。 設定は、HynekSchlawackの調査に基づいています。 (:issue: `43998` でChristianHeimesによって寄稿されました。)

非推奨のプロトコルSSL3.0、TLS 1.0、およびTLS1.1は正式にサポートされなくなりました。 Pythonはそれらを積極的にブロックしません。 ただし、OpenSSLビルドオプション、ディストリビューション構成、ベンダーパッチ、および暗号スイートにより、ハンドシェイクの成功が妨げられる場合があります。

timeout パラメーターを ssl.get_server_certificate()関数に追加します。 (:issue: `31870` のZackerySpytzによる寄稿。)

sslモジュールは、ヒープタイプとマルチフェーズ初期化を使用します。 (:issue: `42333` のChristianHeimesによる寄稿。)

新しい検証フラグ VERIFY_X509_PARTIAL_CHAIN が追加されました。 (:issue: `40849` のl0xによる寄稿。)


sqlite3

connect/handle()enable_load_extension()、および load_extension()の監査イベントを追加します。 (ErlendEによる寄稿。 のAasland:issue: `43762` 。)


sys

sys.orig_argv 属性を追加します:Python実行可能ファイルに渡される元のコマンドライン引数のリスト。 (:issue: `23427` でVictorStinnerによって寄稿されました。)

標準ライブラリモジュール名のリストを含む sys.stdlib_module_names を追加します。 (:issue: `42955` でVictorStinnerによって寄稿されました。)


_スレッド

_thread.interrupt_main()は、シミュレーションにオプションのシグナル番号を使用するようになりました(デフォルトは signal.SIGINT のままです)。 (:issue: `43356` のAntoinePitrouによる寄稿。)


糸脱毛

threading.gettrace()および threading.getprofile()を追加して、 threading.settrace()および threading.setprofile()によって設定された関数を取得します。それぞれ。 (:issue: `42251` でMarioCorcheroによって寄稿されました。)

threading .__ exceptionhook __ を追加して、壊れた値または別の値に設定されている場合に threading.excepthook()の元の値を取得できるようにします。 (:issue: `42308` でMarioCorcheroによって寄稿されました。)


トレースバック

format_exception()format_exception_only()、および print_exception()関数は、位置のみの引数として例外オブジェクトを受け取ることができるようになりました。 (:issue: `26389` でZackerySpytzとMatthiasBussonnierによって寄稿されました。)


タイプ

types.EllipsisTypetypes.NoneType 、および types.NotImplementedType クラスを再導入し、型チェッカーで簡単に解釈できる新しい型のセットを提供します。 (:issue: `41810` のBasvan Beekによる寄稿。)


タイピング

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

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

新しい関数 typing.is_typeddict()を追加して、注釈が typing.TypedDict であるかどうかをイントロスペクトします。 (:issue: `41792` のPatrickReaderによる寄稿)

データ変数のみが宣言されているtyping.Protocolのサブクラスは、runtime_checkable()で装飾されていない限り、isinstanceでチェックするとTypeErrorを発生するようになりました。 以前は、これらのチェックはサイレントに合格していました。 ランタイムプロトコルが必要な場合、ユーザーはサブクラスをruntime_checkable()デコレータで装飾する必要があります。 (:issue: `38908` のYuriiKarabasによる寄稿)

typing.ioおよびtyping.reサブモジュールからインポートすると、 DeprecationWarning が出力されるようになりました。 これらのサブモジュールはPython3.8以降非推奨であり、Pythonの将来のバージョンで削除される予定です。 これらのサブモジュールに属するものはすべて、代わりに typing から直接インポートする必要があります。 (:issue: `38291` でSebastianRittauによって寄稿されました)


単体テスト

新しいメソッド assertNoLogs()を追加して、既存の assertLogs()を補完します。 (:issue: `39385` のKitYan Choiによる寄稿。)


urllib.parse

Python 3.10より前のPythonバージョンでは、 urllib.parse.parse_qs()および urllib.parse.parse_qsl( )。 セキュリティ上の懸念と、新しいW3Cの推奨事項に準拠するために、これは、&をデフォルトとして、単一の区切りキーのみを許可するように変更されました。 この変更は、影響を受ける関数を内部で使用するため、 cgi.parse()および cgi.parse_multipart()にも影響します。 詳細については、それぞれのドキュメントを参照してください。 (:issue: `42967` でAdamGoldschmidt、Senthil Kumaran、Ken Jinによって寄稿されました。)

URLの一部に改行文字またはタブ文字が含まれていると、何らかの形の攻撃が可能になります。 RFC 3986 を更新するWHATWG仕様に従って、ASCII改行\n\r、およびタブ\t文字がURLから削除されます urllib.parse のパーサーによってそのような攻撃を防ぎます。 削除文字は、新しいモジュールレベル変数urllib.parse._UNSAFE_URL_BYTES_TO_REMOVEによって制御されます。 (:issue: `43882` を参照)


xml

LexicalHandler クラスを xml.sax.handler モジュールに追加します。 (:issue: `35018` でJonathanGossageとZackerySpytzによって寄稿されました。)


zipimport

PEP 451 に関連するメソッドを追加します: find_spec()zipimport.zipimporter.create_module()、および zipimport.zipimporter .exec_module()。 (:issue: `42131` のBrettCannonによる寄稿。)

invalidate_caches()メソッドを追加します。 (:issue: `14678` のDesmondCheongによる寄稿。)


最適化

  • コンストラクター str()bytes()、および bytearray()が高速になりました(約30〜40 % fまたは小さなオブジェクト)。 (:issue: `41334` のSerhiyStorchakaによる寄稿。)
  • runpy モジュールがインポートするモジュールが少なくなりました。 python3 -m module-nameコマンドの起動時間は平均で1.4倍速くなります。 Linuxでは、python3 -I -m module-nameはPython3.9では69モジュールをインポートしますが、Python 3.10では51モジュール(-18)しかインポートしません。 (:issue: `41006` および:issue:` 41718` でVictorStinnerによって寄稿されました。)
  • LOAD_ATTR命令は、新しい「オペコードごとのキャッシュ」メカニズムを使用するようになりました。 現在、通常の属性では約36 % f aster、スロットでは44 % f asterです。 (PyPyとMicroPythonで最初に実装されたアイデアに基づいて、:issue: `42093` のPabloGalindoとYurySelivanov、:issue:` 42927` のGuidovan Rossumによって寄稿されました。)
  • -enable-optimizations を使用してPythonをビルドすると、コンパイル行とリンク行の両方に-fno-semantic-interpositionが追加されるようになりました。 これにより、 -enable-sharedgccで作成されたPythonインタープリターのビルドが最大30%高速化されます。 詳細については、この記事を参照してください。 (:issue: `38980` でVictorStinnerとPabloGalindoによって寄稿されました。)
  • bz2 / lzma / zlib モジュールに新しい出力バッファー管理コードを使用し、.readall()関数を_compression.DecompressReaderクラスに追加します。 。 bz2解凍は1.09x〜1.17x速くなり、lzma解凍は1.20x〜1.32x速くなり、GzipFile.read(-1) 1.11x〜1.18x速くなりました。 (Ma Linによる寄稿、GregoryPによるレビュー。 スミス、:issue: `41486`
  • 文字列化された注釈を使用する場合、関数の作成時に関数の注釈辞書は作成されなくなりました。 代わりに、それらは文字列のタプルとして格納され、関数オブジェクトはこれをオンデマンドでアノテーションdictに遅延変換します。 この最適化により、注釈付き関数の定義に必要なCPU時間が半分に削減されます。 (:issue: `42202` でYuriiKarabasとInadaNaokiによって寄稿されました)
  • などの部分文字列検索機能str1 in str2str2.find(str1)長い文字列での2次動作を回避するために、Crochemore&Perrinの「双方向」文字列検索アルゴリズムを使用することがあります。 (:issue: `41972` でDennisSweeneyによって寄稿されました)
  • _PyType_Lookup()にマイクロ最適化を追加して、キャッシュヒットの一般的なケースでの型属性キャッシュルックアップのパフォーマンスを向上させます。 これにより、インタプリタは平均で1.04倍高速になります。 (:issue: `43452` でDinoViehlandによって寄稿されました)
  • 次の組み込み関数は、より高速な PEP 590 vectorcall呼び出し規約をサポートするようになりました: map()filter()、[X148X ] reverse()、 bool()および float()。 (:issue: `43575`:issue:` 43287`:issue: `41922` 、Dong-heeNaとJeroenDemeyerによる寄稿:issue: `41873` および:issue:` 41870`
  • BZ2Fileのパフォーマンスは、内部RLockを削除することで改善されています。 これにより、 gzip および lzma の同等のクラスが常にそうであったように、BZ2Fileスレッドは複数の同時リーダーまたはライターに直面して安全ではなくなります。 (:issue: `43785` で稲田直樹によって寄稿されました)。


非推奨


NS

  • 特別なメソッド__int____float____floordiv____mod____divmod____rfloordiv__、 [X94X ]および complex クラスの__rdivmod__。 彼らは常に TypeError を発生させました。 (:issue: `41974` でSerhiyStorchakaによって寄稿されました。)

  • プライベートで文書化されていない_markupbaseモジュールのParserBase.error()メソッドは削除されました。 html.parser.HTMLParserParserBaseの唯一のサブクラスであり、そのerror()実装はPython3.5ですでに削除されています。 (:issue: `31844` のBerkerPeksagによる寄稿。)

  • 内部PyCapsuleオブジェクトであったunicodedata.ucnhash_CAPI属性を削除しました。 関連するプライベート_PyUnicode_Name_CAPI構造が内部CAPIに移動されました。 (:issue: `42157` でVictorStinnerによって寄稿されました。)

  • parserモジュールを削除しました。これは、新しいPEGパーサーへの切り替えにより、3.9で非推奨になりました。また、 [を含む、古いパーサーでのみ使用されていたすべてのCソースファイルとヘッダーファイルも削除されました。 X203X]、parser.hgraminit.hgrammar.h

  • 新しいPEGパーサーへの切り替えにより3.9で非推奨となったパブリックCAPI関数PyParser_SimpleParseStringFlagsPyParser_SimpleParseStringFlagsFilenamePyParser_SimpleParseFileFlags、およびPyNode_Compileを削除しました。

  • Python3.4で非推奨となったformatterモジュールを削除しました。 それはやや時代遅れで、ほとんど使用されておらず、テストされていません。 当初はPython3.6で削除される予定でしたが、そのような削除はPython 2.7EOLの後まで延期されました。 既存のユーザーは、使用するクラスをコードにコピーする必要があります。 (Dong-heeNaとTerryJによる寄稿。 のReedy:issue: `42299` 。)

  • _warningsモジュールが2.6で組み込みモジュールに変換されたために使用できなくなったPyModule_GetWarningsModule()関数を削除しました。 (:issue: `42599` でHaiShiによって寄稿されました。)

  • collections モジュールから Collections Abstract Base Classes の非推奨のエイリアスを削除します。 (:issue: `37324` でVictorStinnerによって寄稿されました。)

  • loopパラメーターは、Python 3.8での非推奨に伴い、 asyncio高レベルAPI のほとんどから削除されました。 この変更の背後にある動機は複数あります。

    1. これにより、高レベルのAPIが簡素化されます。

    2. 高レベルAPIの関数は、Python 3.7以降、現在のスレッドの実行中のイベントループを暗黙的に取得しています。 ほとんどの通常のユースケースでは、イベントループをAPIに渡す必要はありません。

    3. イベントループの受け渡しは、特に異なるスレッドで実行されているループを処理する場合にエラーが発生しやすくなります。

    低レベルAPIは引き続きloopを受け入れることに注意してください。 既存のコードを置き換える方法の例については、 Python API の変更を参照してください。

    :issue: `42392` で、Yurii Karabas、Andrew Svetlov、Yury Selivanov、Kyle Stanleyによって寄稿されました。)


Python3.10への移植

このセクションでは、コードの変更が必要になる可能性のある、前述の変更とその他のバグ修正を示します。

Python構文の変更

  • 数値リテラルの直後にキーワードが続く場合(0in xのように)、以前に有効な構文をコンパイルするときに非推奨の警告が発行されるようになりました。 将来のリリースでは、構文警告に変更され、最終的に構文エラーに変更されます。 警告を取り除き、コードを将来のリリースと互換性を持たせるには、数値リテラルと次のキーワードの間にスペースを追加するだけです。 (:issue: `43833` のSerhiyStorchakaによる寄稿)。


PythonAPIの変更

  • tracebackformat_exception()format_exception_only()、および print_exception()関数の etype パラメーター]モジュールの名前が exc に変更されました。 (:issue: `26389` でZackerySpytzとMatthiasBussonnierによって寄稿されました。)

  • atexit :Pythonの終了時に、 atexit.register()に登録されたコールバックが失敗した場合、その例外がログに記録されるようになりました。 以前は、一部の例外のみがログに記録され、最後の例外は常にサイレントに無視されていました。 (:issue: `42639` でVictorStinnerによって寄稿されました。)

  • collections.abc.Callable ジェネリックは、 typing.Callable が現在行っているのと同様に、型パラメーターをフラット化するようになりました。 これは、collections.abc.Callable[[int, str], str](int, str, str)__args__を持つことを意味します。 以前は([int, str], str)でした。 typing.get_args()または__args__を介して引数にアクセスするコードは、この変更を考慮する必要があります。 さらに、 TypeError は、Python3.9でサイレントに渡された可能性のある無効な形式のパラメーター化 collections.abc.Callable に対して発生する可能性があります。 (:issue: `42195` でKenJinによって寄稿されました。)

  • socket.htons()および socket.ntohs()は、指定されたパラメーターが16ビットの符号なし整数。 (ErlendEによる寄稿。 のAasland:issue: `42393` 。)

  • loopパラメーターは、Python 3.8での非推奨に伴い、 asyncio高レベルAPI のほとんどから削除されました。

    現在次のようなコルーチン:

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

    これに置き換える必要があります:

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

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

    :issue: `42392` で、Yurii Karabas、Andrew Svetlov、Yury Selivanov、Kyle Stanleyによって寄稿されました。)

  • types.FunctionType コンストラクターは、{"None": None}をビルトインとして使用するのではなく、 globals ディクショナリに"__builtins__"キーがない場合、現在のビルトインを継承するようになりました。同じ動作 eval()および exec()関数として。 Pythonでdef function(...): ...を使用して関数を定義しても影響はありません。この構文でグローバルをオーバーライドすることはできません。また、現在の組み込み関数も継承します。 (:issue: `42990` でVictorStinnerによって寄稿されました。)


CAPIの変更

  • C API関数PyParser_SimpleParseStringFlagsPyParser_SimpleParseStringFlagsFilenamePyParser_SimpleParseFileFlagsPyNode_Compile、およびこれらの関数で使用されるタイプstruct _nodeは、次の理由で削除されました。新しいPEGパーサーへの切り替え。

    これで、たとえば Py_CompileString()を使用して、ソースをコードオブジェクトに直接コンパイルする必要があります。 結果のコードオブジェクトは、たとえば PyEval_EvalCode()を使用して評価できます。

    具体的には:

    • PyParser_SimpleParseStringFlagsの後にPyNode_Compileを呼び出すと、 Py_CompileString()を呼び出すことで置き換えることができます。

    • PyParser_SimpleParseFileFlagsの直接の代替品はありません。 FILE *引数からコードをコンパイルするには、Cでファイルを読み取り、結果のバッファーを Py_CompileString()に渡す必要があります。

    • char *ファイル名を指定してファイルをコンパイルするには、ファイルを明示的に開き、それを読み取って結果をコンパイルします。 これを行う1つの方法は、 PyImport_ImportModule()PyObject_CallMethod()PyBytes_AsString()、および io モジュールを使用することです。以下にスケッチするように、Py_CompileString()。 (宣言とエラー処理は省略されています。)

      io_module = Import_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);
    • FrameObjectオブジェクトの場合、f_lastiメンバーは、バイトコード文字列への単純なオフセットではなく、ワードコードオフセットを表すようになりました。 つまり、代わりにバイトオフセットを期待するAPI( PyCode_Addr2Line()など)で使用するには、この数値に2を掛ける必要があります。 FrameObjectオブジェクトのf_lastiメンバーは安定しているとは見なされないことにも注意してください。代わりに PyFrame_GetLineNumber()を使用してください。


CPythonバイトコードの変更

  • MAKE_FUNCTION命令は、関数の注釈としてdictまたは文字列のタプルのいずれかを受け入れるようになりました。 (:issue: `42202` でYuriiKarabasとInadaNaokiによって寄稿されました)


ビルドの変更

  • PEP 644 :PythonでOpenSSL1.1.1以降が必要になりました。 OpenSSL1.0.2はサポートされなくなりました。 (:issue: `43669` のChristianHeimesによる寄稿。)

  • Pythonをビルドするには、C99関数snprintf()およびvsnprintf()が必要になりました。 (:issue: `36020` でVictorStinnerによって寄稿されました。)

  • sqlite3 にはSQLite3.7.15以降が必要です。 (SergeyFedoseevとErlendEによる寄稿。 Aasland :issue: `40744` および:issue:` 40810` 。)

  • atexit モジュールは、常に組み込みモジュールとして構築する必要があります。 (:issue: `42639` でVictorStinnerによって寄稿されました。)

  • -disable-test-modules オプションをconfigureスクリプトに追加します。テストモジュールをビルドまたはインストールしないでください。 (:issue: `27640` のXavierde Gaye、Thomas Petazzoni、Peixing Xinによる寄稿。)

  • -with-wheel-pkg-dir = PATHオプション./configureスクリプトに追加します。 指定した場合、 surepip モジュールはこのディレクトリでsetuptoolsおよびpipホイールパッケージを検索します。両方が存在する場合、ensurepipバンドルホイールパッケージの代わりにこれらのホイールパッケージが使用されます。

    一部のLinuxディストリビューションパッケージポリシーでは、依存関係をバンドルしないことを推奨しています。 たとえば、Fedoraは/usr/share/python-wheels/ディレクトリにホイールパッケージをインストールし、ensurepip._bundledパッケージはインストールしません。

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

  • 新しい configure --without-static-libpythonオプションを追加して、libpythonMAJOR.MINOR.a静的ライブラリをビルドせず、python.oオブジェクトファイルをインストールしないようにします。

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

  • configureスクリプトは、pkg-configユーティリティ(使用可能な場合)を使用して、Tcl / Tkヘッダーとライブラリの場所を検出するようになりました。 以前と同様に、これらの場所は、 --with-tcltk-includes および-with-tcltk-libs 構成オプションで明示的に指定できます。 (:issue: `42603` のManolisStamatogiannakisによる寄稿。)

  • -with-openssl-rpath オプションをconfigureスクリプトに追加します。 このオプションは、カスタムOpenSSLインストールを使用したPythonのビルドを簡素化します。 ./configure --with-openssl=/path/to/openssl --with-openssl-rpath=auto。 (:issue: `43466` のChristianHeimesによる寄稿。)


CAPIの変更

PEP 652:安定したABIの維持

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

PEP 652 および:issue: `43795` でPetrViktorinによって寄稿されました。)


新機能


Python3.10への移植

  • PY_SSIZE_T_CLEANマクロは PyArg_ParseTuple()および Py_BuildValue()形式を使用するように定義する必要があります。#es#et#s#u#y#z#U#Z#引数の解析と値の構築および PEP 353 を参照してください。 (:issue: `40943` でVictorStinnerによって寄稿されました。)

  • Py_REFCNT()はインライン静的関数に変更されているため、Py_REFCNT(obj) = new_refcntPy_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

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

  • GIL を保持せずに PyDict_GetItem()を呼び出すことは、歴史的な理由から許可されていました。 許可されなくなりました。 (:issue: `40839` でVictorStinnerによって寄稿されました。)

  • PyUnicode_FromUnicode(NULL, size)PyUnicode_FromStringAndSize(NULL, size)DeprecationWarningをレイズします。 PyUnicode_New()を使用して、初期データなしでUnicodeオブジェクトを割り当てます。 (:issue: `36346` で稲田直樹によって寄稿されました。)

  • PyCapsule API unicodedata.ucnhash_CAPIのプライベート_PyUnicode_Name_CAPI構造は、内部CAPIに移動されました。 (:issue: `42157` でVictorStinnerによって寄稿されました。)

  • Py_GetPath()Py_GetPrefix()Py_GetExecPrefix()Py_GetProgramFullPath()Py_GetPythonHome() Py_GetProgramName()関数は、 Py_Initialize()の前(Pythonが初期化される前)に呼び出された場合にNULLを返すようになりました。 新しい Python初期化構成API を使用して、 Pythonパス構成を取得します。。 (:issue: `42260` でVictorStinnerによって寄稿されました。)

  • PyList_SET_ITEM()PyTuple_SET_ITEM()、および PyCell_SET()マクロは、l値またはr値として使用できなくなりました。 たとえば、x = PyList_SET_ITEM(a, b, c)PyList_SET_ITEM(a, b, c) = xはコンパイラエラーで失敗するようになりました。 if (PyList_SET_ITEM (a, b, c) < 0) ...テストのようなバグを防ぎます。 (:issue: `30459` でZackerySpytzとVictorStinnerによって寄稿されました。)

  • 無制限のAPIファイルodictobject.hparser_interface.hpicklebufobject.hpyarena.hpyctype.hpydebug.h、[X92X ] およびpytime.hInclude/cpythonディレクトリに移動されました。 これらのファイルはPython.hにすでに含まれているため、直接含めることはできません:ファイルを含める。 それらが直接含まれている場合は、代わりにPython.hを含めることを検討してください。 (:issue: `35134` のNicholasSimによる寄稿)

  • Py_TPFLAGS_IMMUTABLETYPE型フラグを使用して、不変型オブジェクトを作成します。 型オブジェクトが可変であるかどうかを判断するためにPy_TPFLAGS_HEAPTYPEに依存しないでください。 代わりにPy_TPFLAGS_IMMUTABLETYPEが設定されているか確認してください。 (VictorStinnerとErlendEによる寄稿。 のAasland:issue: `43908` 。)

  • 文書化されていない関数Py_FrozenMainは制限付きAPIから削除されました。 この関数は、主にPythonのカスタムビルドに役立ちます。 (:issue: `26241` のPetrViktorinによる寄稿)


非推奨

  • PyUnicode_InternImmortal()関数は非推奨になり、Python3.12で削除されます。代わりに PyUnicode_InternInPlace()を使用してください。 (:issue: `41692` でVictorStinnerによって寄稿されました。)


NS

  • Py_UNICODE*文字列を操作するPy_UNICODE_str*関数を削除しました。 (:issue: `41123` で稲田直樹によって寄稿されました。)


  • PyUnicode_GetMax()を削除しました。 新しい( PEP 393 )APIに移行してください。 (:issue: `41103` で稲田直樹によって寄稿されました。)

  • PyLong_FromUnicode()を削除しました。 PyLong_FromUnicodeObject()に移行してください。 (:issue: `41103` で稲田直樹によって寄稿されました。)

  • PyUnicode_AsUnicodeCopy()を削除しました。 PyUnicode_AsUCS4Copy()または PyUnicode_AsWideCharString()を使用してください(:issue: `41103` の稲田直樹による寄稿)。

  • _Py_CheckRecursionLimit変数を削除しました: PyInterpreterState 構造のceval.recursion_limitに置き換えられました。 (:issue: `41834` でVictorStinnerによって寄稿されました。)

  • 文書化されていないマクロPy_ALLOW_RECURSIONPy_END_ALLOW_RECURSION、および PyInterpreterState 構造のrecursion_criticalフィールドを削除しました。 (:issue: `41936` のSerhiyStorchakaによる寄稿。)

  • 文書化されていないPyOS_InitInterrupts()関数を削除しました。 Pythonを初期化すると、すでに暗黙的にシグナルハンドラーがインストールされています。 PyConfig.install_signal_handlers を参照してください。 (:issue: `41713` でVictorStinnerによって寄稿されました。)

  • PyAST_Validate()機能を削除します。 パブリックCAPIを使用してASTオブジェクト(mod_tyタイプ)を構築することはできなくなりました。 この関数は、制限されたC API( PEP 384 )からすでに除外されています。 (:issue: `43244` でVictorStinnerによって寄稿されました。)

  • symtable.hヘッダーファイルと文書化されていない関数を削除します。

    • PyST_GetScope()

    • PySymtable_Build()

    • PySymtable_BuildObject()

    • PySymtable_Free()

    • Py_SymtableString()

    • Py_SymtableStringObject()

    Py_SymtableString()関数は誤って安定したABIの一部でしたが、symtable.hヘッダーファイルが制限されたCAPIから除外されたため、使用できませんでした。

    代わりにPython symtable モジュールを使用してください。 (:issue: `43244` でVictorStinnerによって寄稿されました。)

  • PyOS_ReadlineFunctionPointer()を、制限されたC APIヘッダーと、Windowsで安定したABIを提供するライブラリであるpython3.dllから削除します。 この関数はFILE*引数を取るため、ABIの安定性は保証されません。 (:issue: `43868` のPetrViktorinによる寄稿。)

  • ast.hasdl.h、およびPython-ast.hヘッダーファイルを削除します。 これらの関数は文書化されておらず、制限されたCAPIから除外されていました。 これらのヘッダーファイルで定義されているほとんどの名前には、Pyというプレフィックスが付いていないため、名前の競合が発生する可能性があります。 たとえば、Python-ast.hは、Windows <winbase.h>ヘッダーで使用されるYield名と競合するYieldマクロを定義しました。 代わりに、Python ast モジュールを使用してください。 (:issue: `43244` でVictorStinnerによって寄稿されました。)

  • パブリックASTC APIが削除されたため、struct _modタイプを使用してコンパイラー関数とパーサー関数を削除します。

    • PyAST_Compile()

    • PyAST_CompileEx()

    • PyAST_CompileObject()

    • PyFuture_FromAST()

    • PyFuture_FromASTObject()

    • PyParser_ASTFromFile()

    • PyParser_ASTFromFileObject()

    • PyParser_ASTFromFilename()

    • PyParser_ASTFromString()

    • PyParser_ASTFromStringObject()

    これらの関数は文書化されておらず、制限されたCAPIから除外されていました。 (:issue: `43244` でVictorStinnerによって寄稿されました。)

  • 次の関数を使用してpyarena.hヘッダーファイルを削除します。

    • PyArena_New()

    • PyArena_Free()

    • PyArena_Malloc()

    • PyArena_AddPyObject()

    これらの関数は文書化されておらず、制限されたC APIから除外されており、コンパイラーによって内部的にのみ使用されていました。 (:issue: `43244` でVictorStinnerによって寄稿されました。)

  • PyThreadState.use_tracingメンバーは、Pythonを最適化するために削除されました。 (:issue: `43760` でMarkShannonによって寄稿されました。)