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, デバッグおよびその他のツール用の正確な行番号。
新しい型ヒントの機能:
重要な非推奨化、削除または制限:
新しい機能¶
カッコ内のコンテキストマネージャー¶
コンテキストマネージャーを複数行で継続して記述する場合に、カッコで囲むことができるようになりました。複数行でたくさんのコンテキストマネージャーを記述するときに、従来の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 ブロックで指定されたパターンと順に比較します。具体的には、パターンマッチングは次の手順で動作します:
型と構造を持つデータ(
subject)を使用するmatch文内でsubjectを評価するcase文の各パターンと上から順に比較し、一致が確認されるまで進める一致が確認されたパターンに関連付けられた処理を実行する
完全一致するパターンがない場合、最後にワイルドカード
_が指定されていれば、それが一致ケースとして使用されます。完全一致もワイルドカードも存在しない場合、 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 を追加しました。
詳しくは テキストのエンコーディング を参照してください。
その他の言語変更¶
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 で指定されている静的型チェッカーの動作に合わせました。
Literalがパラメータの重複を取り除くようになりました。Literalオブジェクト間の等価性比較が、順序に依存しなくなりました。Literalの比較が型を区別するようになりました。 例えばLiteral[0] == Literal[False]は以前Trueでしたが、今はFalseになります。 この変更を実現するため、内部の型キャッシュも型を区別するようになりました。Literalオブジェクトの等価性比較では、いずれかのパラメータが hashable でない場合にTypeError例外を送出するようになりました。 ハッシュ不可能なパラメータでLiteralを宣言するだけならエラーにはなりません。>>> from typing import Literal >>> Literal[{0}] >>> Literal[{0}] == Literal[{False}] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: unhashable type: 'set'
(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 forexec_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(), andimportlib.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.namethreading.Thread.getName=>threading.Thread.namethreading.Thread.isDaemon=>threading.Thread.daemonthreading.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パラメータを削除しました。 この変更にはいくつかの理由があります:高水準 API が単純になります。
高水準 API の関数は、Python 3.7 以降、現在のスレッドで実行中のイベントループを暗黙に取得しています。 通常の使用例の大半では、API にイベントループを渡す必要はありません。
特に異なるスレッドで実行するループを扱う場合、イベントループを渡す方法は誤りを招きやすくなります。
低水準 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
FrameObjectobjects, thef_lastimember 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 (likePyCode_Addr2Line()for example). Notice as well that thef_lastimember ofFrameObjectobjects is not considered stable: please usePyFrame_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 を使う際のベストプラクティスを説明しています。
新しい機能¶
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。)