What's New In Python 3.7¶
- 編集者:
Elvis Pranskevichus <elvis@magic.io>
この記事では Python 3.6 と比較した Python 3.7 の新機能を解説します。Python 3.7 は2018年6月27日にリリースされました。全詳細については 変更履歴 をご覧ください。
概要 -- リリースハイライト¶
新たな文法機能:
PEP 563 、型アノテーションの評価の遅延。
後方非互換な文法の変更:
新たなライブラリモジュール:
新たな組み込み機能:
PEP 553 、新しい
breakpoint()関数。
Python のデータモデルの改善:
PEP 562 、モジュール属性へのアクセスのカスタマイズ。
PEP 560 、typing モジュールとジェネリック型に対する言語コアによるサポート。
dict オブジェクトの挿入順序を保存するという性質が、公式に Python 言語仕様の一部であると 宣言されました 。
標準ライブラリーの顕著な改善
asyncioモジュールに新しい機能が加わりました。 顕著な 使い勝手とパフォーマンスの改善 です。timeモジュールが ナノ秒単位の分解能を持つ関数 をサポートするようになりました。
CPython の実装の改善:
デフォルトのテキストエンコーディングとして ASCII を使わなくなりました:
PEP 552 、決定論的な .pyc
PEP 565 、
DeprecationWarningの取り扱いの改善
C API の改善:
PEP 539 、スレッドローカルなストレージのための新しい C API
ドキュメントの改善:
このリリースの特色は、多くの領域での特筆すべきパフォーマンスの改善です。 最適化 節に詳細な一覧があります。
1つ前にリリースされた Python との互換性に影響を持つ変更の一覧については、 Python 3.7 への移植 節を参照してください。
新しい機能¶
PEP 563: アノテーションの遅延評価¶
Python における型ヒントの到来により、 PEP 3107 で追加され PEP 526 でさらに改善されたアノテーションの機能について、使い勝手に関する 2 つの明白な問題が明らかになりました:
アノテーションには現在のスコープで既に使える状態になっている名前しか使えない。言い換えれば、どんな種類の前方参照もサポートしない。
ソースコードに注釈を付けるのは Python プログラムの起動時間に好ましくない影響がある。
これらの問題はどちらもアノテーションの評価を遅延することで解決します。
アノテーションの定義時に、アノテーションに含まれる式を評価するコードをコンパイルする代わりに、コンパイラは当該の式の AST と同等な文字列形式でアノテーションを保存します。
必要であれば、 typing.get_type_hints() を使って実行時にアノテーションを解決できます。
たいていのケースではその必要は無く、(短い文字列はインタプリタによって格納されるので) アノテーションを保存するコストはより安くなり、起動時間がより速くなります。
使い勝手の点では、アノテーションは前方参照をサポートするようになり、次の文法が妥当なものになりました:
class C:
@classmethod
def from_string(cls, source: str) -> C:
...
def validate_b(self, obj: B) -> bool:
...
class B:
...
この変更は後方互換性を壊してしまうので、新しい振る舞いは Python 3.7 では __future__ インポートを使いモジュールごとに有効化する必要があります:
from __future__ import annotations
この振る舞いは Python 3.10 でデフォルトになります。
参考
- PEP 563 -- アノテーションの遅延評価
PEP written and implemented by Łukasz Langa.
PEP 538: レガシーな C ロケールの抑圧¶
Python 3 シリーズにおける継続中の課題の一つは、非 Windows プラットフォームではデフォルトの C ロケールつまり POSIX ロケールの使用から現在のところ必然的に導かれてしまう "7-bit ASCII" テキストエンコーディングの仮定を取り扱う賢明なデフォルトの方針を決定することです。
PEP 538 はインタープリタのデフォルトのコマンドラインインターフェースを更新し、新しく加わった PYTHONCOERCECLOCALE 環境変数のドキュメントにある通り、自動的にロケールを UTF-8 に基づいた利用可能なロケールへ強制します。
この方法で LC_CTYPE を自動的に設定すると、コアのインタープリタと (readline などの) ロケールを考慮する C 拡張はデフォルトのテキストエンコーディングとして ASCII ではなく UTF-8 を使うことになります。
PEP 11 にあるプラットフォームのサポート定義も、適切に設定された非 ASCII に基づくロケールだけにテキスト処理の完全なサポートを制限するよう更新されました。
この変更の一部として、強制対象として定義されたのロケール (現時点では C.UTF-8, C.utf8, UTF-8) を使っているときの stdin と stdout のデフォルトのエラーハンドラは (strict ではなく) surrogateescape になります。
stderr のデフォルトのエラーハンドラは、ロケールに関係無く引き続き backslashreplace です。
デフォルトではロケールの強制は暗黙に行われますが、ロケールが関係する結合における問題のデバッグを支援するために、 PYTHONCOERCECLOCALE=warn を設定することで (stderr に直接出力される) 明示的な警告を要求できます。
この設定を有効にしていると、コアのインタプリタの初期化時にレガシーな C ロケールが有効なままの場合、 Python 実行器が警告を出力します。
PEP 538 のロケール強制には、(非 Python アプリケーションや古いバージョンの Python で動くのも含めた) 子プロセスに加え (GNU readline などの) 影響を受ける拡張モジュールにも利益がある一方、適切な対象ロケールが実行するシステムに存在することを要求するという負の面もあります。
(例えば、RHEL/CentOS 7 で起きているように) 適切な対象ロケールで利用可能なものが無いケースにきちんと対処するために、 Python 3.7 には PEP 540: 強制 UTF-8 実行モード も実装されています。
参考
- PEP 538 -- レガシーな C ロケールから UTF-8 ベースのロケールへの強制
PEP written and implemented by Nick Coghlan.
PEP 540: 強制 UTF-8 実行モード¶
新しいコマンドラインオプション -X utf8 と環境変数 PYTHONUTF8 を使うと、Python UTF-8 モード を有効にできます。
UTF-8 モードでは CPython はロケール設定を無視し、デフォルトのエンコーディングに UTF-8 を使います。
sys.stdin と sys.stdout ストリームのエラーハンドラーは surrogateescape に設定されます。
UTF-8 モードを強制すると、埋め込み先のアプリケーションのロケール設定を変えずに、埋め込まれた Python インタープリタのテキスト処理の動作を変更できます。
While PEP 540's UTF-8 mode has the benefit of working regardless of which
locales are available on the running system, it has the downside of having no
effect on extension modules (such as GNU readline), child processes running
non-Python applications, and child processes running older versions of Python.
To reduce the risk of corrupting text data when communicating with such
components, Python 3.7 also implements PEP 540: 強制 UTF-8 実行モード).
ロケールが C または POSIX であり、PEP 538 のロケール強制変更機能で UTF-8 ベースのロケールに変更できなかった場合、UTF-8 モードはデフォルトで有効になります。
PYTHONCOERCECLOCALE=0 や LC_ALL が設定されている場合も、適切な変更先のロケールがない場合も同様です。
参考
- PEP 540 -- 新しい UTF-8 モードの追加
PEP written and implemented by Victor Stinner
PEP 553: 組み込みの breakpoint()¶
Python 3.7 には、 Python デバッガへ入って行くための簡単で一貫した手段である、新しい組み込みの breakpoint() 関数があります。
組み込みの breakpoint() は sys.breakpointhook() を呼び出します。
デフォルトでは pdb をインポートして pdb.set_trace() を呼び出しますが、sys.breakpointhook() に好きな関数を割り当てることで、breakpoint() から任意のデバッガーを起動できます。
環境変数 PYTHONBREAKPOINT に、使いたいデバッガーの呼び出し可能オブジェクトを指定することもできます。
組み込みの breakpoint() を完全に無効化するには PYTHONBREAKPOINT=0 を設定します。
参考
- PEP 553 -- 組み込みの breakpoint()
PEP written and implemented by Barry Warsaw
PEP 539: スレッドローカルストレージのための新しい C API¶
Python はスレッドローカルストレージをサポートする C API を提供していますが、既存の Thread Local Storage (TLS) API は、すべてのプラットフォームで TLS キーを int で表していました。 公式にサポートするプラットフォームでは通常問題になりませんでしたが、POSIX 準拠ではなく、実用的な意味で移植性があるともいえません。
PEP 539 は新しい Thread Specific Storage (TSS) API を CPython に提供し、インタープリタ内部の既存 TLS API の使用を置き換え、既存の API を非推奨にします。
TSS API はキーを int ではなく新しい Py_tss_t 型で表します。
これは内部の TLS 実装によって定義が異なる可能性のある不透明な型です。
そのため、ネイティブの TLS キーを安全に int にキャストできないプラットフォームでも CPython をビルドできるようになります。
ネイティブの TLS キーを安全に int にキャストできないプラットフォームでは、既存の TLS API のすべての関数は何もせず、直ちに失敗を返すことに注意してください。 これは、旧 API を確実に使えないプラットフォームではサポートしないこと、また今後も対応しないことを明確に示すものです。
参考
- PEP 539 -- CPython のスレッドローカルストレージ用の新しい C API
PEP の執筆は Erik M. Bray、実装は Masayuki Yamamoto。
PEP 562: モジュール属性へのアクセスのカスタマイズ¶
Python 3.7 ではモジュールに __getattr__() を定義でき、ほかの方法でモジュールの属性が見つからないときに呼び出されます。
モジュールに __dir__() を定義することも可能になりました。
この機能が役に立つ典型的な実例はモジュール属性の非推奨化と遅延読み込みです。
参考
- PEP 562 -- モジュールの
__getattr__と__dir__ PEP written and implemented by Ivan Levkivskyi
PEP 564: ナノ秒単位の分解能を持つ新しい時間関数¶
現代のシステムの時計の分解能は、time.time() とその類似関数が返す浮動小数点数の限られた精度を超えることがあります。
精度の損失を避けるため、PEP 564 は既存の時刻関数に対応する次の六つの「ナノ秒」版を time モジュールに追加します:
新しい関数は、整数値としてナノ秒単位の数値を返します。
測定結果 によると、Linux と Windows で time.time_ns() の分解能は time.time() の約 3 倍高くなります。
参考
- PEP 564 -- ナノ秒単位の分解能を持つ新しい時間関数の追加
PEP written and implemented by Victor Stinner
PEP 565: __main__ で DeprecationWarning を表示¶
DeprecationWarning のデフォルトの扱いが変更され、警告を発生させるコードが __main__ モジュール内で直接実行されている場合に限り、再びデフォルトで表示されるようになりました。
その結果、単一ファイルのスクリプトを書く開発者や Python を対話的に使う開発者は、使っている API の非推奨警告を再び目にするようになります。
一方、インポートされたアプリケーション、ライブラリ、フレームワークのモジュールから発生する非推奨警告は、引き続きデフォルトでは表示されません。
この変更により、標準ライブラリでは開発者が次の三つの非推奨警告の動作を選べるようになりました:
FutureWarning: デフォルトで常に表示されます。 アプリケーションのエンドユーザー向けの警告 (例えば非推奨のアプリケーション設定) に推奨されます。DeprecationWarning: デフォルトでは__main__とテスト実行時にのみ表示されます。 バージョンアップによって動作が変わったりエラーが発生したりする場合に、ほかの Python 開発者に示す警告として推奨されます。PendingDeprecationWarning: デフォルトではテスト実行時にのみ表示されます。 将来のバージョンアップで警告カテゴリをDeprecationWarningまたはFutureWarningに変更する予定の場合に使います。
以前は DeprecationWarning と PendingDeprecationWarning のどちらもテスト実行時にしか表示されませんでした。
そのため、主に単一ファイルのスクリプトを書いたり Python を対話的に使ったりする開発者は、使っている API の互換性を損なう変更に不意を突かれることがありました。
参考
- PEP 565 --
__main__で DeprecationWarning を表示 PEP written and implemented by Nick Coghlan
PEP 560: typing モジュールとジェネリック型に対する言語コアによるサポート¶
当初 PEP 484 は CPython インタープリタの中核に 一切 変更を加えないよう設計されていました。
現在は型ヒントと typing モジュールがコミュニティで広く使われているため、この制限は撤廃されました。
この PEP は __class_getitem__() と __mro_entries__() という二つの特殊メソッドを導入し、typing のほとんどのクラスや特殊な構成要素がこれらを使うようになりました。
その結果、型に対する各種操作が最大 7 倍高速になり、メタクラスの競合なしにジェネリック型を使えるようになり、typing モジュールの長年のバグもいくつか修正されました。
参考
- PEP 560 -- typing モジュールとジェネリック型に対する言語コアによるサポート
PEP written and implemented by Ivan Levkivskyi
PEP 552: ハッシュベースの .pyc ファイル¶
Python は従来、ソースのメタデータ (最終更新日時とサイズ) を、バイトコードのキャッシュファイル (.pyc ファイル) の生成時にヘッダーに保存したメタデータと比較し、キャッシュが最新かを検査していました。
この無効化方式は有効ですが欠点もあります。
ファイルシステムのタイムスタンプの粒度が粗すぎると、ソースの更新を見落としてユーザーを混乱させることがあります。
また、キャッシュファイル内のタイムスタンプは、再現可能なビルド や内容に基づくビルドシステムにとっても問題になります。
PEP 552 は pyc 形式を拡張し、ソースのタイムスタンプの代わりにソースファイルのハッシュを無効化の判断に使えるようにします。
この .pyc ファイルを「ハッシュベース」と呼びます。
デフォルトでは Python は引き続きタイムスタンプによる無効化を使い、実行時にはハッシュベースの .pyc を生成しません。
ハッシュベースの .pyc ファイルは py_compile または compileall で生成できます。
ハッシュベースの .pyc ファイルには、検査付きと検査なしの 2 種類があります。
Python は実行時に検査付きのファイルを対応するソースファイルと照合しますが、検査なしの場合は照合しません。
検査なしのハッシュベース .pyc ファイルは、ビルドシステムなど Python 外部のシステムが .pyc を最新に保つ責任を持つ環境で、性能の最適化に役立ちます。
詳しくは キャッシュされたバイトコードの無効化 を参照してください。
参考
- PEP 552 -- 決定的な pyc ファイル
PEP written and implemented by Benjamin Peterson
PEP 545: Python ドキュメントの翻訳¶
PEP 545 は Python ドキュメントの翻訳を作成し、保守する手順を定めます。
三つの新しい翻訳が追加されました:
フランス語: https://docs.python.org/fr/
参考
- PEP 545 -- Python ドキュメント翻訳
PEP written and implemented by Julien Palard, Inada Naoki, and Victor Stinner.
Python 開発モード (-X dev)¶
新しいコマンドラインオプション -X dev または環境変数 PYTHONDEVMODE で Python 開発モード を有効にできます。
開発モードでは、デフォルトで有効にするにはコストが高すぎる追加の実行時検査を行います。
詳しい説明は Python 開発モード のドキュメントを参照してください。
その他の言語変更¶
実装上の問題により、フォーマット済み文字列リテラル 内の式では
await式とasync for節を含む内包表記を使えませんでした。 Python 3.7 ではこの制限がなくなりました。関数に 255 個を超える引数を渡せるようになり、関数を 255 個を超えるパラメータで定義することも可能になりました。 (Contributed by Serhiy Storchaka in bpo-12844 and bpo-18896.)
bytes.fromhex()とbytearray.fromhex()は、スペースだけでなくすべての ASCII 空白文字を無視するようになりました。 (Contributed by Robert Xiao in bpo-28927.)str、bytes、bytearrayにisascii()メソッドが追加され、文字列やバイト列が ASCII 文字だけを含むか検査できるようになりました。 (Contributed by INADA Naoki in bpo-32677.)from ... import ...が失敗したとき、ImportErrorにモジュール名とモジュールの__file__パスが表示されるようになりました。 (Contributed by Matthias Bussonnier in bpo-29546.)サブモジュールを名前に束縛する絶対インポートを含む循環インポートをサポートしました。 (Contributed by Serhiy Storchaka in bpo-30024.)
object.__format__(x, '')はformat(str(self), '')ではなくstr(x)と等価になりました。 (Contributed by Serhiy Storchaka in bpo-28974.)スタックトレースの動的な作成をよりよくサポートするため、
types.TracebackTypeを Python コードからインスタンス化できるようになりました。 また トレースバック のtb_next属性が書き込み可能になりました。 (Contributed by Nathaniel J. Smith in bpo-30579.)-mオプションを使うとき、sys.path[0]を空のディレクトリ名のままにせず、起動時のディレクトリの完全なパスに直ちに展開するようになりました。 空のディレクトリ名では、インポートが行われる時点の 現在の 作業ディレクトリからインポートできていました。 (Contributed by Nick Coghlan in bpo-33053.)新しい
-Ximporttimeオプションまたは環境変数PYTHONPROFILEIMPORTTIMEで、各モジュールのインポートにかかった時間を表示できます。 (Contributed by Inada Naoki in bpo-31415.)
新たなモジュール¶
contextvars¶
新しい contextvars モジュールと一連の 新しい C API により、コンテキスト変数 をサポートしました。
コンテキスト変数は概念的にはスレッドローカル変数に似ていますが、TLS と異なり非同期コードも正しくサポートします。
asyncio と decimal モジュールが更新され、追加の設定なしでコンテキスト変数を使用、サポートするようになりました。
特に、現在の decimal コンテキストがコンテキスト変数に保存されるようになり、非同期コードでも正しいコンテキストで decimal の演算を行えます。
参考
- PEP 567 -- コンテキスト変数
PEP written and implemented by Yury Selivanov
データクラス¶
新しい @dataclass デコレータで データクラス を宣言できます。
データクラスはクラス変数のアノテーションで属性を記述します。
コンストラクタや __repr__()、__eq__()、__hash__() などの特殊メソッドは自動生成されます。
以下はプログラム例です:
@dataclass
class Point:
x: float
y: float
z: float = 0.0
p = Point(1.5, 2.5)
print(p) # 次を出力: "Point(x=1.5, y=2.5, z=0.0)"
参考
- PEP 557 -- データクラス
PEP written and implemented by Eric V. Smith
importlib.resources¶
新しい importlib.resources モジュールは、パッケージ内の リソース にアクセスし、開き、読み込むための複数の API と一つの ABC を提供します。
リソースはおおむねパッケージ内のファイルに似ていますが、物理的なファイルシステム上の実ファイルである必要はありません。
モジュールローダーは importlib.abc.ResourceReader インスタンスを返す get_resource_reader() 関数を提供することで、この新しい API に対応できます。
組み込みのファイルパスローダーと ZIP ファイルローダーはどちらも対応しています。
Contributed by Barry Warsaw and Brett Cannon in bpo-32248.
参考
importlib_resources -- 古い Python バージョン向けの PyPI バックポート。
改良されたモジュール¶
argparse¶
新しい ArgumentParser.parse_intermixed_args() メソッドを使うと、オプションと位置引数を混在させられます。
(Contributed by paul.j3 in bpo-14191.)
asyncio¶
asyncio モジュールに多くの新機能が追加され、使いやすさと 性能が改善されました。
注目すべき変更は次のとおりです:
新しい 暫定的 な
asyncio.run()関数を使うと、イベントループを自動的に作成、破棄して、同期コードからコルーチンを実行できます。 (Contributed by Yury Selivanov in bpo-32314.)asyncio が
contextvarsに対応しました。loop.call_soon()、loop.call_soon_threadsafe()、loop.call_later()、loop.call_at()、Future.add_done_callback()に、省略可能なキーワード専用パラメータ context が追加されました。タスクは自分のコンテキストを自動的に追跡します。 詳しくは PEP 567 を参照してください。 (Contributed by Yury Selivanov in bpo-32436.)asyncio.get_event_loop().create_task()の省略形としてasyncio.create_task()関数が追加されました。 (Contributed by Andrew Svetlov in bpo-32311.)新しい
loop.start_tls()メソッドを使うと、既存の接続を TLS に切り替えられます。 (Contributed by Yury Selivanov in bpo-23749.)新しい
loop.sock_recv_into()メソッドで、ソケットから指定のバッファへ直接データを読み込めるため、データのコピーを減らせます。 (Contributed by Antoine Pitrou in bpo-31819.)The new
asyncio.current_task()function returns the currently runningTaskinstance, and the newasyncio.all_tasks()function returns a set of all existingTaskinstances in a given loop. TheTask.current_task()andTask.all_tasks()methods have been deprecated. (Contributed by Andrew Svetlov in bpo-32250.)新しい 暫定的 な
BufferedProtocolクラスを使うと、受信バッファを手動で制御するストリーミングプロトコルを実装できます。 (Contributed by Yury Selivanov in bpo-32251.)新しい
asyncio.get_running_loop()関数は現在実行中のループを返し、実行中のループがなければRuntimeErrorを送出します。 実行中のループがなければ新しいイベントループを 作成するasyncio.get_event_loop()とは異なります。 (Contributed by Yury Selivanov in bpo-32269.)新しいコルーチンメソッド
StreamWriter.wait_closed()で、ストリームライターが閉じられるまで待機できます。 新しいStreamWriter.is_closing()メソッドは、ライターが終了処理中かどうかを調べます。 (Contributed by Andrew Svetlov in bpo-32391.)新しいコルーチンメソッド
loop.sock_sendfile()は、利用可能であればos.sendfileを使ってファイルを送信します。 (Contributed by Andrew Svetlov in bpo-32410.)新しい
Future.get_loop()とTask.get_loop()メソッドは、タスクや Future が作成されたループのインスタンスを返します。asyncio.ServerオブジェクトではServer.get_loop()で同じことができます。 (Contributed by Yury Selivanov in bpo-32415 and Srinivas Reddy Thatiparthy in bpo-32418.)asyncio.Serverインスタンスが接続の受け付けを開始するタイミングを制御できるようになりました。 以前はサーバーの作成直後に受け付けを開始していました。loop.create_server()とloop.create_unix_server()の新しい start_serving キーワード引数や、Server.start_serving()、Server.serve_forever()を使うと、サーバーの作成と受け付けを分離できます。 新しいServer.is_serving()メソッドは、サーバーが接続を受け付けていればTrueを返します。Serverオブジェクトは非同期コンテキストマネージャーになりました。srv = await loop.create_server(...) async with srv: # 何らかの処理 # この時点で srv は閉じられており、新しい接続を受け付けない。
(Contributed by Yury Selivanov in bpo-32662.)
loop.call_later()が返すコールバックオブジェクトにwhen()メソッドが追加され、コールバックの実行予定の絶対タイムスタンプを返すようになりました。 (Contributed by Andrew Svetlov in bpo-32741.)The
loop.create_datagram_endpoint()method gained support for Unix sockets. (Contributed by Quentin Dawans in bpo-31245.)asyncio.open_connection()、asyncio.start_server()関数、loop.create_connection()、loop.create_server()、loop.create_accepted_socket()メソッド、および対応する UNIX ソケット版が ssl_handshake_timeout キーワード引数を受け付けるようになりました。 (Contributed by Neil Aspinall in bpo-29970.)新しい
Handle.cancelled()メソッドは、コールバックがキャンセルされていればTrueを返します。 (Contributed by Marat Sharafutdinov in bpo-31943.)asyncio のソースコードが
async/await構文を使うように書き換えられました。 (Contributed by Andrew Svetlov in bpo-32193.)新しい
ReadTransport.is_reading()メソッドで、トランスポートの読み込み状態を確認できます。 またReadTransport.resume_reading()とReadTransport.pause_reading()の呼び出しは冪等になりました。 (Contributed by Yury Selivanov in bpo-32356.)ソケットのパスを受け付けるループのメソッドに パス類オブジェクト を渡せるようになりました。 (Contributed by Yury Selivanov in bpo-32066.)
Linux の
asyncioの TCP ソケットは、デフォルトでTCP_NODELAYフラグを設定して作成されるようになりました。 (Contributed by Yury Selivanov and Victor Stinner in bpo-27456.)キャンセルされたタスクで発生した例外は、ログに記録されなくなりました。 (Contributed by Yury Selivanov in bpo-30508.)
WindowsSelectorEventLoopPolicyとWindowsProactorEventLoopPolicyクラスが追加されました。 (Contributed by Yury Selivanov in bpo-33792.)
いくつかの asyncio API が 非推奨になりました。
binascii¶
b2a_uu() 関数に省略可能な backtick キーワード引数が追加されました。
真の場合、ゼロは空白ではなく '`' で表されます。
(Contributed by Xiang Zhang in bpo-30103.)
calendar¶
HTMLCalendar クラスに、作成された HTML カレンダーの CSS クラスのカスタマイズを容易にするクラス属性が新しく加わりました。
(Contributed by Oz Tiram in bpo-30095.)
collections¶
collections.namedtuple() がデフォルト値をサポートするようになりました。
(Contributed by Raymond Hettinger in bpo-32320.)
compileall¶
compileall.compile_dir() に invalidation_mode パラメータが追加され、ハッシュベースの .pyc の無効化 を有効にできます。
コマンドラインからも新しい --invalidation-mode 引数で無効化方式を指定できます。
(Contributed by Benjamin Peterson in bpo-31650.)
concurrent.futures¶
ProcessPoolExecutor と ThreadPoolExecutor が新しいコンストラクタ引数 initializer と initargs をサポートするようになりました。
(Contributed by Antoine Pitrou in bpo-21423.)
ProcessPoolExecutor が新しい mp_context 引数を通して multiprocessing の context を受け取れるようになりました。
(Contributed by Thomas Moreau in bpo-31540.)
contextlib¶
新しい nullcontext() は、ExitStack より簡単で高速な、何もしないコンテキストマネージャーです。
(Contributed by Jesse-Bakker in bpo-10049.)
同期版に対応する @asynccontextmanager、AbstractAsyncContextManager、AsyncExitStack が追加されました。
(Contributed by Jelle Zijlstra in bpo-29679 and bpo-30241, and by Alexander Mohr and Ilya Kulakov in bpo-29302.)
cProfile¶
The cProfile command line now accepts -m module_name as an
alternative to script path. (Contributed by Sanyam Khurana in bpo-21862.)
crypt¶
crypt モジュールが Blowfish ハッシュ方式に対応しました。
(Contributed by Serhiy Storchaka in bpo-31664.)
mksalt() 関数で、ハッシュ計算のラウンド数を指定できるようになりました。
(Contributed by Serhiy Storchaka in bpo-31702.)
datetime¶
新しい datetime.fromisoformat() メソッドは、datetime.isoformat() が出力する形式の文字列から datetime オブジェクトを作成します。
(Contributed by Paul Ganssle in bpo-15873.)
tzinfo クラスが、1 分未満の単位のオフセットに対応しました。
(Contributed by Alexander Belopolsky in bpo-5288.)
dbm¶
dbm.dumb が読み取り専用ファイルの読み込みに対応し、インデックスファイルに変更がなければ書き込まないようになりました。
decimal¶
decimal モジュールが decimal コンテキストの保存に コンテキスト変数 を使うようになりました。
(Contributed by Yury Selivanov in bpo-32630.)
dis¶
dis() 関数が入れ子のコードオブジェクト (内包表記、ジェネレータ式、入れ子の関数のコードや、入れ子のクラスを作成するコード) を逆アセンブルできるようになりました。
再帰的な逆アセンブルの深さの上限は、新しい depth パラメータで制御します。
(Contributed by Serhiy Storchaka in bpo-11822.)
distutils¶
README.rst が distutils の標準 README のリストに追加され、ソース配布物に含まれるようになりました。
(Contributed by Ryan Gonzalez in bpo-11913.)
enum¶
Enum にクラスプロパティ _ignore_ が追加され、列挙型のメンバーにしないプロパティ名を列挙できるようになりました。
(Contributed by Ethan Furman in bpo-31801.)
Python 3.8 では、Enum クラスに Enum 以外のオブジェクトが含まれるかを調べる操作 (例えば 1 in Color) は TypeError を送出します。
同様に Flag のメンバーに Flag 以外のオブジェクトが含まれるかを調べる操作 (例えば 1 in Perm.RW) も TypeError を送出します。
現時点ではどちらの操作も False を返しますが、非推奨です。
(Contributed by Ethan Furman in bpo-33217.)
functools¶
@functools.singledispatch が型アノテーションを使った実装の登録に対応しました。
(Contributed by Łukasz Langa in bpo-32227.)
gc¶
新しい gc.freeze() 関数は、ガベージコレクタが追跡するすべてのオブジェクトを凍結し、以降の回収の対象から除外します。
POSIX の fork() の前に使うと、GC とコピーオンライトの相性をよくしたり、回収を高速化したりできます。
新しい gc.unfreeze() 関数はこの操作を元に戻します。
また gc.get_freeze_count() で凍結したオブジェクト数を取得できます。
(Contributed by Li Zekun in bpo-31558.)
hmac¶
hmac モジュールに最適化された単発計算用の digest() 関数が追加され、HMAC() より最大 3 倍高速に処理できます。
(Contributed by Christian Heimes in bpo-32433.)
http.client¶
HTTPConnection と HTTPSConnection に blocksize 引数が追加され、アップロードのスループットを改善できます。
(Contributed by Nir Soffer in bpo-31945.)
http.server¶
SimpleHTTPRequestHandler が HTTP の If-Modified-Since ヘッダーに対応しました。
対象ファイルがヘッダーで指定された時刻以降に変更されていなければ、サーバーは応答ステータス 304 を返します。
(Contributed by Pierre Quentel in bpo-29654.)
SimpleHTTPRequestHandler に directory 引数が追加され、コマンドラインにも --directory 引数が追加されました。
サーバーはこの引数で指定されたディレクトリを配信し、デフォルトでは現在の作業ディレクトリを使います。
(Contributed by Stéphane Wirtel and Julien Palard in bpo-28707.)
新しい ThreadingHTTPServer クラスは、ThreadingMixIn を使ってリクエストをスレッドで処理します。
http.server を -m で実行すると、このクラスが使われます。
(Contributed by Julien Palard in bpo-31639.)
idlelib と IDLE¶
自動補完におけるいくつもの修正。 (Contributed by Louie Lu in bpo-15786.)
File メニューの Module Browser (以前の Class Browser) が、トップレベルだけでなく入れ子の関数やクラスも表示するようになりました。 (Contributed by Guilherme Polo, Cheryl Sabella, and Terry Jan Reedy in bpo-1612262.)
設定ダイアログ (Options の Configure IDLE) の一部が、見た目と機能を改善するために書き直されました。 (Contributed by Cheryl Sabella and Terry Jan Reedy in multiple issues.)
フォントのサンプルにラテン文字以外の文字も含まれるようになり、フォントを選んだ結果をよりよく確認できます。 (Terry Jan Reedy による貢献、bpo-13802。) サンプルを編集してほかの文字を追加することもできます。 (Serhiy Storchaka による貢献、bpo-31860。)
従来は拡張として実装されていた IDLE の機能が通常の機能として再実装されました。 その設定は Extensions タブからほかのダイアログのタブへ移されました。 (Contributed by Charles Wohlganger and Terry Jan Reedy in bpo-27099.)
エディターのコードコンテキストオプションが改訂されました。 ボックスに maxlines までのすべてのコンテキスト行を表示します。 コンテキスト行をクリックすると、エディターがその行へ移動します。 設定ダイアログの Highlights タブに、カスタムテーマのコンテキストの色が追加されました。 (Contributed by Cheryl Sabella and Terry Jan Reedy in bpo-33642, bpo-33768, and bpo-33679.)
Windows で新しい API 呼び出しを使い、tk が DPI に合わせて拡大縮小することを Windows に通知するようになりました。 Windows 8.1 以降または 10 で、Python バイナリの DPI 互換性プロパティを変更しておらず、モニターの解像度が 96 DPI を超える場合、文字や線がより鮮明になるはずです。 それ以外の場合には影響しないはずです。 (Contributed by Terry Jan Reedy in bpo-33656.)
3.7.1 の新機能:
N 行 (デフォルトは 50 行) を超える出力は、一つのボタンに折り畳まれます。 N は設定ダイアログの General ページにある PyShell セクションで変更できます。 行数が少なくても各行が非常に長い場合などは、出力を右クリックして折り畳めます。 折り畳んだ出力は、ボタンのダブルクリックでその場に展開でき、右クリックでクリップボードや別のウィンドウに展開できます。 (Contributed by Tal Einat in bpo-1529353.)
上で挙げた変更は 3.6 のメンテナンスリリースにバックポートされました。
3.7.4 の新機能:
Run メニューに、設定を変更してモジュールを実行する "Run Customized" が追加されました。 入力したコマンドライン引数は sys.argv に追加され、次回のカスタム実行時にも入力欄に表示されます。 通常行われる Shell のメインモジュールの再起動を抑制することもできます。 (Contributed by Cheryl Sabella, Terry Jan Reedy, and others in bpo-5680 and bpo-37627.)
3.7.5 の新機能:
IDLE のエディターウィンドウに、必要に応じて行番号を表示できるようになりました。 設定ダイアログの General タブで指定しない限り、行番号なしでウィンドウが開きます。 既存のウィンドウの行番号は Options メニューで表示、非表示を切り替えられます。 (Contributed by Tal Einat and Saimadhav Heblikar in bpo-17535.)
importlib¶
パッケージからのリソースの読み込みをサポートする ABC importlib.abc.ResourceReader が導入されました。
importlib.resources も参照してください。
(Contributed by Barry Warsaw, Brett Cannon in bpo-32248.)
importlib.reload() は、モジュールに spec がない場合に ModuleNotFoundError を送出するようになりました。
(Contributed by Garvit Khatri in bpo-29851.)
importlib.util.find_spec() は、指定された親モジュールがパッケージでない場合 (__path__ 属性がない場合)、AttributeError ではなく ModuleNotFoundError を送出するようになりました。
(Contributed by Milan Oberkirch in bpo-30436.)
新しい importlib.util.source_hash() で、渡されたソースのハッシュを計算できます。
ハッシュベースの .pyc ファイル には、この関数の戻り値が埋め込まれます。
io¶
新しい TextIOWrapper.reconfigure() メソッドで、テキストストリームを新しい設定に変更できます。
(Contributed by Antoine Pitrou in bpo-30526 and INADA Naoki in bpo-15216.)
ipaddress¶
ipaddress.IPv6Network と ipaddress.IPv4Network の新しい subnet_of()、supernet_of() メソッドで、ネットワークの包含関係を検査できます。
(Contributed by Michel Albert and Cheryl Sabella in bpo-20825.)
itertools¶
itertools.islice() now accepts
integer-like objects as start, stop,
and slice arguments.
(Contributed by Will Roberts in bpo-30537.)
locale¶
locale.format_string() の新しい monetary 引数を使うと、通貨用の桁区切り文字とグループ化の指定で変換できます。
(Contributed by Garvit in bpo-10379.)
locale.getpreferredencoding() 関数は、Android または 強制 UTF-8 モード では常に 'UTF-8' を返すようになりました。
logging¶
Logger インスタンスが pickle 化できるようになりました。
(Contributed by Vinay Sajip in bpo-30520.)
新しい StreamHandler.setStream() メソッドで、ハンドラーの作成後にログ出力先のストリームを置き換えられます。
(Contributed by Vinay Sajip in bpo-30522.)
logging.config.fileConfig() に渡す設定で、ハンドラーのコンストラクタのキーワード引数を指定できるようになりました。
(Contributed by Preston Landers in bpo-31080.)
math¶
新しい math.remainder() 関数が IEEE 754 方式の剰余演算で実装されています。
Contributed by Mark Dickinson in bpo-29962.)
mimetypes¶
.bmp の MIME 型が 'image/x-ms-bmp' から 'image/bmp' に変更されました。
(Contributed by Nitish Chandra in bpo-22589.)
msilib¶
新しい Database.Close() メソッドで MSI データベースを閉じられます。
(Contributed by Berker Peksag in bpo-20486.)
multiprocessing¶
新しい Process.close() メソッドは、プロセスオブジェクトを明示的に閉じ、関連するすべてのリソースを解放します。
対象のプロセスがまだ実行中の場合は ValueError を送出します。
(Contributed by Antoine Pitrou in bpo-30596.)
新しい Process.kill() メソッドで、Unix では SIGKILL シグナルを使ってプロセスを終了できます。
(Contributed by Vitor Pereira in bpo-30794.)
Process が作成した非デーモンスレッドは、プロセス終了時に join されるようになりました。
(Contributed by Antoine Pitrou in bpo-18966.)
os¶
os.fwalk() の path 引数に bytes を渡せるようになりました。
(Contributed by Serhiy Storchaka in bpo-28682.)
os.scandir() が ファイル記述子 に対応しました。
(Contributed by Serhiy Storchaka in bpo-25996.)
新しい register_at_fork() 関数で、プロセスの fork 時に実行する Python コールバックを登録できます。
(Contributed by Antoine Pitrou in bpo-16500.)
os.preadv() (os.readv() と os.pread() の機能を組み合わせたもの) と os.pwritev() (os.writev() と os.pwrite() の機能を組み合わせたもの) が追加されました。
(Contributed by Pablo Galindo in bpo-31368.)
os.makedirs() の mode 引数は、新しく作成される中間ディレクトリのアクセス権ビットに影響しなくなりました。
(Contributed by Serhiy Storchaka in bpo-19930.)
os.dup2() は新しいファイル記述子を返すようになりました。
以前は常に None を返していました。
(Contributed by Benjamin Peterson in bpo-32441.)
Solaris とその派生 OS では、os.stat() が返す構造体に st_fstype 属性が含まれるようになりました。
(Contributed by Jesús Cea Avión in bpo-32659.)
pathlib¶
新しい Path.is_mount() メソッドが POSIX システムで利用でき、パスがマウントポイントかどうかを調べられます。
(Contributed by Cooper Ry Lees in bpo-30897.)
pdb¶
pdb.set_trace() に、省略可能なキーワード専用引数 header が追加されました。
指定すると、デバッグを開始する直前にコンソールに表示されます。
(Contributed by Barry Warsaw in bpo-31389.)
pdb のコマンドラインで、スクリプトファイルの代わりに -m module_name を指定できるようになりました。
(Contributed by Mario Corchero in bpo-32206.)
py_compile¶
py_compile.compile() と、それを使う compileall は、環境変数 SOURCE_DATE_EPOCH が設定されている場合、無条件にハッシュベースの検証用の .pyc ファイルを作成するようになりました。
これにより .pyc をあらかじめ作成する際に、再現可能なビルド を保証できます。
(Contributed by Bernhard M. Wiedemann in bpo-29708.)
pydoc¶
pydoc サーバーが、新しいコマンドライン引数 -n で指定した任意のホスト名にバインドできるようになりました。
(Contributed by Feanil Patel in bpo-31128.)
queue¶
新しい SimpleQueue クラスは、上限のない FIFO キューです。
(Contributed by Antoine Pitrou in bpo-14976.)
re¶
re.ASCII、re.LOCALE、re.UNICODE フラグをグループのスコープ内で設定できるようになりました。
(Contributed by Serhiy Storchaka in bpo-31690.)
re.split() が、空文字列にマッチする r'\b'、'^$'、(?=-) などのパターンによる分割に対応しました。
(Contributed by Serhiy Storchaka in bpo-25054.)
re.LOCALE フラグでコンパイルした正規表現は、コンパイル時のロケールに依存しなくなりました。
ロケール設定はコンパイル済みの正規表現を使うときにのみ適用されます。
(Contributed by Serhiy Storchaka in bpo-30215.)
正規表現に、入れ子の集合や集合演算など、将来意味が変わる文字集合の構文が含まれる場合、FutureWarning が発生するようになりました。
(Contributed by Serhiy Storchaka in bpo-30349.)
コンパイル済みの正規表現オブジェクトとマッチオブジェクトを、copy.copy() と copy.deepcopy() でコピーできるようになりました。
(Contributed by Serhiy Storchaka in bpo-10076.)
signal¶
signal.set_wakeup_fd() の新しい warn_on_full_buffer 引数で、起床用バッファがあふれたときに Python が stderr に警告を表示するかどうかを指定できます。
(Contributed by Nathaniel J. Smith in bpo-30050.)
socket¶
新しい socket.getblocking() メソッドは、ソケットがブロッキングモードなら True、そうでなければ False を返します。
(Contributed by Yury Selivanov in bpo-32373.)
新しい socket.close() 関数は、渡されたソケットのファイル記述子を閉じます。
プラットフォーム間の互換性を高めるため、os.close() の代わりにこの関数を使ってください。
(Contributed by Christian Heimes in bpo-32454.)
socket モジュールが socket.TCP_CONGESTION (Linux 2.6.13)、socket.TCP_USER_TIMEOUT (Linux 2.6.37)、socket.TCP_NOTSENT_LOWAT (Linux 3.12) 定数を公開するようになりました。
(Contributed by Omar Sandoval in bpo-26273 and Nathaniel J. Smith in bpo-29728.)
socket.AF_VSOCK ソケットがサポートされ、仮想マシンとホストの間で通信できるようになりました。
(Contributed by Cathy Avery in bpo-27584.)
ソケットはデフォルトで、ファイル記述子からファミリー、型、プロトコルを自動検出するようになりました。 (Contributed by Christian Heimes in bpo-28134.)
socketserver¶
socketserver.ThreadingMixIn.server_close は、すべての非デーモンスレッドが終了するまで待つようになりました。
socketserver.ForkingMixIn.server_close は、すべての子プロセスが終了するまで待つようになりました。
socketserver.ForkingMixIn と socketserver.ThreadingMixIn クラスに、新しいクラス属性 socketserver.ForkingMixIn.block_on_close が追加されました。
False に設定すると 3.7 より前の動作になります。
sqlite3¶
使用する SQLite ライブラリが 3.6.11 以降の場合、sqlite3.Connection が backup() メソッドを公開するようになりました。
(Contributed by Lele Gaifax in bpo-27645.)
sqlite3.connect() の database 引数が、文字列だけでなく任意の path-like object を受け付けるようになりました。
(Contributed by Anders Lorentsen in bpo-31843.)
ssl¶
ssl モジュールは、ホスト名や IP アドレスの検査に match_hostname() ではなく OpenSSL 組み込みの API を使うようになりました。
検証は TLS ハンドシェイク中に行われます。
ホスト名の検査失敗を含め、証明書の検証でエラーがあれば SSLCertVerificationError を送出し、適切な TLS Alert メッセージでハンドシェイクを中止します。
この新しい例外には追加の情報が含まれます。
ホスト名の検証は SSLContext.hostname_checks_common_name でカスタマイズできます。
(Contributed by Christian Heimes in bpo-31399.)
注釈
改善されたホスト名の検査には、OpenSSL 1.0.2 または 1.1 と互換性のある libssl 実装が必要です。 そのため OpenSSL 0.9.8 と 1.0.1 はサポートされなくなりました (詳しくは サポート対象プラットフォームからの除外 を参照)。 ssl モジュールは LibreSSL 2.7.2 以降とおおむね互換性があります。
ssl モジュールは SNI TLS 拡張で IP アドレスを送信しなくなりました。
(Contributed by Christian Heimes in bpo-32185.)
match_hostname() は www*.example.org のような部分的なワイルドカードをサポートしなくなりました。
(Contributed by Mandeep Singh in bpo-23033 and Christian Heimes in bpo-31399.)
ssl モジュールのデフォルトの暗号スイートの選択方法は、固定の許可リストから拒否リストに変わりました。
OpenSSL のセキュリティ更新で禁止された暗号方式を Python が再び有効にすることはなくなりました。
デフォルトの暗号スイートの選択はコンパイル時に設定できます。
(Contributed by Christian Heimes in bpo-31429.)
国際化ドメイン名 (IDN) を含むサーバー証明書の検証に対応しました。
この変更に伴い SSLSocket.server_hostname 属性は、期待するホスト名を U-label 形式 ("pythön.org") ではなく A-label 形式 ("xn--pythn-mua.org") で保存するようになりました。
(Contributed by Nathaniel J. Smith and Christian Heimes in bpo-28414.)
ssl モジュールに TLS 1.3 と OpenSSL 1.1.1 の予備的、実験的なサポートが追加されました。
Python 3.7.0 のリリース時点で OpenSSL 1.1.1 はまだ開発中で、TLS 1.3 も確定していません。
TLS 1.3 のハンドシェイクとプロトコルは TLS 1.2 以前と少し動作が異なります。
TLS 1.3 を参照してください。
(Contributed by Christian Heimes in bpo-32947, bpo-20995, bpo-29136, bpo-30622 and bpo-33618)
SSLSocket と SSLObject の公開コンストラクタがなくなりました。
直接のインスタンス化は、これまでも文書化、サポートされた機能ではありませんでした。
インスタンスは SSLContext の wrap_socket() と wrap_bio() メソッドで作成する必要があります。
(Contributed by Christian Heimes in bpo-32951)
TLS プロトコルの最小、最大バージョンを設定する OpenSSL 1.1 の API が、SSLContext.minimum_version と SSLContext.maximum_version として利用できるようになりました。
サポートするプロトコルは HAS_TLSv1_1 などの新しいフラグで示されます。
(Contributed by Christian Heimes in bpo-32609.)
TLS 1.3 のハンドシェイク後認証を有効にする ssl.SSLContext.post_handshake_auth と、それを開始する ssl.SSLSocket.verify_client_post_handshake() が追加されました。
(Contributed by Christian Heimes in gh-78851.)
string¶
string.Template で、中括弧付きと中括弧なしのプレースホルダーの正規表現パターンを個別に変更できるようになりました。
(Contributed by Barry Warsaw in bpo-1198569.)
subprocess¶
subprocess.run() 関数に capture_output キーワード引数が追加されました。
真の場合、stdout と stderr をキャプチャします。
これは stdout と stderr 引数に subprocess.PIPE を渡すことと同じです。
(Contributed by Bo Bayles in bpo-32102.)
subprocess.run 関数と subprocess.Popen コンストラクタに、universal_newlines の別名として text キーワード引数が追加されました。
(Contributed by Andrew Clegg in bpo-31756.)
Windows で標準ハンドルをリダイレクトする場合、close_fds のデフォルト値が False から True に変わりました。
標準ハンドルのリダイレクト時にも close_fds を真に設定できるようになりました。
subprocess.Popen を参照してください。
これにより、サポートするすべてのプラットフォームで close_fds のデフォルトは True になります。
(Contributed by Segev Finer in bpo-19764.)
subprocess モジュールは subprocess.call()、subprocess.run()、Popen コンテキストマネージャー内での KeyboardInterrupt を、より穏当に処理するようになりました。
KeyboardInterrupt 例外の処理を続ける前に、子プロセスの終了を短時間待ちます。
(Contributed by Gregory P. Smith in bpo-25942.)
sys¶
新しいフック関数 sys.breakpointhook() は、組み込み関数 breakpoint() から呼び出されます。
(Contributed by Barry Warsaw in bpo-31353.)
Android では、新しい sys.getandroidapilevel() がビルド時の Android API バージョンを返します。
(Contributed by Victor Stinner in bpo-28740.)
新しい sys.get_coroutine_origin_tracking_depth() 関数は、新しい sys.set_coroutine_origin_tracking_depth() で設定した、コルーチン作成元の現在の追跡深度を返します。
asyncio は非推奨の sys.set_coroutine_wrapper() に代わり、この新しい API を使うように変更されました。
(Contributed by Nathaniel J. Smith in bpo-32591.)
time¶
PEP 564 により、ナノ秒の分解能を持つ六つの関数が time モジュールに追加されました:
新しいクロック識別子が追加されました:
time.CLOCK_BOOTTIME(Linux):time.CLOCK_MONOTONICと同じですが、システムがサスペンドしていた時間も含みます。time.CLOCK_PROF(FreeBSD、NetBSD、OpenBSD): プロセスごとの高分解能の CPU タイマー。time.CLOCK_UPTIME(FreeBSD、OpenBSD): システムがサスペンドせずに稼働していた時間を絶対値として持ち、稼働時間を正確に計測します。
新しい time.thread_time() と time.thread_time_ns() 関数で、スレッドごとの CPU 時間を計測できます。
(Contributed by Antoine Pitrou in bpo-32025.)
新しい time.pthread_getcpuclockid() 関数は、スレッド固有の CPU 時間クロックの ID を返します。
tkinter¶
tkinter.ttk.Spinbox クラスが追加されました。
(Contributed by Alan Moore in bpo-32585.)
tracemalloc¶
tracemalloc.Traceback behaves more like regular tracebacks,
sorting the frames from oldest to most recent.
Traceback.format()
now accepts negative limit, truncating the result to the
abs(limit) oldest frames. To get the old behaviour, use
the new most_recent_first argument to Traceback.format().
(Contributed by Jesse Bakker in bpo-32121.)
types¶
WrapperDescriptorType、MethodWrapperType、MethodDescriptorType、ClassMethodDescriptorType クラスが追加されました。
(Contributed by Manuel Krebber and Guido van Rossum in bpo-29377, and Serhiy Storchaka in bpo-32265.)
新しい types.resolve_bases() 関数は、PEP 560 の定めに従って MRO エントリーを動的に解決します。
(Contributed by Ivan Levkivskyi in bpo-32717.)
unicodedata¶
unicodedata の内部データベースが Unicode 11 に更新されました。
(Contributed by Benjamin Peterson.)
unittest¶
新しいコマンドラインオプション -k で、名前の部分文字列や Unix シェル風のパターンによってテストを絞り込めます。
例えば python -m unittest -k foo は foo_tests.SomeTest.test_something と bar_tests.SomeTest.test_foo を実行しますが、bar_tests.FooTest.test_something は実行しません。
(Contributed by Jonas Haag in bpo-32071.)
unittest.mock¶
sentinel の属性は、コピー や pickle 化 を行っても同一性を保持するようになりました。
(Contributed by Serhiy Storchaka in bpo-20804.)
新しい seal() 関数で Mock インスタンスを封印し、それ以降の属性モックの作成を禁止できます。
封印は、属性自体がモックであるすべての属性にも再帰的に適用されます。
(Contributed by Mario Corchero in bpo-30541.)
urllib.parse¶
urllib.parse.quote() は RFC 2396 から RFC 3986 に対応が更新され、デフォルトで常にクォートしない文字に ~ が追加されました。
(Contributed by Christian Theune and Ratnadeep Debnath in bpo-16285.)
uu¶
uu.encode() 関数に省略可能な backtick キーワード引数が追加されました。
真の場合、ゼロは空白ではなく '`' で表されます。
(Contributed by Xiang Zhang in bpo-30103.)
uuid¶
新しい UUID.is_safe 属性は、生成された UUID がマルチプロセスに対して安全な方法で生成されたかどうか、プラットフォームからの情報を伝えます。
(Contributed by Barry Warsaw in bpo-22807.)
uuid.getnode() は、ローカル管理の MAC アドレスよりもユニバーサル管理の MAC アドレスを優先するようになりました。
これにより uuid.uuid1() が返す UUID の世界全体での一意性がよりよく保証されます。
ローカル管理の MAC アドレスしかない場合は、最初に見つかったものを返します。
(Contributed by Barry Warsaw in bpo-32107.)
warnings¶
デフォルトの警告フィルターの初期化が次のように変更されました:
コマンドラインオプションで有効にした警告 (
-bや新しい CPython 固有の-Xdevを含む) は、常にsys.warnoptions属性を通じて警告機構に渡されます。コマンドラインまたは環境変数で有効にした警告フィルターは、次の優先順位になります:
-b(または-bb) のBytesWarningフィルター-Wオプションで指定したフィルター環境変数
PYTHONWARNINGSで指定したフィルターそのほかの CPython 固有のフィルター (例えば新しい
-X devモードで追加されるdefaultフィルター)警告機構が直接定義する暗黙のフィルター
CPython のデバッグビルド では、デフォルトですべての警告を表示します (暗黙のフィルターリストは空です)。
(Nick Coghlan と Victor Stinner による貢献、bpo-20361、bpo-32043、bpo-32230。)
単一ファイルのスクリプトと対話型プロンプトでは、非推奨の警告が再びデフォルトで表示されるようになりました。 詳しくは PEP 565: __main__ で DeprecationWarning を表示 を参照してください。 (Contributed by Nick Coghlan in bpo-31975.)
xml¶
DTD や外部実体の取得による問題を軽減するため、xml.dom.minidom と xml.sax モジュールはデフォルトでは外部実体を処理しなくなりました。
(Contributed by Christian Heimes in gh-61441.)
xml.etree¶
find() メソッドの ElementPath 述語で、子要素のテキストだけでなく、[. = "text"] によって現在のノードのテキストも比較できるようになりました。
読みやすくするため、述語内に空白を入れることもできます。
(Contributed by Stefan Behnel in bpo-31648.)
xmlrpc.server¶
SimpleXMLRPCDispatcher.register_function() をデコレータとして使えるようになりました。
(Contributed by Xiang Zhang in bpo-7769.)
zipapp¶
create_archive() 関数に省略可能な filter 引数が追加され、アーカイブに含めるファイルを選べるようになりました。
(Contributed by Irmen de Jong in bpo-31072.)
create_archive() 関数に、圧縮アーカイブを生成するための省略可能な compressed 引数が追加されました。
圧縮用のコマンドラインオプション --compress も追加されました。
(Contributed by Zhiming Wang in bpo-31638.)
zipfile¶
ZipFile に、圧縮レベルを制御する compresslevel パラメータが追加されました。
(Contributed by Bo Bayles in bpo-21417.)
ZipFile が作成するアーカイブのサブディレクトリは、アルファベット順に格納されるようになりました。
(Contributed by Bernhard M. Wiedemann in bpo-30693.)
C API の変更¶
スレッドローカルストレージ用の新しい API が実装されました。 概要は PEP 539: スレッドローカルストレージのための新しい C API、完全なリファレンスは スレッド固有ストレージ API を参照してください。 (Contributed by Masayuki Yamamoto in bpo-25658.)
新しい コンテキスト変数 の機能は、いくつもの 新しい C API を公開します。
新しい PyImport_GetModule() 関数は、指定した名前のインポート済みモジュールを返します。
(Contributed by Eric Snow in bpo-28411.)
新しい Py_RETURN_RICHCOMPARE マクロにより、リッチ比較関数を簡単に記述できます。
(Contributed by Petr Victorin in bpo-23699.)
新しい Py_UNREACHABLE マクロを使うと、到達不能なコードの経路を示せます。
(Contributed by Barry Warsaw in bpo-31338.)
tracemalloc は、新しい PyTraceMalloc_Track() と PyTraceMalloc_Untrack() 関数を通じて C API を公開するようになりました。
(Contributed by Victor Stinner in bpo-30054.)
新しい静的マーカー import__find__load__start と import__find__load__done で、モジュールのインポートを追跡できます。 (Contributed by Christian Heimes in bpo-31574.)
PyMemberDef、PyGetSetDef、PyStructSequence_Field、PyStructSequence_Desc、wrapperbase 構造体の name と doc フィールドの型が、char * から const char * に変わりました。
(Contributed by Serhiy Storchaka in bpo-28761.)
PyUnicode_AsUTF8AndSize() と PyUnicode_AsUTF8() の戻り値の型が、char * から const char * に変わりました。
(Contributed by Serhiy Storchaka in bpo-28769.)
PyMapping_Keys()、PyMapping_Values()、PyMapping_Items() の戻り値は、リストまたはタプルではなく常にリストになりました。
(Contributed by Oren Milman in bpo-28280.)
PySlice_Unpack() と PySlice_AdjustIndices() 関数が追加されました。
(Contributed by Serhiy Storchaka in bpo-27867.)
PyOS_AfterFork() が非推奨になりました。
代わりに新しい PyOS_BeforeFork()、PyOS_AfterFork_Parent()、PyOS_AfterFork_Child() 関数を使ってください。
(Contributed by Antoine Pitrou in bpo-16500.)
公開 API の一部だったシングルトン PyExc_RecursionErrorInst が削除されました。
そのメンバーがクリアされないため、インタープリタの終了処理中にセグメンテーション違反を引き起こす可能性がありました。
Xavier de Gaye による貢献、bpo-22898、bpo-30697。
タイムゾーンの C API として、コンストラクタ PyTimeZone_FromOffset()、PyTimeZone_FromOffsetAndName() と、UTC シングルトンへのアクセスを提供する PyDateTime_TimeZone_UTC が追加されました。
Paul Ganssle による貢献、bpo-10381。
PyThread_start_new_thread() と PyThread_get_thread_ident() の戻り値の型、および PyThreadState_SetAsyncExc() の id パラメータの型が、long から unsigned long に変わりました。
(Contributed by Serhiy Storchaka in bpo-6532.)
PyUnicode_AsWideCharString() は、第 2 引数が NULL で wchar_t* 文字列にヌル文字が含まれる場合、ValueError を送出するようになりました。
(Contributed by Serhiy Storchaka in bpo-30708.)
起動手順と動的メモリアロケータの管理の変更により、多くの C API 関数を呼ぶ前に Py_Initialize() を呼ぶという、以前から文書化された要件がより重要になりました。
守らない場合、Python を埋め込むアプリケーションでセグメンテーション違反が起きる可能性があります。
詳しくは、この文書の Python 3.7 への移植 と C API ドキュメントの Python の初期化前 を参照してください。
新しい PyInterpreterState_GetID() は、指定されたインタープリタの一意な ID を返します。
(Contributed by Eric Snow in bpo-29102.)
Py_DecodeLocale() と Py_EncodeLocale() は、UTF-8 モード が有効なときに UTF-8 エンコーディングを使うようになりました。
(Contributed by Victor Stinner in bpo-29240.)
PyUnicode_DecodeLocaleAndSize() と PyUnicode_EncodeLocale() は、surrogateescape エラーハンドラーで現在のロケールのエンコーディングを使うようになりました。
(Contributed by Victor Stinner in bpo-29240.)
PyUnicode_FindChar() の start と end パラメータは、文字列のスライスと同じ動作になるように調整されるようになりました。
(Contributed by Xiang Zhang in bpo-28822.)
ビルドの変更¶
--without-threads を指定したビルドのサポートが削除されました。
threading モジュールは常に利用可能になりました。
(Contributed by Antoine Pitrou in bpo-31370.)
OSX 以外の UNIX プラットフォームで _ctypes モジュールをビルドするための、libffi の完全なコピーは同梱されなくなりました。
これらの環境で _ctypes をビルドするには、libffi がインストールされている必要があります。
(Contributed by Zachary Ware in bpo-27979.)
Windows のビルド手順は、外部ソースの取得に Subversion を使わなくなりました。
代わりに Python スクリプトで GitHub から ZIP ファイルをダウンロードします。
システムで py -3.6 によって Python 3.6 が見つからない場合は、この用途のために NuGet で 32 ビット Python をダウンロードします。
(Contributed by Zachary Ware in bpo-30450.)
The ssl module requires OpenSSL 1.0.2 or 1.1 compatible libssl.
OpenSSL 1.0.1 has reached end of lifetime on 2016-12-31 and is no longer
supported. LibreSSL is temporarily not supported as well. LibreSSL releases
up to version 2.6.4 are missing required OpenSSL 1.0.2 APIs.
最適化¶
より多くのコードを METH_FASTCALL 規約に移行した結果、C で実装された標準ライブラリの各種クラスの多くのメソッドで、呼び出しのオーバーヘッドが大幅に減りました。
(Contributed by Victor Stinner in bpo-29300, bpo-29507, bpo-29452, and bpo-29286.)
さまざまな最適化によって、Python の起動時間が Linux で 10%、macOS で最大 30% 短くなりました。 (Contributed by Victor Stinner, INADA Naoki in bpo-29585, and Ivan Levkivskyi in bpo-31333.)
バイトコードの変更によって束縛メソッドのインスタンスの作成を避けるようになり、メソッド呼び出しが最大 20% 高速になりました。 (Contributed by Yury Selivanov and INADA Naoki in bpo-26110.)
asyncio モジュールでは、よく使われる関数にいくつもの注目すべき最適化が行われました:
asyncio.get_event_loop()関数が C で再実装され、最大 15 倍高速になりました。 (Contributed by Yury Selivanov in bpo-32296.)asyncio.Futureのコールバック管理が最適化されました。 (Contributed by Yury Selivanov in bpo-32348.)asyncio.gather()が最大 15% 高速になりました。 (Contributed by Yury Selivanov in bpo-32355.)asyncio.sleep()は delay 引数がゼロまたは負の場合に最大 2 倍高速になりました。 (Contributed by Andrew Svetlov in bpo-32351.)asyncio のデバッグモードの性能上のオーバーヘッドが減りました。 (Contributed by Antoine Pitrou in bpo-31970.)
PEP 560 の取り組み により、typing のインポート時間が 7 分の 1 になり、多くの型操作が高速化されました。
(Contributed by Ivan Levkivskyi in bpo-32226.)
sorted() と list.sort() は一般的なケース向けに最適化され、最大 40〜75% 高速になりました。
(Contributed by Elliot Gorokhovsky in bpo-28685.)
dict.copy() が最大 5.5 倍高速になりました。
(Contributed by Yury Selivanov in bpo-31179.)
hasattr() と getattr() は、name が見つからず、obj が object.__getattr__() や object.__getattribute__() をオーバーライドしていない場合、約 4 倍高速になりました。
(Contributed by INADA Naoki in bpo-32544.)
特定の Unicode 文字 (ウクライナ語の大文字 "Є" など) の文字列中の検索は、ほかの文字の検索より最大 25 倍遅くなっていました。 最悪の場合でも 3 倍にとどまるようになりました。 (Contributed by Serhiy Storchaka in bpo-24821.)
collections.namedtuple() ファクトリが再実装され、名前付きタプルの作成が 4〜6 倍高速になりました。
(Contributed by Jelle Zijlstra with further improvements by INADA Naoki, Serhiy Storchaka, and Raymond Hettinger in bpo-28638.)
datetime.date.fromordinal() と datetime.date.fromtimestamp() が、一般的な場合に最大 30% 高速になりました。
(Contributed by Paul Ganssle in bpo-32403.)
os.fwalk() 関数が os.scandir() の使用によって最大 2 倍高速になりました。
(Contributed by Serhiy Storchaka in bpo-25996.)
shutil.rmtree() 関数が os.scandir() の使用によって 20〜40% 高速になりました。
(Contributed by Serhiy Storchaka in bpo-28564.)
正規表現 の、大文字と小文字を区別しないマッチと検索が最適化されました。
一部のパターンの検索が最大 20 倍高速になりました。
(Contributed by Serhiy Storchaka in bpo-30285.)
re.compile() は、flags パラメータが RegexFlag の場合に int オブジェクトに変換するようになりました。
Python 3.5 と同じ速さになり、パターンによっては Python 3.6 より約 10% 高速になりました。
(Contributed by INADA Naoki in bpo-31671.)
selectors.EpollSelector、selectors.PollSelector、selectors.DevpollSelector の modify() メソッドが、高負荷時に約 10% 高速になる可能性があります。
(Contributed by Giampaolo Rodola' in bpo-30014)
定数畳み込みがピープホール最適化器から新しい AST 最適化器に移され、より一貫して最適化できるようになりました。 (Contributed by Eugene Toder and INADA Naoki in bpo-29469 and bpo-11549.)
abc のほとんどの関数とメソッドが C で書き直されました。
抽象基底クラスの作成と、それに対する isinstance()、issubclass() の呼び出しが 1.5 倍高速になりました。
Python の起動時間も最大 10% 短くなりました。
(Contributed by Ivan Levkivskyi and INADA Naoki in bpo-31333)
datetime.date と datetime.datetime の代替コンストラクタは、サブクラスを作成しない場合に高速なコンストラクタを使い、大幅に高速化されました。
(Contributed by Paul Ganssle in bpo-32403)
array.array インスタンスの比較が、特定の場合に大幅に高速化されました。
同じ整数型の値を持つ配列の比較では、10〜70 倍高速になりました。
(Contributed by Adrian Wielgosik in bpo-24700.)
math.erf() と math.erfc() 関数は、ほとんどのプラットフォームで、より高速な C ライブラリの実装を使うようになりました。
(Contributed by Serhiy Storchaka in bpo-26121.)
その他の CPython の実装の変更¶
トレースフックは、追跡対象のフレームの新しい
f_trace_linesとf_trace_opcodes属性を設定することで、それぞれインタープリタからのlineイベントを受け取らないようにしたり、opcodeイベントを受け取ったりできるようになりました。 (Contributed by Nick Coghlan in bpo-31344.)名前空間パッケージのモジュール属性の一貫性に関する問題を修正しました。 名前空間モジュールのオブジェクトでは、未設定だった
__file__がNoneになり、__spec__.originも文字列"namespace"からNoneに変わりました (bpo-32305)。 また、以前はNoneだった__spec__.loaderが__loader__と同じ値になりました (bpo-32303)。locals()の辞書は、変数がソース中で定義された順に表示されるようになりました。 以前は順序が未定義でした。 (Contributed by Raymond Hettinger in bpo-32690.)distutilsのuploadコマンドは、行末文字 CR を CRLF に変換しなくなりました。 これにより CR 相当のバイトで終わる sdist が破損する問題が修正されました。 (Contributed by Bo Bayles in bpo-32304.)
非推奨の Python の挙動¶
内包表記とジェネレータ式では、最も左の for 節のイテラブル式を除き、yield 式 (yield と yield from の両方) が非推奨になりました。
これにより、内包表記は generator iterator オブジェクトを返す可能性がなくなり、常に適切な型のコンテナを直ちに返すことが保証されます。
また、ジェネレータ式が暗黙の出力と明示的な yield 式の出力を交互に行おうとすることもなくなります。
Python 3.7 ではこのような式のコンパイル時に DeprecationWarning が発生し、Python 3.8 では SyntaxError になります。
(Contributed by Serhiy Storchaka in bpo-10544.)
object.__complex__() から complex のサブクラスを返すことが非推奨になり、将来の Python ではエラーになります。
これにより __complex__() の動作が object.__int__() と object.__float__() に揃います。
(Contributed by Serhiy Storchaka in bpo-28894.)
非推奨の Python モジュール、関数、メソッド¶
aifc¶
aifc.openfp() が非推奨になり、Python 3.9 で削除されます。
代わりに aifc.open() を使ってください。
(Contributed by Brian Curtin in bpo-31985.)
asyncio¶
asyncio.Lock やその他の asyncio の同期プリミティブのインスタンスを直接 await することが非推奨になりました。
同期用リソースの取得と解放には、非同期コンテキストマネージャーを使う必要があります。
(Contributed by Andrew Svetlov in bpo-32253.)
asyncio.Task.current_task() と asyncio.Task.all_tasks() メソッドが非推奨になりました。
(Contributed by Andrew Svetlov in bpo-32250.)
collections¶
Python 3.8 では collections.abc の抽象基底クラスを通常の collections モジュールで公開しなくなります。
これにより具象クラスと抽象基底クラスの区別がより明確になります。
(Contributed by Serhiy Storchaka in bpo-25988.)
dbm¶
dbm.dumb が読み取り専用ファイルの読み込みに対応し、インデックスファイルに変更がなければ書き込まないようになりました。
'r' と 'w' モードでインデックスファイルがなく、再作成する場合は非推奨の警告が発生します (将来の Python リリースではエラーになります)。
(Contributed by Serhiy Storchaka in bpo-28847.)
enum¶
Python 3.8 では、Enum クラスに Enum 以外のオブジェクトが含まれるかを調べる操作 (例えば 1 in Color) は TypeError を送出します。
同様に Flag のメンバーに Flag 以外のオブジェクトが含まれるかを調べる操作 (例えば 1 in Perm.RW) も TypeError を送出します。
現時点ではどちらも False を返します。
(Contributed by Ethan Furman in bpo-33217.)
gettext¶
gettext で複数形を選ぶ際に整数以外の値を使うことが非推奨になりました。
この使い方はこれまでも正しく動作していませんでした。
(Contributed by Serhiy Storchaka in bpo-28692.)
importlib¶
Python 3.4 で非推奨になった MetaPathFinder.find_module() (MetaPathFinder.find_spec() で置き換え) と PathEntryFinder.find_loader() (PathEntryFinder.find_spec() で置き換え) が、DeprecationWarning を出すようになりました。
(Contributed by Matthias Bussonnier in bpo-29576.)
ABC importlib.abc.ResourceLoader が非推奨になりました。
代わりに importlib.abc.ResourceReader を使ってください。
locale¶
locale.format() が非推奨になりました。
代わりに locale.format_string() を使ってください。
(Contributed by Garvit in bpo-10379.)
macpath¶
macpath が非推奨になり、Python 3.8 で削除されます。
(Contributed by Chi Hsuan Yen in bpo-9850.)
threading¶
dummy_threading と _dummy_thread が非推奨になりました。
スレッドを無効にした Python のビルドはできなくなりました。
代わりに threading を使ってください。
(Contributed by Antoine Pitrou in bpo-31370.)
socket¶
socket.htons() と socket.ntohs() が引数の値を通知せず切り詰める動作は非推奨になりました。
将来の Python では、渡された引数が 16 ビットを超える場合に例外を送出します。
(Contributed by Oren Milman in bpo-28332.)
ssl¶
ssl.wrap_socket() が非推奨になりました。
代わりに ssl.SSLContext.wrap_socket() を使ってください。
(Contributed by Christian Heimes in bpo-28124.)
sunau¶
sunau.openfp() が非推奨になり、Python 3.9 で削除されます。
代わりに sunau.open() を使ってください。
(Contributed by Brian Curtin in bpo-31985.)
sys¶
sys.set_coroutine_wrapper() と sys.get_coroutine_wrapper() が非推奨になりました。
文書化されていない sys.callstats() 関数が非推奨になり、将来の Python で削除されます。
(Contributed by Victor Stinner in bpo-28799.)
wave¶
wave.openfp() が非推奨になり、Python 3.9 で削除されます。
代わりに wave.open() を使ってください。
(Contributed by Brian Curtin in bpo-31985.)
C API の非推奨の関数ならびに型¶
PySlice_GetIndicesEx() 関数が非推奨になりました。
Py_LIMITED_API が未設定、0x03050400 より大きく 0x03060000 より小さい値、または 0x03060100 以上の場合は、マクロに置き換えられます。
(Contributed by Serhiy Storchaka in bpo-27867.)
PyOS_AfterFork() が非推奨になりました。
代わりに PyOS_BeforeFork()、PyOS_AfterFork_Parent()、PyOS_AfterFork_Child() を使ってください。
(Contributed by Antoine Pitrou in bpo-16500.)
サポート対象プラットフォームからの除外¶
FreeBSD 9 とそれ以前のバージョンは公式にはサポートされなくなりました。
拡張モジュールも含めて Unicode を完全にサポートするため、*nix プラットフォームでは、従来の
ASCIIベースのCロケールの代わりに、C.UTF-8(完全なロケール)、C.utf8(完全なロケール)、UTF-8(LC_CTYPEのみのロケール) の少なくとも一つを提供することが期待されます。OpenSSL 0.9.8 と 1.0.1 はサポートされなくなりました。 これらを使い続けている古いプラットフォームで SSL/TLS をサポートする CPython 3.7 をビルドするには、より新しい OpenSSL にリンクする独自のビルドオプションが必要です。
特に Debian 8 ("jessie") と Ubuntu 14.04 ("Trusty") の LTS Linux ディストリビューションは、デフォルトで OpenSSL 1.0.1 を使っているため影響を受けます。
Debian 9 ("stretch")、Ubuntu 16.04 ("xenial")、その他の LTS Linux の最近のリリース (RHEL/CentOS 7.5、SLES 12-SP3 など) は OpenSSL 1.0.2 以降を使っており、デフォルトのビルド設定で引き続きサポートされます。
CPython 自身の CI 設定ファイル は、テストスイートの SSL 互換性テスト基盤 を利用して、システムが提供する古い OpenSSL ではなく OpenSSL 1.1.0 に対してビルド、リンクする例を示しています。
API と機能の削除¶
次の機能と API が Python 3.7 から削除されました:
os.stat_float_times()関数が削除されました。 Python 2.2 との後方互換性のため Python 2.3 で導入され、Python 3.1 から非推奨でした。re.sub()の置換テンプレートで'\'と ASCII 文字からなる未知のエスケープを使うことは Python 3.5 で非推奨となり、今回からエラーになります。tarfile.TarFile.add()の exclude 引数のサポートが削除されました。 Python 2.7 と 3.2 で非推奨になっていました。 代わりに filter 引数を使ってください。Python 3.1 で非推奨になった
ntpath.splitunc()関数が削除されました。 代わりにsplitdrive()を使ってください。collections.namedtuple()は、名前付きタプルのクラスの生成ソースコードを示す verbose パラメータと_source属性をサポートしなくなりました。 これはクラス作成を高速化する最適化の一環です。 (Contributed by Jelle Zijlstra with further improvements by INADA Naoki, Serhiy Storchaka, and Raymond Hettinger in bpo-28638.)bool()、float()、list()、tuple()はキーワード引数を受け付けなくなりました。int()の第 1 引数は位置引数としてのみ渡せます。Python 2.4 で非推奨になった
plistlibモジュールのPlist、Dict、_InternalDictクラスが削除されました。readPlist()とreadPlistFromBytes()の結果内の辞書は通常の dict になりました。 これらの辞書の要素に属性アクセスでアクセスすることはできなくなりました。asyncio.windows_utils.socketpair()関数が削除されました。 代わりにsocket.socketpair()を使ってください。 これは Python 3.5 以降、すべてのプラットフォームで利用できます。 Python 3.5 以降のasyncio.windows_utils.socketpairは、単なるsocket.socketpairの別名でした。asyncioはselectorsと_overlappedモジュールをasyncio.selectorsとasyncio._overlappedとしてエクスポートしなくなりました。from asyncio import selectorsをimport selectorsに置き換えてください。ssl.SSLSocketとssl.SSLObjectの直接のインスタンス化は禁止されました。 これらのコンストラクタは公開用として文書化、テスト、設計されたものではありませんでした。 ユーザーはssl.wrap_socket()またはssl.SSLContextを使うことが想定されていました。 (Contributed by Christian Heimes in bpo-32951.)使われていない
distutilsのinstall_miscコマンドが削除されました。 (Contributed by Eric N. Vander Weele in bpo-29218.)
モジュールの削除¶
fpectl モジュールが削除されました。
デフォルトで有効だったことはなく、x86-64 では正しく動作せず、Python ABI を変えることで C 拡張に予期しない破損を引き起こしていました。
(Contributed by Nathaniel J. Smith in bpo-29137.)
Windows 固有の変更¶
Python ランチャー (py.exe) は、マイナーバージョンを指定 しなくても 32 ビットまたは 64 ビットを指定できるようになりました。
py -3.7-32 と同様に py -3-32 と py -3-64 も有効です。
また -m-64 と -m.n-64 の形式も受け付け、通常なら 32 ビット版を使う場合でも 64 ビット版を強制できます。
指定したバージョンがなければ py.exe はエラーで終了します。
(Contributed by Steve Barnes in bpo-30291.)
ランチャーを py -0 で実行すると、インストール済みの Python の一覧を表示し、デフォルトにはアスタリスクを付けます。
py -0p ではパスも表示します。
該当するものがないバージョン指定で py を実行した場合も、利用可能な指定の 短い形式 の一覧を表示します。
(Contributed by Steve Barnes in bpo-30362.)
Python 3.7 への移植¶
このセクションでは前述の変更とバグフィックスにより必要となるかもしれないコードの変更を列挙します:
Python の挙動の変更¶
asyncとawaitは予約済みのキーワードになりました。 これらの名前を識別子として使うコードはSyntaxErrorを送出します。 (Contributed by Jelle Zijlstra in bpo-30406.)Python 3.7 では PEP 479 がすべてのコードで有効になり、コルーチンやジェネレータ内から直接または間接的に送出される
StopIterationはRuntimeErrorに変換されます。 (Contributed by Yury Selivanov in bpo-32670.)object.__aiter__()メソッドを非同期として宣言することはできなくなりました。 (Contributed by Yury Selivanov in bpo-31709.)以前のバージョンの Python で、誤って以下の構文を許容してしまっていました:
f(1 for x in [1],) class C(1 for x in [1]): pass
Python 3.7 では正しく
SyntaxErrorを送出するようになりました。 ジェネレータ式は常に括弧の直内に置く必要があり、左右にカンマを置くことはできません。 括弧の重複を省略できるのは呼び出しの場合だけです。 (Contributed by Serhiy Storchaka in bpo-32012 and bpo-32023.)-mオプションを使うと、sys.pathには空文字列の代わりに起動時の作業ディレクトリが追加されるようになりました。 空文字列は各インポート時点の作業ディレクトリを動的に表していました。 空文字列の有無を調べるなど、以前の動作に依存するプログラムは更新する必要があります。 例えば、空文字列を調べていた目的に応じて、os.getcwd()やos.path.dirname(__main__.__file__)も調べるようにします。
Python API の変更¶
socketserver.ThreadingMixIn.server_closeは、すべての非デーモンスレッドが終了するまで待つようになりました。 新しいクラス属性socketserver.ThreadingMixIn.block_on_closeをFalseに設定すると、3.7 より前の動作になります。 (Contributed by Victor Stinner in bpo-31233 and bpo-33540.)socketserver.ForkingMixIn.server_closeは、すべての子プロセスが終了するまで待つようになりました。 新しいクラス属性socketserver.ForkingMixIn.block_on_closeをFalseに設定すると、3.7 より前の動作になります。 (Contributed by Victor Stinner in bpo-31151 and bpo-33540.)locale.localeconv()関数は、一部の場合にLC_CTYPEロケールを一時的にLC_NUMERICの値に設定するようになりました。 (Contributed by Victor Stinner in bpo-31900.)pkgutil.walk_packages()は path が文字列の場合にValueErrorを送出するようになりました。 以前は空リストを返していました。 (Contributed by Sanyam Khurana in bpo-24744.)string.Formatter.format()の書式文字列の引数が 位置専用 になりました。 キーワード引数として渡すことは Python 3.5 で非推奨になっていました。 (Contributed by Serhiy Storchaka in bpo-29193.)http.cookies.Morselのkey、value、coded_value属性が読み取り専用になりました。 これらへの代入は Python 3.5 で非推奨になっていました。 設定にはset()メソッドを使ってください。 (Contributed by Serhiy Storchaka in bpo-29192.)os.makedirs()の mode 引数は、新しく作成される中間ディレクトリのアクセス権ビットに影響しなくなりました。 これらのアクセス権ビットを設定するには、makedirs()の呼び出し前に umask を設定できます。 (Contributed by Serhiy Storchaka in bpo-19930.)struct.Struct.formatの型がbytesからstrに変わりました。 (Contributed by Victor Stinner in bpo-21071.)cgi.parse_multipart()が encoding と errors 引数を受け付け、FieldStorageと同じ結果を返すようになりました。 ファイル以外のフィールドでは、キーに対応する値が bytes ではなく文字列のリストになります。 (Contributed by Pierre Quentel in bpo-29979.)socketの内部変更により、古い Python バージョンのsocket.shareで作成したソケットに対するsocket.fromshare()の呼び出しはサポートされません。BaseExceptionのreprに末尾のカンマが含まれなくなりました。 ほとんどの例外がこの変更の影響を受けます。 (Contributed by Serhiy Storchaka in bpo-30399.)datetime.timedeltaのreprは、出力にキーワード引数を含むようになりました。 (Contributed by Utkarsh Upadhyay in bpo-30302.)shutil.rmtree()がos.scandir()で実装されるようになったため、ディレクトリの一覧取得に失敗した場合、ユーザーが指定した onerror ハンドラーの第 1 引数はos.listdirではなくos.scandirになります。将来、Unicode Technical Standard #18 のように、正規表現で入れ子の集合や集合演算をサポートする可能性があります。 その場合は構文が変わります。 将来の変更を容易にするため、当面は曖昧な場合に
FutureWarningを出します。 これにはリテラルの'['で始まる集合や、リテラルの文字列'--'、'&&'、'~~'、'||'を含む集合が該当します。 警告を避けるには、バックスラッシュでエスケープしてください。 (Contributed by Serhiy Storchaka in bpo-30349.)空文字列にマッチし得る
正規表現で文字列を分割したときの結果が変わりました。 例えばr'\s*'では、以前のように空白だけで分割するのではなく、すべての非空白文字の直前と文字列の末尾の直前の空文字列でも分割します。 パターンをr'\s+'に変えると以前の動作に戻せます。 このようなパターンには Python 3.5 からFutureWarningが出ていました。空文字列と空でない文字列の両方にマッチするパターンでは、すべてのマッチを検索する結果も、ほかの場合に変わることがあります。 例えば文字列
'a\n\n'に対し、パターンr'(?m)^\s*?$'は位置 2 と 3 の空文字列だけでなく、位置 2〜3 の文字列'\n'にもマッチします。 空白行だけにマッチさせるにはr'(?m)^[^\S\n]*$'と書き直してください。re.sub()は、直前の空でないマッチに隣接する空のマッチも置換するようになりました。 例えばre.sub('x*', '-', 'abxd')は'-a-b-d-'ではなく'-a-b--d-'を返します ('b' と 'd' の間の最初のマイナスは 'x' を、二つ目は 'x' と 'd' の間の空文字列を置き換えたものです)。re.escape()は、ASCII の英数字と'_'以外をすべてエスケープするのではなく、正規表現の特殊文字だけをエスケープするようになりました。 (Contributed by Serhiy Storchaka in bpo-29995.)tracemalloc.Tracebackのフレームは、tracebackと揃うように、古いものから新しいものへ並ぶようになりました。 (Contributed by Jesse Bakker in bpo-32121.)socket.SOCK_NONBLOCKまたはsocket.SOCK_CLOEXECビットフラグをサポートする OS では、socket.typeにこれらのフラグが含まれなくなりました。 そのためif sock.type == socket.SOCK_STREAMのような検査が、すべてのプラットフォームで期待どおりに動作します。 (Contributed by Yury Selivanov in bpo-32331.)Windows で標準ハンドルをリダイレクトする場合、
subprocess.Popenの close_fds 引数のデフォルト値がFalseからTrueに変わりました。 標準 I/O をリダイレクトするsubprocess.Popenの呼び出しでハンドルが継承されることに依存していた場合、従来の動作を保つにはclose_fds=Falseを渡すか、STARTUPINFO.lpAttributeListを使ってください。importlib.machinery.PathFinder.invalidate_caches()は、sys.path_importer_cacheでNoneに設定されたエントリーを削除するようになりました。 これはimportlib.invalidate_caches()にも暗黙に影響します。 (Contributed by Brett Cannon in bpo-33169.)asyncioのloop.sock_recv()、loop.sock_sendall()、loop.sock_accept()、loop.getaddrinfo()、loop.getnameinfo()は、ドキュメントどおりのコルーチンメソッドになりました。 以前はasyncio.Futureインスタンスを返していました。 (Contributed by Yury Selivanov in bpo-32327.)asyncio.Server.socketsは、内部のサーバーソケットのリストを直接返さず、コピーを返すようになりました。 (Contributed by Yury Selivanov in bpo-32662.)Struct.formatはbytesではなくstrインスタンスになりました。 (Contributed by Victor Stinner in bpo-21071.)argparseでArgumentParser.add_subparsers()にrequired=Trueを渡すと、サブパーサーを必須にできるようになりました。 (Contributed by Anthony Sottile in bpo-26510.)ast.literal_eval()がより厳格になりました。 任意の数値の加算や減算は許可されなくなりました。 (Contributed by Serhiy Storchaka in bpo-31778.)Calendar.itermonthdatesは、日付が0001-01-01〜9999-12-31の範囲外になると、一貫して例外を送出するようになりました。 このような例外を許容できないアプリケーションでは、新しいCalendar.itermonthdays3とCalendar.itermonthdays4を使えます。 新しいメソッドはタプルを返し、datetime.dateがサポートする範囲に制限されません。 (Contributed by Alexander Belopolsky in bpo-28292.)collections.ChainMapは、内部のマッピングの順序を保持するようになりました。 (Contributed by Raymond Hettinger in bpo-32792.)concurrent.futures.ThreadPoolExecutorとconcurrent.futures.ProcessPoolExecutorのsubmit()メソッドは、インタープリタの終了処理中に呼ばれるとRuntimeErrorを送出するようになりました。 (Contributed by Mark Nemec in bpo-33097.)configparser.ConfigParserのコンストラクタは、デフォルト値の処理にread_dict()を使い、パーサーのほかの部分と動作が揃うようになりました。 デフォルト値の辞書の文字列以外のキーや値は、暗黙に文字列に変換されます。 (Contributed by James Tocknell in bpo-23835.)文書化されていない内部のインポートがいくつか削除されました。 例えば
os.errnoは利用できなくなったため、直接import errnoを使ってください。 このような内部のインポートは、マイクロバージョンのリリースでも予告なく削除される可能性があります。
C API の変更¶
PySlice_GetIndicesEx() は、サイズ変更可能なシーケンスに対して安全ではないとされています。
スライスのインデックスが int のインスタンスではなく __index__() を実装するオブジェクトの場合、PySlice_GetIndicesEx() に長さを渡した後にシーケンスのサイズが変わる可能性があります。
その結果、シーケンスの長さを超えるインデックスを返す場合があります。
問題を避けるには、新しい PySlice_Unpack() と PySlice_AdjustIndices() を使ってください。
(Contributed by Serhiy Storchaka in bpo-27867.)
CPython バイトコードの変更¶
LOAD_METHOD と CALL_METHOD の二つのオペコードが追加されました。
(Contributed by Yury Selivanov and INADA Naoki in bpo-26110.)
STORE_ANNOTATION オペコードが削除されました。
(Contributed by Mark Shannon in bpo-32550.)
Windows 固有の変更¶
sys.path を上書きするファイルの名前が、'sys.path' から <python-executable>._pth に変わりました。
詳しくは モジュールの検索 を参照してください。
(Contributed by Steve Dower in bpo-28137.)
その他の CPython の実装の変更¶
将来の公開 CPython ランタイム初期化 API の変更に備え、CPython 内部の起動処理と設定管理が大幅にリファクタリングされました (初期の、やや古い草案は PEP 432 を参照)。 埋め込みアプリケーションや通常の CPython CLI の利用者に影響しないことを意図した更新ですが、起動時の各種処理の内部的な順序が変わるため、埋め込みアプリケーションや CPython 自身の潜在的な不具合が表面化する可能性があります。 そのため、ここで変更を説明します。 (当初は bpo-22257 の一環として Nick Coghlan と Eric Snow が貢献し、その後 Nick、Eric、Victor Stinner がほかの複数の課題で更新しました。) 影響が分かっている点は次のとおりです:
PySys_AddWarnOptionUnicode()はPy_Initializeの呼び出し前に Unicode オブジェクトを作成する必要があるため、現時点では埋め込みアプリケーションでは使えません。 代わりにPySys_AddWarnOption()を使ってください。埋め込みアプリケーションが
PySys_AddWarnOption()で追加した警告フィルターは、インタープリタが設定したデフォルトのフィルターよりも、一貫して優先されるようになります。
デフォルトの警告フィルターの設定方法が変わったため、Py_BytesWarningFlag に 1 より大きい値を設定するだけでは、BytesWarning の発生と例外への変換の両方を行えなくなりました。
警告を発生させるためのフラグ設定に加え、例外に変換するために明示的な error::BytesWarning 警告フィルターを追加する必要があります。
コンパイラの docstring の扱いが変わったため、docstring だけの関数本体にある暗黙の return None は、関数のヘッダー行ではなく docstring と同じ行で発生するものとして記録されるようになりました。
現在の例外状態がフレームオブジェクトからコルーチンに移されました。 これによりインタープリタが簡素化され、ジェネレータの開始と終了時に例外状態を切り替える必要があることで生じていた、分かりにくいバグがいくつか修正されました。 (Contributed by Mark Shannon in bpo-25612.)
Python 3.7.1 での重要な変更点¶
3.7.1 から Py_Initialize() は、Py_Main() と同じ環境設定をすべて一貫して読み取り、反映するようになりました。
以前の Python では、明確に定義されていない一部の環境変数だけを反映しており、Python 3.7.0 では bpo-34247 によりどれも読み込んでいませんでした。
この動作を望まない場合は、Py_Initialize() の呼び出し前に Py_IgnoreEnvironmentFlag を 1 に設定してください。
3.7.1 では、コンテキスト変数の C API が PyObject ポインタを使うように 更新されました。
bpo-34762 も参照してください。
3.7.1 では tokenize モジュールが、末尾に改行のない入力に対して暗黙に NEWLINE トークンを出力するようになりました。
これにより C のトークナイザーの内部動作と一致します。
(Contributed by Ammar Askar in bpo-33899.)
Python 3.7.2 での重要な変更点¶
3.7.2 では Windows の venv は、元のバイナリをコピーする代わりに、python.exe と pythonw.exe という名前のリダイレクタースクリプトを作成するようになりました。
これにより、Python の更新のたびにすべての仮想環境を更新または再作成する必要があるという長年の問題が解決します。
ただし、このリリースでは新しいスクリプトを使うために、まだ仮想環境の再作成が必要です。
Python 3.7.6 での重要な変更点¶
セキュリティ上の重大な懸念により、asyncio.loop.create_datagram_endpoint() での reuse_address 引数は無効になりました。これはソケットオプション SO_REUSEADDR のUDP における挙動が原因です。詳しくは、loop.create_datagram_endpoint() のドキュメントを参照してください。(Kyle Stanley, Antoine Pitrou, Yury Selivanov による貢献 bpo-37228)
Python 3.7.10 での重要な変更点¶
以前の Python では urllib.parse.parse_qs() と urllib.parse.parse_qsl() のクエリパラメータの区切りに ; と & の両方を使えました。
セキュリティ上の懸念と、新しい W3C 勧告への準拠のため、区切りは 1 種類のみとなり、デフォルトは & に変更されました。
これらの関数を内部で使う cgi.parse() と cgi.parse_multipart() も影響を受けます。
詳しくは各関数のドキュメントを参照してください。
(Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967.)
Python 3.7.11 の注目すべき変更¶
セキュリティ修正により、ftplib.FTP はパッシブデータチャネルを確立するとき、リモートサーバーから送られた IPv4 アドレスを信頼しなくなりました。
代わりに FTP サーバーの IP アドレスを再利用します。
従来の動作が必要な特殊なコードでは、FTP インスタンスの trust_server_pasv_ipv4_address 属性を True に設定してください (gh-87451 を参照)。
URL の一部に改行やタブ文字が含まれていると、特定の攻撃が可能になります。
RFC 3986 を更新する WHATWG 仕様に従い、パーサー urllib.parse() は ASCII の改行 \n、\r とタブ \t を URL から取り除き、このような攻撃を防ぐようになりました。
削除対象の文字は、新しいモジュール変数 urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE で制御します (gh-88048 を参照)。
3.7.14 の注目すべきセキュリティ機能¶
2 (2 進数)、4、8 (8 進数)、16 (16 進数)、32 以外の基数、例えば 10 (10 進数) で int と str を相互変換する際、文字列表記の桁数が上限を超えると ValueError を送出するようになりました。
アルゴリズムの計算量を悪用したサービス拒否攻撃を防ぐためで、CVE 2020-10735 の緩和策です。
この上限は、環境変数、コマンドラインフラグ、sys の API で設定または無効化できます。
整数の文字列変換の長さ制限 のドキュメントを参照してください。
デフォルトの上限は文字列表記で 4300 桁です。