Python3.7の新機能
- 編集者
- Elvis Pranskevichus < [email protected] >>
この記事では、3.6と比較したPython3.7の新機能について説明します。 Python3.7は2018年6月27日にリリースされました。 詳細については、 changelog を参照してください。
概要–リリースのハイライト
新しい構文機能:
- PEP 563 、型注釈の評価を延期しました。
後方互換性のない構文の変更:
新しいライブラリモジュール:
新しい組み込み機能:
- PEP 553 、新しい breakpoint()関数。
Pythonデータモデルの改善:
- PEP 562 、モジュール属性へのアクセスのカスタマイズ。
- PEP 560 、タイピングモジュールおよびジェネリック型のコアサポート。
- dict オブジェクトの挿入順序の保持の性質は、Python言語仕様の公式部分であると宣言されています。
標準ライブラリの大幅な改善:
- asyncio モジュールは、新しい機能、大幅なユーザビリティおよびパフォーマンスの改善を受け取りました。
- time モジュールは、ナノ秒の解像度で関数のサポートを獲得しました。
CPython実装の改善:
- デフォルトのテキストエンコーディングとしてASCIIを使用しないようにする:
- PEP 552 、決定論的.pycs
- 新しい開発ランタイムモード
- PEP 565 、 DeprecationWarning の処理を改善
C APIの改善:
- PEP 539 、スレッドローカルストレージ用の新しいC API
ドキュメントの改善:
このリリースでは、多くの領域でパフォーマンスが大幅に向上しています。 最適化セクションには、それらの詳細がリストされています。
以前の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
Python3.10ではデフォルトになります。
PEP 538:レガシーCロケール強制
Python 3シリーズ内で進行中の課題は、Windows以外のプラットフォームでデフォルトのCまたはPOSIXロケールを使用することによって現在暗示されている、「7ビットASCII」テキストエンコーディングの仮定を処理するための賢明なデフォルト戦略を決定することです。
PEP 538 は、デフォルトのインタープリターコマンドラインインターフェイスを更新して、新しい のドキュメントで説明されているように、そのロケールを使用可能なUTF-8ベースのロケールに自動的に強制します。 ] PYTHONCOERCECLOCALE 環境変数。 このようにLC_CTYPE
を自動的に設定すると、コアインタープリターとロケール対応のC拡張機能( readline など)の両方が、ASCIIではなくUTF-8の使用をデフォルトのテキストエンコーディングとして想定します。 。
PEP 11 のプラットフォームサポート定義も更新され、フルテキスト処理のサポートが適切に構成された非ASCIIベースのロケールに制限されるようになりました。
この変更の一環として、 stdin および stdout のデフォルトのエラーハンドラーは、定義済みのいずれかを使用する場合、(strict
ではなく)surrogateescape
になりました。強制ターゲットロケール(現在はC.UTF-8
、C.utf8
、およびUTF-8
)。 stderr のデフォルトのエラーハンドラーは、ロケールに関係なく、引き続きbackslashreplace
です。
ロケールの強制はデフォルトではサイレントですが、ロケールに関連する可能性のある統合の問題のデバッグを支援するために、PYTHONCOERCECLOCALE=warn
を設定することで明示的な警告( stderr で直接発行)を要求できます。 この設定により、コアインタープリターが初期化されたときにレガシーCロケールがアクティブのままである場合、Pythonランタイムは警告を発します。
PEP 538 のロケール強制には、拡張モジュール(GNU readline
など)や子プロセス(非実行プロセスを含む)にも影響を与えるという利点があります。 Pythonアプリケーションおよび古いバージョンのPython)には、実行中のシステムに適切なターゲットロケールが存在する必要があるという欠点があります。 適切なターゲットロケールが利用できない場合(たとえば、RHEL / CentOS 7で発生する)をより適切に処理するために、Python3.7は PEP 540:強制UTF-8ランタイムモードも実装します。
PEP 540:強制UTF-8ランタイムモード
新しい -X utf8
コマンドラインオプションと PYTHONUTF8 環境変数を使用して、CPython UTF-8モードを有効にできます[ X152X]。
UTF-8モードの場合、CPythonはロケール設定を無視し、デフォルトでUTF-8エンコーディングを使用します。 sys.stdin および sys.stdout ストリームのエラーハンドラーはsurrogateescape
に設定されます。
強制UTF-8モードを使用すると、埋め込みアプリケーションのロケール設定を変更せずに、埋め込みPythonインタープリターのテキスト処理動作を変更できます。
PEP 540 のUTF-8モードには、実行中のシステムで使用可能なロケールに関係なく機能するという利点がありますが、拡張モジュール( GNU readline
)として、Python以外のアプリケーションを実行する子プロセス、および古いバージョンのPythonを実行する子プロセス。 このようなコンポーネントと通信するときにテキストデータが破損するリスクを減らすために、Python3.7は PEP 540:Forced UTF-8 Runtime Mode も実装しています。
ロケールがC
またはPOSIX
であり、 PEP 538 ロケール強制機能がそれを変更できない場合、UTF-8モードはデフォルトで有効になっていますUTF-8ベースの代替(PYTHONCOERCECLOCALE=0
が設定されている、LC_ALL
が設定されている、または適切なターゲットロケールがないことが原因であるかどうか)。
PEP 553:組み込みbreakpoint()
Python 3.7には、Pythonデバッガーに入る簡単で一貫性のある方法として、新しい組み込みの breakpoint()関数が含まれています。
組み込みのbreakpoint()
は、 sys.breakpointhook()を呼び出します。 デフォルトでは、後者は pdb をインポートしてから、pdb.set_trace()
を呼び出しますが、sys.breakpointhook()
を選択した関数にバインドすることにより、breakpoint()
は任意のデバッガーに入ることができます。 さらに、環境変数 PYTHONBREAKPOINT を、選択したデバッガーの呼び出し可能変数に設定できます。 PYTHONBREAKPOINT=0
を設定して、組み込みのbreakpoint()
を完全に無効にします。
PEP 539:スレッドローカルストレージ用の新しいC API
PythonはスレッドローカルストレージをサポートするためのCAPIを提供しますが、 既存のスレッドローカルストレージ(TLS)API は、 int を使用して、すべてのプラットフォームでTLSキーを表します。 これは、公式にサポートされているプラットフォームでは一般的に問題ではありませんが、POSIXに準拠しておらず、実用的な意味で移植性もありません。
PEP 539 は、新しいスレッド固有ストレージ(TSS)API をCPythonに提供することでこれを変更します。これは、CPythonインタープリター内の既存のTLS APIの使用に取って代わり、非推奨になります。既存のAPI。 TSS APIは、 int の代わりに新しいタイプ Py_tss_t を使用してTSSキーを表します。不透明(OPAQUE)型の定義は、基盤となるTLS実装に依存する場合があります。 したがって、これにより、ネイティブTLSキーが int に安全にキャストできない方法で定義されているプラットフォームでCPythonを構築できるようになります。
ネイティブTLSキーが int に安全にキャストできない方法で定義されているプラットフォームでは、既存のTLS APIのすべての機能が動作せず、すぐに失敗を返すことに注意してください。 これは、古いAPIが確実に使用できないプラットフォームではサポートされておらず、そのようなサポートを追加するための努力が行われないことを明確に示しています。
PEP 562:モジュール属性へのアクセスのカスタマイズ
Python 3.7では、モジュールで__getattr__()
を定義でき、モジュール属性が見つからない場合は常にそれを呼び出します。 モジュールで__dir__()
を定義することもできるようになりました。
これが役立つ可能性のある典型的な例は、モジュール属性の非推奨と遅延読み込みです。
PEP 564:ナノ秒分解能の新しい時間関数
最新のシステムのクロックの解像度は、 time.time()関数とそのバリアントによって返される浮動小数点数の制限された精度を超える可能性があります。 精度の低下を回避するために、 PEP 564 は、既存のタイマー関数の6つの新しい「ナノ秒」バリアントを time モジュールに追加します。
time.clock_gettime_ns()
time.clock_settime_ns()
time.monotonic_ns()
time.perf_counter_ns()
time.process_time_ns()
time.time_ns()
新しい関数は、ナノ秒数を整数値として返します。
Measurements は、LinuxおよびWindowsでは、 time.time_ns()の解像度が time.time()の解像度の約3倍であることを示しています。
PEP 565:__main__でDeprecationWarningを表示する
DeprecationWarning のデフォルトの処理が変更され、これらの警告がデフォルトでもう一度表示されるようになりましたが、警告をトリガーするコードが __ main __ モジュールで直接実行されている場合に限ります。 その結果、単一ファイルスクリプトの開発者や、Pythonをインタラクティブに使用している開発者は、使用するAPIの非推奨警告が再び表示されるようになりますが、インポートされたアプリケーション、ライブラリ、フレームワークモジュールによってトリガーされる非推奨警告はデフォルトで非表示のままになります。
この変更の結果、標準ライブラリでは、開発者が3つの異なる非推奨警告動作から選択できるようになりました。
- FutureWarning :常にデフォルトで表示され、アプリケーションのエンドユーザーに表示されることを目的とした警告に推奨されます(例: 非推奨のアプリケーション構成設定の場合)。
- DeprecationWarning :デフォルトでは __ main __ にのみ表示され、テストの実行時に、バージョンのアップグレードによって動作が変更されたりエラーが発生したりする可能性がある他のPython開発者に表示されることを目的とした警告に推奨されます。
- PendingDeprecationWarning :デフォルトでは、テストの実行時にのみ表示されます。将来のバージョンアップグレードで、警告カテゴリが DeprecationWarning または FutureWarning に変更される場合を対象としています。
以前は、 DeprecationWarning と PendingDeprecationWarning の両方がテストの実行時にのみ表示されていました。つまり、開発者が主に単一ファイルスクリプトを記述したり、Pythonをインタラクティブに使用したりすると、使用したAPIの変更を壊して驚かされる可能性がありました。
PEP 560:typingモジュールとジェネリック型のコアサポート
当初、 PEP 484 は、コアCPythonインタープリターにまたはの変更を導入しないように設計されていました。 タイプヒントと typing モジュールがコミュニティで広く使用されているため、この制限はなくなりました。 PEPでは、2つの特別なメソッド__class_getitem__()
と__mro_entries__
が導入されています。これらのメソッドは、タイピングのほとんどのクラスと特別な構造で使用されるようになりました。 その結果、型を使用したさまざまな操作の速度が最大7倍になり、メタクラスの競合なしに汎用型を使用できるようになり、タイピングモジュールの長年のバグがいくつか修正されました。
PEP 552:ハッシュベースの.pycファイル
Pythonは従来、ソースメタデータ(最終変更のタイムスタンプとサイズ)をキャッシュファイルヘッダーに保存されていたソースメタデータと比較することにより、バイトコードキャッシュファイル(.pyc
ファイル)の最新性をチェックしてきました。生成されます。 この無効化方法には効果的ですが、欠点があります。 ファイルシステムのタイムスタンプが粗すぎると、Pythonはソースの更新を見逃し、ユーザーの混乱を招く可能性があります。 さらに、キャッシュファイルにタイムスタンプを含めることは、ビルドの再現性およびコンテンツベースのビルドシステムにとって問題があります。
PEP 552 は、pyc形式を拡張して、ソースタイムスタンプの代わりにソースファイルのハッシュを無効化に使用できるようにします。 このような.pyc
ファイルは「ハッシュベース」と呼ばれます。 デフォルトでは、Pythonは引き続きタイムスタンプベースの無効化を使用し、実行時にハッシュベースの.pyc
ファイルを生成しません。 ハッシュベースの.pyc
ファイルは、 py_compile または compileall で生成できます。
ハッシュベースの.pyc
ファイルには、チェック付きとチェックなしの2つのバリエーションがあります。 Pythonは、チェックされたハッシュベースの.pyc
ファイルを実行時に対応するソースファイルに対して検証しますが、チェックされていないハッシュベースのpycについては検証しません。 未チェックのハッシュベースの.pyc
ファイルは、Pythonの外部のシステム(ビルドシステムなど)が.pyc
ファイルを最新の状態に保つ責任がある環境で役立つパフォーマンスの最適化です。
詳細については、キャッシュされたバイトコードの無効化を参照してください。
開発ランタイムモード:-X dev
新しい -X dev
コマンドラインオプションまたは新しい PYTHONDEVMODE 環境変数を使用して、CPythonの開発モードを有効にできます。 ]。 開発モードの場合、CPythonは追加のランタイムチェックを実行しますが、これはコストがかかりすぎてデフォルトで有効にできません。 このモードの効果の詳細については、 -X dev
のドキュメントを参照してください。
その他の言語の変更
- await 式と、 async for 句を含む内包表記は、実装に問題があるため、形式の文字列リテラルの式では不正でした。 Python 3.7では、この制限が解除されました。
- 255を超える引数を関数に渡すことができるようになり、関数は255を超えるパラメーターを持つことができるようになりました。 (:issue: `12844` および:issue:` 18896` でSerhiyStorchakaによって寄稿されました。)
- bytes.fromhex()および bytearray.fromhex()は、スペースだけでなく、すべてのASCII空白を無視するようになりました。 (:issue: `28927` でRobertXiaoによって寄稿されました。)
- str 、 bytes 、および bytearray は、新しい isascii()メソッドのサポートを取得しました。バイトにはASCII文字のみが含まれます。 (:issue: `32677` でINADANaokiによって寄稿されました。)
- ImportError は、
from ... import ...
が失敗したときに、モジュール名とモジュール__file__
パスを表示するようになりました。 (:issue: `29546` でMatthiasBussonnierによって寄稿されました。) - サブモジュールを名前にバインドする絶対インポートを含む循環インポートがサポートされるようになりました。 (:issue: `30024` のSerhiyStorchakaによる寄稿。)
object.__format__(x, )
は、format(str(self),
)
ではなくstr(x)
と同等になりました。 (:issue: `28974` でSerhiyStorchakaによって寄稿されました。)- スタックトレースの動的作成をより適切にサポートするために、 types.TracebackType をPythonコードからインスタンス化できるようになり、 tracebacks の
tb_next
属性が書き込み可能になりました。 (NathanielJによる寄稿。 のスミス:issue: `30579` 。) - -m スイッチを使用する場合、
sys.path[0]
は、空のディレクトリ( current からのインポートを許可する)として残されるのではなく、完全な開始ディレクトリパスに熱心に展開されるようになりました。 ]インポートが発生したときの作業ディレクトリ)(:issue: `33053` のNickCoghlanによる寄稿) - 新しい -X
importtime
オプションまたは PYTHONPROFILEIMPORTTIME 環境変数を使用して、各モジュールのインポートのタイミングを表示できます。 (:issue: `31415` でVictorStinnerによって寄稿されました。)
新しいモジュール
contextvars
新しい contextvars モジュールと一連の新しいCAPI は、コンテキスト変数のサポートを導入します。 コンテキスト変数は、概念的にはスレッドローカル変数に似ています。 TLSとは異なり、コンテキスト変数は非同期コードを正しくサポートします。
asyncio および decimal モジュールが更新され、すぐに使用できるコンテキスト変数を使用およびサポートできるようになりました。 特に、アクティブな10進コンテキストはコンテキスト変数に格納されるようになりました。これにより、10進演算が非同期コードの正しいコンテキストで機能できるようになります。
データクラス
新しい dataclass()デコレータは、データクラスを宣言する方法を提供します。 データクラスは、クラス変数アノテーションを使用してその属性を記述します。 そのコンストラクターと、 __ repr __()、 __ eq __()、 __ hash __()などの他のマジックメソッドが自動的に生成されます。
例:
@dataclass
class Point:
x: float
y: float
z: float = 0.0
p = Point(1.5, 2.5)
print(p) # produces "Point(x=1.5, y=2.5, z=0.0)"
importlib.resources
新しい importlib.resources モジュールは、パッケージ内の resources にアクセスし、開いて、読み取るためのいくつかの新しいAPIと1つの新しいABCを提供します。 リソースはパッケージ内のファイルとほぼ同じですが、物理ファイルシステム上の実際のファイルである必要はありません。 モジュールローダーは、この新しいAPIをサポートするために importlib.abc.ResourceReader インスタンスを返すget_resource_reader()
関数を提供できます。 組み込みのファイルパスローダーとzipファイルローダーの両方がこれをサポートしています。
:issue: `32248` でBarryWarsawとBrettCannonによって寄稿されました。
改善されたモジュール
argparse
新しい ArgumentParser.parse_intermixed_args()メソッドでは、オプションと位置引数を混在させることができます。 (:issue: `14191` のpaul.j3によって寄稿されました。)
asyncio
asyncio モジュールは、多くの新機能、使いやすさ、パフォーマンスの向上を受け取りました。 注目すべき変更点は次のとおりです。
新しい provisional asyncio.run()関数を使用すると、イベントループを自動的に作成して破棄することにより、同期コードからコルーチンを実行できます。 (:issue: `32314` でYurySelivanovによって寄稿されました。)
asyncioは contextvars のサポートを取得しました。 loop.call_soon()、 loop.call_soon_threadsafe()、 loop.call_later()、 loop.call_at()、および[ X122X] Future.add_done_callback()には、新しいオプションのキーワードのみの context パラメーターがあります。 タスクは、コンテキストを自動的に追跡するようになりました。 詳細については、 PEP 567 を参照してください。 (:issue: `32436` でYurySelivanovによって寄稿されました。)
新しい asyncio.create_task()関数が、
asyncio.get_event_loop().create_task()
へのショートカットとして追加されました。 (:issue: `32311` でAndrewSvetlovによって寄稿されました。)新しい
loop.start_tls()
メソッドを使用して、既存の接続をTLSにアップグレードできます。 (:issue: `23749` でYurySelivanovによって寄稿されました。)新しい
loop.sock_recv_into()
メソッドを使用すると、ソケットから提供されたバッファーに直接データを読み取ることができ、データのコピーを減らすことができます。 (:issue: `31819` のAntoinePitrouによる寄稿。)新しい asyncio.current_task()関数は、現在実行中の Task インスタンスを返し、新しい asyncio.all_tasks()関数は、既存のすべての
Task
特定のループ内のインスタンス。 Task.current_task()および Task.all_tasks()メソッドは非推奨になりました。 (:issue: `32250` でAndrewSvetlovによって寄稿されました。)新しい provisional BufferedProtocol クラスを使用すると、受信バッファーを手動で制御してストリーミングプロトコルを実装できます。 (:issue: `32251` でYurySelivanovによって寄稿されました。)
新しい asyncio.get_running_loop()関数は、現在実行中のループを返し、ループが実行されていない場合は RuntimeError を発生させます。 これは、 asyncio.get_event_loop()とは対照的です。 asyncio.get_event_loop()は、何も実行されていない場合に新しいイベントループを作成します。 (:issue: `32269` でYurySelivanovによって寄稿されました。)
新しい
StreamWriter.wait_closed()
コルーチンメソッドでは、ストリームライターが閉じられるまで待機できます。 新しい StreamWriter.is_closeing()メソッドを使用して、ライターが閉じているかどうかを判別できます。 (:issue: `32391` でAndrewSvetlovによって寄稿されました。)新しい
loop.sock_sendfile()
コルーチンメソッドでは、可能な場合は os.sendfile を使用してファイルを送信できます。 (:issue: `32410` でAndrewSvetlovによって寄稿されました。)新しい Future.get_loop()および
Task.get_loop()
メソッドは、タスクまたはフューチャーが作成されたループのインスタンスを返します。 Server.get_loop()を使用すると、 asyncio.Server オブジェクトに対して同じことを実行できます。 (:issue: `32415` のYurySelivanovと:issue:` 32418` のSrinivasReddy Thatiparthyによる寄稿。)asyncio.Server のインスタンスがどのようにサービスを開始するかを制御できるようになりました。 以前は、サーバーは作成されるとすぐにサービスを開始していました。
loop.create_server()
とloop.create_unix_server()
、およびServer.start_serving()
とServer.serve_forever()
への新しい start_serving キーワード引数を使用して、サーバーのインスタンス化を切り離すことができますとサービング。 新しい Server.is_serving()メソッドは、サーバーがサービスを提供している場合、True
を返します。 Server オブジェクトは非同期コンテキストマネージャーになりました。srv = await loop.create_server(...) async with srv: # some code # At this point, srv is closed and no longer accepts new connections.
(:issue: `32662` でYurySelivanovによって寄稿されました。)
loop.call_later()によって返されるコールバックオブジェクトは、絶対スケジュールされたコールバックタイムスタンプを返す新しい when()メソッドを取得しました。 (:issue: `32741` でAndrewSvetlovによって寄稿されました。)
loop.create_datagram_endpoint()
メソッドは、Unixソケットのサポートを獲得しました。 (:issue: `31245` のQuentinDawansによる寄稿。)asyncio.open_connection()
、asyncio.start_server()
関数、loop.create_connection()
、loop.create_server()
、loop.create_accepted_socket()
メソッドおよびそれらに対応するUNIXソケットバリアントは、 ssl_handshake_timeoutを受け入れるようになりました。 キーワード引数。 (:issue: `29970` のNeilAspinallによる寄稿。)新しい Handle.cancelled()メソッドは、コールバックがキャンセルされた場合、
True
を返します。 (:issue: `31943` でMaratSharafutdinovによって寄稿されました。)asyncioソースは、 async / await 構文を使用するように変換されています。 (:issue: `32193` でAndrewSvetlovによって寄稿されました。)
新しい ReadTransport.is_reading()メソッドを使用して、トランスポートの読み取り状態を判別できます。 さらに、 ReadTransport.resume_reading()および ReadTransport.pause_reading()の呼び出しはべき等になりました。 (:issue: `32356` でYurySelivanovによって寄稿されました。)
ソケットパスを受け入れるループメソッドは、パスのようなオブジェクトの受け渡しをサポートするようになりました。 (:issue: `32066` でYurySelivanovによって寄稿されました。)
asyncio では、Linux上のTCPソケットが、デフォルトで
TCP_NODELAY
フラグが設定された状態で作成されるようになりました。 (:issue: `27456` でYurySelivanovとVictorStinnerによって寄稿されました。)キャンセルされたタスクで発生した例外はログに記録されなくなりました。 (:issue: `30508` でYurySelivanovによって寄稿されました。)
新しい
WindowsSelectorEventLoopPolicy
およびWindowsProactorEventLoopPolicy
クラス。 (:issue: `33792` でYurySelivanovによって寄稿されました。)
いくつかのasyncio
APIは非推奨になりました。
binascii
b2a_uu()関数は、オプションの backtick キーワード引数を受け入れるようになりました。 trueの場合、ゼロはスペースではなく'`'
で表されます。 (:issue: `30103` のXiangZhangによる寄稿。)
カレンダー
HTMLCalendar クラスには、作成されたHTMLカレンダーのCSSクラスのカスタマイズを容易にする新しいクラス属性があります。 (:issue: `30095` のOzTiramによる寄稿。)
コレクション
collections.namedtuple()
がデフォルト値をサポートするようになりました。 (:issue: `32320` でRaymondHettingerによって寄稿されました。)
compileall
compileall.compile_dir()は、ハッシュベースの.pyc無効化を有効にするために使用できる新しい invalidation_mode パラメーターを学習しました。 無効化モードは、新しい--invalidation-mode
引数を使用してコマンドラインで指定することもできます。 (:issue: `31650` でBenjaminPetersonによって寄稿されました。)
コンカレント.futures
ProcessPoolExecutor および ThreadPoolExecutor は、新しい initializer および initargs コンストラクター引数をサポートするようになりました。 (:issue: `21423` のAntoinePitrouによる寄稿。)
ProcessPoolExecutor は、新しい mp_context 引数を介してマルチプロセッシングコンテキストを取得できるようになりました。 (:issue: `31540` でThomasMoreauによって寄稿されました。)
contextlib
新しい nullcontext()は、 ExitStack よりもシンプルで高速なno-opコンテキストマネージャーです。 (:issue: `10049` でJesse-Bakkerによって寄稿されました。)
新しい asynccontextmanager()、 AbstractAsyncContextManager 、および AsyncExitStack が追加され、対応する同期を補完します。 (:issue: `29679` と:issue:` 30241` のJelleZijlstra、:issue: `29302` [のAlexanderMohrとIlyaKulakovによる寄稿X147X]。)
cProfile
cProfile コマンドラインは、スクリプトパスの代わりに-m module_name
を受け入れるようになりました。 (:issue: `21862` でSanyamKhuranaによって寄稿されました。)
陰窩
crypt モジュールは、Blowfishハッシュメソッドをサポートするようになりました。 (:issue: `31664` のSerhiyStorchakaによる寄稿。)
mksalt()関数で、ハッシュのラウンド数を指定できるようになりました。 (:issue: `31702` のSerhiyStorchakaによる寄稿。)
日付時刻
新しい datetime.fromisoformat()メソッドは、 datetime.isoformat()によって出力された形式のいずれかの文字列から datetime オブジェクトを作成します。 (:issue: `15873` でPaulGanssleによって寄稿されました。)
tzinfo クラスは、1分未満のオフセットをサポートするようになりました。 (:issue: `5288` でAlexanderBelopolskyによって寄稿されました。)
dis
dis()関数は、ネストされたコードオブジェクト(内包表記、ジェネレータ式、ネストされた関数のコード、およびネストされたクラスの構築に使用されるコード)を分解できるようになりました。 分解再帰の最大深度は、新しい depth パラメーターによって制御されます。 (:issue: `11822` のSerhiyStorchakaによる寄稿。)
distutils
README.rst
は、distutilsの標準READMEのリストに含まれているため、ソースディストリビューションに含まれています。 (:issue: `11913` でRyanGonzalezによって寄稿されました。)
列挙型
Enum は、新しい_ignore_
クラスプロパティを学習しました。これにより、列挙型メンバーになるべきではないプロパティの名前を一覧表示できます。 (:issue: `31801` でEthanFurmanによって寄稿されました。)
Python 3.8では、Enum
クラスで非列挙型オブジェクトをチェックしようとすると、 TypeError が発生します(例: 1 in Color
); 同様に、Flag
メンバーの非フラグオブジェクトをチェックしようとすると、 TypeError が発生します(例: 1 in Perm.RW
); 現在、両方の操作は代わりに False を返し、非推奨になりました。 (:issue: `33217` でEthanFurmanによって寄稿されました。)
functools
functools.singledispatch()は、型注釈を使用した実装の登録をサポートするようになりました。 (:issue: `32227` のŁukaszLangaによる寄稿。)
gc
新しい gc.freeze()関数を使用すると、ガベージコレクターによって追跡されたすべてのオブジェクトをフリーズし、将来のコレクションから除外できます。 これは、POSIX fork()
呼び出しの前に使用して、GCのコピーオンライトを使いやすくしたり、収集を高速化したりできます。 新しい gc.unfreeze()関数は、この操作を逆にします。 さらに、 gc.get_freeze_count()を使用して、フリーズされたオブジェクトの数を取得できます。 (:issue: `31558` でLiZekunによって寄稿されました。)
hmac
hmac モジュールには、HMAC()
よりも最大3倍高速な最適化されたワンショット digest()関数が追加されました。 (:issue: `32433` のChristianHeimesによる寄稿。)
http.client
HTTPConnection および HTTPSConnection は、アップロードスループットを向上させるための新しい blocksize 引数をサポートするようになりました。 (:issue: `31945` でNirSofferによって寄稿されました。)
http.server
SimpleHTTPRequestHandler がHTTP If-Modified-Since
ヘッダーをサポートするようになりました。 ヘッダーで指定された時間後にターゲットファイルが変更されなかった場合、サーバーは304応答ステータスを返します。 (:issue: `29654` でPierreQuentelによって寄稿されました。)
SimpleHTTPRequestHandler は、新しい--directory
コマンドライン引数に加えて、新しいディレクトリ引数を受け入れます。 このパラメータを使用すると、サーバーは指定されたディレクトリにサービスを提供します。デフォルトでは、サーバーは現在の作業ディレクトリを使用します。 (:issue: `28707` でStéphaneWirtelとJulienPalardによって寄稿されました。)
新しい ThreadingHTTPServer クラスは、スレッドを使用してThreadingMixin
を使用するリクエストを処理します。 http.server
を-m
で実行する場合に使用します。 (:issue: `31639` でJulienPalardによって寄稿されました。)
idlelibとIDLE
オートコンプリートの複数の修正。 (:issue: `15786` のLouieLuによる寄稿。)
モジュールブラウザ(以前はクラスブラウザと呼ばれていました)は、トップレベルの関数とクラスに加えて、ネストされた関数とクラスを表示するようになりました。 (:issue: `1612262` で、Guilherme Polo、Cheryl Sabella、およびTerry Jan Reedyによって寄稿されました。)
[設定]ダイアログ([オプション]、[IDLEの構成])は、外観と機能の両方を改善するために部分的に書き直されました。 (CherylSabellaとTerryJan Reedyが複数の問題で寄稿しました。)
フォントサンプルには、ユーザーが特定のフォントを選択した場合の効果をよりよく確認できるように、非ラテン文字の選択が含まれるようになりました。 (:issue: `13802` のTerryJan Reedyによる寄稿。)サンプルを編集して、他のキャラクターを含めることができます。 (:issue: `31860` でSerhiyStorchakaによって寄稿されました。)
以前は拡張機能として実装されていたIDLE機能が、通常の機能として再実装されました。 それらの設定は、[拡張機能]タブから他のダイアログタブに移動されました。 (:issue: `27099` でCharlesWohlgangerとTerryJan Reedyによって寄稿されました。)
エディタコードのコンテキストオプションが改訂されました。 ボックスには、maxlinesまでのすべてのコンテキスト行が表示されます。 コンテキスト行をクリックすると、エディターがその行にジャンプします。 カスタムテーマのコンテキストカラーが[設定]ダイアログの[ハイライト]タブに追加されました。 (:issue: `33642` 、:issue:` 33768` 、および:issue: `33679` でCherylSabellaとTerryJanReedyによって寄稿されました。 )。
Windowsでは、新しいAPI呼び出しにより、tkがDPIに合わせてスケーリングすることがWindowsに通知されます。 Windows 8.1以降または10では、PythonバイナリのDPI互換性プロパティは変更されておらず、モニターの解像度は96 DPIを超えているため、テキストと線が鮮明になります。 それ以外の場合は効果がないはずです。 (:issue: `33656` でTerryJan Reedyによって寄稿されました。)
3.7.1の新機能:
N行(デフォルトでは50)を超える出力は、ボタンに絞り込まれます。 Nは、[設定]ダイアログの[一般]ページの[PyShell]セクションで変更できます。 出力を右クリックすることで、より少ないが、場合によっては非常に長い行を絞ることができます。 スクイーズされた出力は、ボタンをダブルクリックして所定の位置に展開するか、ボタンを右クリックしてクリップボードまたは別のウィンドウに展開できます。 (:issue: `1529353` のTalEinatによる寄稿。)
上記の変更は、3.6メンテナンスリリースにバックポートされています。
3.7.4の新機能:
カスタマイズされた設定でモジュールを実行するには、「実行」メニューに「カスタマイズされた実行」を追加します。 入力されたコマンドライン引数はすべてsys.argvに追加されます。 それらは、次のカスタマイズされた実行のためにボックスに再表示されます。 通常のシェルメインモジュールの再起動を抑制することもできます。 (:issue: `5680` および:issue:` 37627` で、Cheryl Sabella、Terry Jan Reedyなどによって寄稿されました。)
3.7.5の新機能:
IDLEエディタウィンドウのオプションの行番号を追加します。 構成ダイアログの「一般」タブで特に設定されていない限り、ウィンドウは行番号なしで開きます。 既存のウィンドウの行番号は、[オプション]メニューに表示および非表示になります。 (:issue: `17535` でTalEinatとSaimadhavHeblikarによって寄稿されました。)
importlib
importlib.abc.ResourceReader ABCは、パッケージからのリソースのロードをサポートするために導入されました。 importlib.resources も参照してください。 (:issue: `32248` のBarryWarsaw、Brett Cannonによる寄稿。)
importlib.reload()は、モジュールに仕様がない場合に ModuleNotFoundError を発生させるようになりました。 (:issue: `29851` でGarvitKhatriによって寄稿されました。)
importlib.find_spec()
は、指定された親モジュールがパッケージでない場合(つまり、 AttributeError ではなく ModuleNotFoundError を発生させるようになりました。 __path__
属性がありません)。 (:issue: `30436` でMilanOberkirchによって寄稿されました。)
新しいimportlib.source_hash()
を使用して、渡されたソースのハッシュを計算できます。 ハッシュベースの.pycファイルは、この関数によって返される値を埋め込みます。
io
新しい TextIOWrapper.reconfigure()メソッドを使用して、新しい設定でテキストストリームを再構成できます。 (:issue: `30526` のAntoinePitrouと:issue:` 15216` のINADANaokiによる寄稿。)
IPアドレス
ipaddress.IPv6Network および ipaddress.IPv4Network の新しいsubnet_of()
およびsupernet_of()
メソッドは、ネットワーク封じ込めテストに使用できます。 (:issue: `20825` でMichelAlbertとCherylSabellaによって寄稿されました。)
itertools
itertools.islice()は、開始、停止、およびスライス引数として整数のようなオブジェクトを受け入れるようになりました。 (:issue: `30537` でWillRobertsによって寄稿されました。)
ロケール
locale.format_string()への新しい moneyary 引数を使用して、変換で数千の金銭的な区切り文字とグループ化文字列を使用することができます。 (:issue: `10379` でGarvitによって寄稿されました。)
locale.getpreferredencoding()関数は、Androidの場合、または強制UTF-8モードの場合、常に'UTF-8'
を返すようになりました。
ロギング
Logger インスタンスをpickle化できるようになりました。 (:issue: `30520` のVinaySajipによる寄稿。)
新しい StreamHandler.setStream()メソッドを使用して、ハンドラーの作成後にロガーストリームを置き換えることができます。 (:issue: `30522` のVinaySajipによる寄稿。)
logging.config.fileConfig()に渡される構成で、ハンドラーコンストラクターにキーワード引数を指定できるようになりました。 (:issue: `31080` でPrestonLandersによって寄稿されました。)
mimetypes
.bmpのMIMEタイプが'image/x-ms-bmp'
から'image/bmp'
に変更されました。 (:issue: `22589` でNitishChandraによって寄稿されました。)
マルチプロセッシング
新しい Process.close()メソッドは、プロセスオブジェクトを明示的に閉じ、それに関連付けられているすべてのリソースを解放します。 ValueError は、基になるプロセスがまだ実行中の場合に発生します。 (:issue: `30596` のAntoinePitrouによる寄稿。)
新しい Process.kill()メソッドを使用すると、UnixでSIGKILL
シグナルを使用してプロセスを終了できます。 (:issue: `30794` でVitorPereiraによって寄稿されました。)
Process によって作成された非デーモンスレッドは、プロセスの終了時に結合されるようになりました。 (:issue: `18966` のAntoinePitrouによる寄稿。)
os
os.fwalk()は、 path 引数を bytes として受け入れるようになりました。 (:issue: `28682` のSerhiyStorchakaによる寄稿。)
os.scandir()は、ファイル記述子のサポートを取得しました。 (:issue: `25996` でSerhiyStorchakaによって寄稿されました。)
新しい register_at_fork()関数を使用すると、Pythonコールバックの登録をプロセスforkで実行できます。 (:issue: `16500` のAntoinePitrouによる寄稿。)
os.preadv()( os.readv()と os.pread()の機能を組み合わせる)と os.pwritev()を追加しました関数( os.writev()と os.pwrite()の機能を組み合わせます)。 (:issue: `31368` のPabloGalindoによる寄稿。)
os.makedirs()のmode引数は、新しく作成された中間レベルのディレクトリのファイル許可ビットに影響を与えなくなりました。 (:issue: `19930` でSerhiyStorchakaによって寄稿されました。)
os.dup2()は、新しいファイル記述子を返すようになりました。 以前は、None
は常に返されていました。 (:issue: `32441` でBenjaminPetersonによって寄稿されました。)
os.stat()によって返される構造には、Solarisおよびその派生物の st_fstype 属性が含まれるようになりました。 (:issue: `32659` でJesúsCeaAviónによって寄稿されました。)
pathlib
新しい Path.is_mount()メソッドがPOSIXシステムで使用可能になり、パスがマウントポイントであるかどうかを判別するために使用できるようになりました。 (:issue: `30897` のCooperRy Leesによる寄稿。)
pdb
pdb.set_trace()は、オプションの header キーワードのみの引数を取るようになりました。 指定した場合、デバッグが開始される直前にコンソールに出力されます。 (:issue: `31389` でBarryWarsawによって寄稿されました。)
pdb コマンドラインは、スクリプトファイルの代わりに-m module_name
を受け入れるようになりました。 (:issue: `32206` でMarioCorcheroによって寄稿されました。)
py_compile
py_compile.compile() –ひいては、 compileall –は、.pyc
を無条件に作成することにより、 SOURCE_DATE_EPOCH
環境変数を尊重するようになりました。ハッシュベースの検証用のファイル。 これにより、.pyc
ファイルが熱心に作成されたときに、再現性のあるビルドを保証できます。 (BernhardMによる寄稿。 Wiedemann in :issue: `29708` 。)
pydoc
pydocサーバーは、新しい-n
コマンドライン引数で指定された任意のホスト名にバインドできるようになりました。 (:issue: `31128` でFeanilPatelによって寄稿されました。)
NS
フラグ re.ASCII 、 re.LOCALE 、およびre.UNICODE
は、グループのスコープ内で設定できます。 (:issue: `31690` のSerhiyStorchakaによる寄稿。)
re.split()は、空の文字列に一致するr'\b'
、'^$'
、(?=-)
などのパターンでの分割をサポートするようになりました。 (:issue: `25054` のSerhiyStorchakaによる寄稿。)
re.LOCALE フラグを使用してコンパイルされた正規表現は、コンパイル時のロケールに依存しなくなりました。 ロケール設定は、コンパイルされた正規表現が使用される場合にのみ適用されます。 (:issue: `30215` のSerhiyStorchakaによる寄稿。)
FutureWarning は、正規表現に、ネストされたセットやセット操作など、将来意味的に変更される文字セット構造が含まれている場合に発行されるようになりました。 (:issue: `30349` でSerhiyStorchakaによって寄稿されました。)
コンパイルされた正規表現と一致オブジェクトは、 copy.copy()および copy.deepcopy()を使用してコピーできるようになりました。 (:issue: `10076` のSerhiyStorchakaによる寄稿。)
信号
signal.set_wakeup_fd()関数の新しい warn_on_full_buffer 引数により、ウェイクアップバッファがオーバーフローしたときにPythonがstderrに警告を出力するかどうかを指定できます。 (NathanielJによる寄稿。 のSmith:issue: `30050` 。)
ソケット
新しい socket.getblocking()メソッドは、ソケットがブロッキングモードの場合はTrue
を返し、それ以外の場合はFalse
を返します。 (:issue: `32373` でYurySelivanovによって寄稿されました。)
新しい socket.close()関数は、渡されたソケットファイル記述子を閉じます。 プラットフォーム間の互換性を高めるために、 os.close()の代わりにこの関数を使用する必要があります。 (:issue: `32454` のChristianHeimesによる寄稿。)
socket モジュールは、socket.TCP_CONGESTION
(Linux 2.6.13)、socket.TCP_USER_TIMEOUT
(Linux 2.6.37)、およびsocket.TCP_NOTSENT_LOWAT
(Linux 3.12)定数を公開するようになりました。 。 (:issue: `26273` およびNathanielJでOmarSandovalによって寄稿されました。 のSmith:issue: `29728` 。)
socket.AF_VSOCK ソケットのサポートが追加され、仮想マシンとそのホスト間の通信が可能になりました。 (:issue: `27584` のCathyAveryによる寄稿。)
ソケットは、デフォルトでファイル記述子からファミリ、タイプ、およびプロトコルを自動検出するようになりました。 (:issue: `28134` でChristianHeimesによって寄稿されました。)
ソケットサーバー
socketserver.ThreadingMixIn.server_close()
は、デーモン以外のすべてのスレッドが完了するまで待機するようになりました。 socketserver.ForkingMixIn.server_close()
は、すべての子プロセスが完了するまで待機するようになりました。
新しいsocketserver.ForkingMixIn.block_on_close
クラス属性を socketserver.ForkingMixIn および socketserver.ThreadingMixIn クラスに追加します。 class属性をFalse
に設定して、3.7より前の動作を取得します。
sqlite3
sqlite3.Connection は、基盤となるSQLiteライブラリがバージョン3.6.11以降の場合に、 backup()メソッドを公開するようになりました。 (:issue: `27645` のLeleGaifaxによる寄稿。)
sqlite3.connect()の database 引数は、文字列だけでなく、パスのようなオブジェクトを受け入れるようになりました。 (:issue: `31843` でAndersLorentsenによって寄稿されました。)
ssl
ssl モジュールは、 match_hostname()の代わりにOpenSSLの組み込みAPIを使用して、ホスト名またはIPアドレスをチェックするようになりました。 値はTLSハンドシェイク中に検証されます。 ホスト名チェックの失敗を含む証明書検証エラーは、 SSLCertVerificationError を発生させ、適切なTLSアラートメッセージでハンドシェイクを中止するようになりました。 新しい例外には追加情報が含まれています。 ホスト名の検証は、 SSLContext.hostname_checks_common_name を使用してカスタマイズできます。 (:issue: `31399` でChristianHeimesによって寄稿されました。)
ノート
改善されたホスト名チェックには、OpenSSL1.0.2または1.1と互換性のある libssl 実装が必要です。 その結果、OpenSSL 0.9.8および1.0.1はサポートされなくなりました(詳細については、プラットフォームサポートの削除を参照してください)。 sslモジュールは、LibreSSL2.7.2以降とほとんど互換性があります。
ssl
モジュールは、SNITLS拡張でIPアドレスを送信しなくなりました。 (:issue: `32185` でChristianHeimesによって寄稿されました。)
match_hostname()は、www*.example.org
のような部分的なワイルドカードをサポートしなくなりました。 (:issue: `23033` のMandeepSinghおよび:issue:` 31399` のChristianHeimesによる寄稿。)
ssl
モジュールのデフォルトの暗号スイートの選択では、ハードコードされたホワイトリストではなく、ブラックリストアプローチが使用されるようになりました。 Pythonは、OpenSSLセキュリティアップデートによってブロックされた暗号を再度有効にしなくなりました。 デフォルトの暗号スイートの選択は、コンパイル時に構成できます。 (:issue: `31429` でChristianHeimesによって寄稿されました。)
国際化ドメイン名(IDN)を含むサーバー証明書の検証がサポートされるようになりました。 この変更の一環として、 SSLSocket.server_hostname 属性は、予期されるホスト名をUラベル形式("pythön.org"
ではなくAラベル形式("xn--pythn-mua.org"
)で格納するようになりました。 )。 (NathanielJによる寄稿。 のSmithとChristianHeimes:issue: `28414` 。)
ssl
モジュールは、TLS1.3およびOpenSSL1.1.1を予備的および実験的にサポートしています。 Python 3.7.0のリリース時点では、OpenSSL 1.1.1はまだ開発中であり、TLS1.3はまだ完成していません。 TLS 1.3ハンドシェイクとプロトコルの動作は、TLS1.2以前とは少し異なります。 TLS1.3 を参照してください。 (:issue: `32947` 、:issue:` 20995` 、:issue: `29136` 、:issueのChristianHeimesによる寄稿: `30622` および:issue:` 33618` )
SSLSocket および SSLObject にはパブリックコンストラクターがなくなりました。 直接インスタンス化は、文書化されサポートされている機能ではありませんでした。 インスタンスは、 SSLContext メソッド wrap_socket()および wrap_bio()を使用して作成する必要があります。 (:issue: `32951` のChristianHeimesによる寄稿)
TLSプロトコルの最小バージョンと最大バージョンを設定するためのOpenSSL1.1 APIは、 SSLContext.minimum_version および SSLContext.maximum_version として入手できます。 サポートされているプロトコルは、 HAS_TLSv1_1 などのいくつかの新しいフラグで示されます。 (:issue: `32609` のChristianHeimesによる寄稿。)
ストリング
string.Template では、オプションで、ブレース付きプレースホルダーとブレースなしプレースホルダーの正規表現パターンを個別に変更できるようになりました。 (:issue: `1198569` でBarryWarsawによって寄稿されました。)
サブプロセス
subprocess.run()関数は、新しい caption_output キーワード引数を受け入れます。 trueの場合、stdoutとstderrがキャプチャされます。 これは、 subprocess.PIPE を stdout および stderr 引数として渡すことと同じです。 (:issue: `32102` でBoBaylesによって寄稿されました。)
subprocess.run
関数と subprocess.Popen コンストラクターは、 text キーワード引数を universal_newlines のエイリアスとして受け入れるようになりました。 (:issue: `31756` でAndrewCleggによって寄稿されました。)
Windowsでは、標準ハンドルをリダイレクトするときに、 close_fds のデフォルトがFalse
からTrue
に変更されました。 標準ハンドルをリダイレクトするときに close_fds をtrueに設定できるようになりました。 subprocess.Popen を参照してください。 これは、サポートされているすべてのプラットフォームで、 close_fds がデフォルトでTrue
になったことを意味します。 (:issue: `19764` でSegevFinerによって寄稿されました。)
subprocess.call()、 subprocess.run()、または Popen で KeyboardInterrupt を処理するときに、サブプロセスモジュールがより適切になりました。 ]コンテキストマネージャー。 KeyboardInterrupt
例外の処理を続行する前に、子が終了するまで短時間待機するようになりました。 (GregoryPによる寄稿。 のSmith:issue: `25942` 。)
sys
新しい sys.breakpointhook()フック関数は、組み込みの breakpoint()によって呼び出されます。 (:issue: `31353` でBarryWarsawによって寄稿されました。)
Androidでは、新しい sys.getandroidapilevel()はビルド時のAndroidAPIバージョンを返します。 (:issue: `28740` でVictorStinnerによって寄稿されました。)
新しい sys.get_coroutine_origin_tracking_depth()関数は、新しい sys.set_coroutine_origin_tracking_depth()によって設定された、現在のコルーチン原点追跡深度を返します。 asyncio は、非推奨のsys.set_coroutine_wrapper()
の代わりにこの新しいAPIを使用するように変換されました。 (NathanielJによる寄稿。 のSmith:issue: `32591` 。)
時間
PEP 564 は、 time モジュールにナノ秒の解像度を持つ6つの新しい関数を追加します。
time.clock_gettime_ns()
time.clock_settime_ns()
time.monotonic_ns()
time.perf_counter_ns()
time.process_time_ns()
time.time_ns()
新しいクロック識別子が追加されました:
- 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時間の測定値を取得できます。 (:issue: `32025` のAntoinePitrouによる寄稿。)
新しい time.pthread_getcpuclockid()関数は、スレッド固有のCPU時間クロックのクロックIDを返します。
tracemalloc
tracemalloc.Traceback は、通常のトレースバックのように動作し、フレームを古いものから新しいものへと並べ替えます。 Traceback.format()は、負の limit を受け入れるようになり、結果をabs(limit)
の最も古いフレームに切り捨てます。 古い動作を取得するには、Traceback.format()
への新しい most_recent_first 引数を使用します。 (:issue: `32121` でJesseBakkerによって寄稿されました。)
のデータ型
新しい WrapperDescriptorType 、 MethodWrapperType 、 MethodDescriptorType 、および ClassMethodDescriptorType クラスが利用可能になりました。 (:issue: `29377` のManuelKrebberとGuidovan Rossum、および:issue:` 32265` のSerhiyStorchakaによる寄稿。)
新しい types.resolve_bases()関数は、 PEP 560 で指定されているようにMROエントリを動的に解決します。 (:issue: `32717` でIvanLevkivskyiによって寄稿されました。)
単体テスト
新しい-k
コマンドラインオプションを使用すると、名前の部分文字列またはUnixシェルのようなパターンでテストをフィルタリングできます。 たとえば、python -m unittest -k foo
はfoo_tests.SomeTest.test_something
、bar_tests.SomeTest.test_foo
を実行しますが、bar_tests.FooTest.test_something
は実行しません。 (:issue: `32071` でJonasHaagによって寄稿されました。)
unittest.mock
sentinel 属性は、コピーまたはピクルスのときにIDを保持するようになりました。 (:issue: `20804` のSerhiyStorchakaによる寄稿。)
新しい seal()関数を使用すると、 Mock インスタンスをシールできます。これにより、属性モックをこれ以上作成できなくなります。 シールは、それ自体がモックであるすべての属性に再帰的に適用されます。 (:issue: `30541` でMarioCorcheroによって寄稿されました。)
urllib.parse
urllib.parse.quote()が RFC 2396 から RFC 3986 に更新され、[X117X ] デフォルトで引用されることのない文字のセット。 (:issue: `16285` でChristianTheuneとRatnadeepDebnathによって寄稿されました。)
uu
uu.encode()関数は、オプションの backtick キーワード引数を受け入れるようになりました。 trueの場合、ゼロはスペースではなく'`'
で表されます。 (:issue: `30103` のXiangZhangによる寄稿。)
uuid
新しい UUID.is_safe 属性は、生成されたUUIDがマルチプロセッシングセーフメソッドで生成されたかどうかに関する情報をプラットフォームから中継します。 (:issue: `22807` でBarryWarsawによって寄稿されました。)
uuid.getnode()は、ローカルで管理されているMACアドレスよりもユニバーサルに管理されているMACアドレスを優先するようになりました。 これにより、 uuid.uuid1()から返されるUUIDのグローバルな一意性がより確実になります。 ローカルで管理されているMACアドレスのみが使用可能な場合、最初に見つかったMACアドレスが返されます。 (:issue: `32107` でBarryWarsawによって寄稿されました。)
警告
デフォルトの警告フィルターの初期化は次のように変更されました。
コマンドラインオプション( -b および新しいCPython固有の -X
dev
オプションの警告を含む)を介して有効にされた警告は、常に[ X186X] sys.warnoptions 属性。コマンドラインまたは環境を介して有効にされた警告フィルターの優先順位は次のとおりです。
-b (または
-bb
)のBytesWarning
フィルター-W オプションで指定されたフィルター
PYTHONWARNINGS 環境変数で指定されたフィルター
その他のCPython固有のフィルター(例: 新しい
-X dev
モード用に追加されたdefault
フィルター)警告機構によって直接定義された暗黙のフィルター
CPythonデバッグビルドでは、すべての警告がデフォルトで表示されるようになりました(暗黙のフィルターリストは空です)
(:issue: `20361` 、:issue:` 32043` 、および:issue: `32230` でNickCoghlanとVictorStinnerによって寄稿されました。)
非推奨の警告は、デフォルトで単一ファイルのスクリプトと対話型プロンプトに再び表示されます。 詳細については、 PEP 565:__ main __ にDeprecationWarningを表示するを参照してください。 (:issue: `31975` でNickCoghlanによって寄稿されました。)
xml.etree
find()
メソッドの ElementPath 述語は、子のテキストだけでなく、現在のノードのテキストを[. = "text"]
と比較できるようになりました。 述語では、読みやすくするためにスペースを追加することもできます。 (:issue: `31648` でStefanBehnelによって寄稿されました。)
xmlrpc.server
SimpleXMLRPCDispatcher.register_function
をデコレータとして使用できるようになりました。 (:issue: `7769` のXiangZhangによる寄稿。)
zipapp
関数 create_archive()は、オプションの filter 引数を受け入れるようになり、ユーザーがアーカイブに含めるファイルを選択できるようになりました。 (:issue: `31072` でIrmende Jongによって寄稿されました。)
関数 create_archive()は、オプションの compressed 引数を受け入れて、圧縮アーカイブを生成するようになりました。 圧縮をサポートするために、コマンドラインオプション--compress
も追加されました。 (:issue: `31638` のZhimingWangによる寄稿。)
ZIPファイル
ZipFile は、新しい compresslevel パラメーターを受け入れて、圧縮レベルを制御するようになりました。 (:issue: `21417` でBoBaylesによって寄稿されました。)
ZipFile
によって作成されたアーカイブのサブディレクトリは、アルファベット順に保存されるようになりました。 (BernhardMによる寄稿。 Wiedemann in :issue: `30693` 。)
CAPIの変更
スレッドローカルストレージ用の新しいAPIが実装されました。 概要については PEP 539:スレッドローカルストレージ用の新しいC API を、完全なリファレンスについてはスレッド固有ストレージ(TSS)API を参照してください。 (:issue: `25658` の山本正幸による寄稿。)
新しいコンテキスト変数機能は、いくつかの新しいC API を公開します。
新しい PyImport_GetModule()関数は、以前にインポートされたモジュールを指定された名前で返します。 (:issue: `28411` のEricSnowによる寄稿。)
新しいPy_RETURN_RICHCOMPARE
マクロを使用すると、豊富な比較関数を簡単に作成できます。 (:issue: `23699` でPetrVictorinによって寄稿されました。)
新しい Py_UNREACHABLE マクロを使用して、到達不能コードパスをマークできます。 (:issue: `31338` でBarryWarsawによって寄稿されました。)
tracemalloc は、新しい PyTraceMalloc_Track()および PyTraceMalloc_Untrack()関数を介してCAPIを公開するようになりました。 (:issue: `30054` でVictorStinnerによって寄稿されました。)
新しいimport__find__load__start()
およびimport__find__load__done()
静的マーカーを使用して、モジュールのインポートをトレースできます。 (:issue: `31574` でChristianHeimesによって寄稿されました。)
構造体 PyMemberDef 、 PyGetSetDef 、 PyStructSequence_Field 、 PyStructSequence_Desc [X151]のフィールドname
およびdoc
wrapperbase
は、char *
ではなく、タイプconst char *
になりました。 (:issue: `28761` のSerhiyStorchakaによる寄稿。)
PyUnicode_AsUTF8AndSize()および PyUnicode_AsUTF8()の結果は、char *
ではなくconst char *
タイプになりました。 (:issue: `28769` でSerhiyStorchakaによって寄稿されました。)
PyMapping_Keys()、 PyMapping_Values()、 PyMapping_Items()の結果は、リストやタプルではなく、常にリストになりました。 (:issue: `28280` でOrenMilmanによって寄稿されました。)
関数 PySlice_Unpack()および PySlice_AdjustIndices()が追加されました。 (:issue: `27867` でSerhiyStorchakaによって寄稿されました。)
PyOS_AfterFork()は非推奨になり、新しい関数 PyOS_BeforeFork()、 PyOS_AfterFork_Parent()、 PyOS_AfterFork_Child()が採用されました。 (:issue: `16500` のAntoinePitrouによる寄稿。)
パブリックAPIの一部であったPyExc_RecursionErrorInst
シングルトンは、メンバーがクリアされないため、インタープリターのファイナライズ中にセグメンテーション違反が発生する可能性があるため、削除されました。 :issue: `22898` および:issue:` 30697` でXavierdeGayeによって寄稿されました。
タイムゾーンコンストラクター PyTimeZone_FromOffset()および PyTimeZone_FromOffsetAndName()を使用したタイムゾーンのC APIサポート、および PyDateTime_TimeZone_UTC を使用したUTCシングルトンへのアクセスを追加しました。 :issue: `10381` でPaulGanssleによって寄稿されました。
PyThread_start_new_thread()
とPyThread_get_thread_ident()
の結果のタイプ、および PyThreadState_SetAsyncExc()の id パラメーターが long から[ X148X] unsigned long 。 (:issue: `6532` のSerhiyStorchakaによる寄稿。)
PyUnicode_AsWideCharString()は、2番目の引数がNULL
で、 wchar_t * 文字列にヌル文字が含まれている場合に、 ValueError を発生させるようになりました。 (:issue: `30708` のSerhiyStorchakaによる寄稿。)
起動シーケンスの変更と動的メモリアロケータの管理により、ほとんどのC API関数を呼び出す前に Py_Initialize()を呼び出すという長い間文書化された要件がより大きく依存するようになり、それに従わないと、埋め込みアプリケーションのsegfaultsに。 詳細については、このドキュメントの Python 3.7への移植セクションおよびCAPIドキュメントの Python初期化前セクションを参照してください。
新しい PyInterpreterState_GetID()は、指定されたインタープリターの一意のIDを返します。 (:issue: `29102` のEricSnowによる寄稿。)
Py_DecodeLocale()、 Py_EncodeLocale()は、 UTF-8モードが有効になっている場合にUTF-8エンコーディングを使用するようになりました。 (:issue: `29240` でVictorStinnerによって寄稿されました。)
PyUnicode_DecodeLocaleAndSize()および PyUnicode_EncodeLocale()は、surrogateescape
エラーハンドラーの現在のロケールエンコーディングを使用するようになりました。 (:issue: `29240` でVictorStinnerによって寄稿されました。)
PyUnicode_FindChar()の start および end パラメーターは、文字列スライスのように動作するように調整されました。 (:issue: `28822` のXiangZhangによる寄稿。)
ビルドの変更
--without-threads
のビルドのサポートは削除されました。 threading モジュールが常に利用可能になりました。 (:issue: `31370` のAntoinePitrouによる寄稿)。
非OSXUNIXプラットフォームで _ctypes モジュールをビルドするときに使用するために、libffiの完全なコピーがバンドルされなくなりました。 このようなプラットフォームで_ctypes
をビルドする場合は、libffiのインストール済みコピーが必要になります。 (:issue: `27979` のZacharyWareによる寄稿。)
Windowsビルドプロセスは、外部ソースをプルするためにSubversionに依存しなくなり、代わりにPythonスクリプトを使用してGitHubからzipファイルをダウンロードします。 Python 3.6がシステム上に見つからない場合(py -3.6
経由)、NuGetを使用してこの目的で32ビットPythonのコピーをダウンロードします。 (:issue: `30450` のZacharyWareによる寄稿。)
ssl モジュールには、OpenSSL1.0.2または1.1互換のlibsslが必要です。 OpenSSL 1.0.1は、2016年12月31日にライフタイムの終わりに達し、サポートされなくなりました。 LibreSSLも一時的にサポートされていません。 バージョン2.6.4までのLibreSSLリリースには、必要なOpenSSL 1.0.2APIがありません。
最適化:
METH_FASTCALL
規則を使用するためにより多くのコードを移植することにより、Cで実装されたさまざまな標準ライブラリクラスの多くのメソッドを呼び出すオーバーヘッドが大幅に削減されました。 (:issue: `29300` 、:issue:` 29507` 、:issue: `29452` 、およびのVictor Stinnerによる寄稿:発行: `29286` 。)
さまざまな最適化により、Pythonの起動時間が10 % o nLinuxおよび最大30 % o nmacOS短縮されました。 (:issue: `29585` のVictorStinner、INADA Naoki、および:issue:` 31333` のIvanLevkivskyiによる寄稿。)
バインドされたメソッドインスタンスの作成を回避するバイトコードの変更により、メソッド呼び出しは最大20 % f asterになりました。 (:issue: `26110` でYurySelivanovとINADANaokiによって寄稿されました。)
asyncio モジュールは、一般的に使用される機能について、いくつかの注目すべき最適化を受け取りました。
- asyncio.get_event_loop()関数がCで再実装され、最大15倍高速になりました。 (:issue: `32296` でYurySelivanovによって寄稿されました。)
- asyncio.Future コールバック管理が最適化されました。 (:issue: `32348` でYurySelivanovによって寄稿されました。)
asyncio.gather()
は最大15 % f asterになりました。 (:issue: `32355` でYurySelivanovによって寄稿されました。)asyncio.sleep()
は、 delay 引数がゼロまたは負の場合、最大2倍高速になりました。 (:issue: `32351` でAndrewSvetlovによって寄稿されました。)- asyncioデバッグモードのパフォーマンスオーバーヘッドが削減されました。 (:issue: `31970` のAntoinePitrouによる寄稿。)
PEP 560作業の結果、タイピングのインポート時間が7分の1に短縮され、多くのタイピング操作が高速になりました。 (:issue: `32226` でIvanLevkivskyiによって寄稿されました。)
sorted()および list.sort()は、一般的なケースで最大40-75 % f asterになるように最適化されています。 (:issue: `28685` でElliotGorokhovskyによって寄稿されました。)
dict.copy()が最大5.5倍高速になりました。 (:issue: `31179` でYurySelivanovによって寄稿されました。)
hasattr()と getattr()は、 name が見つからず、 obj がをオーバーライドしない場合、約4倍高速になりました。 object .__ getattr __()または object .__ getattribute __()。 (:issue: `32544` でINADANaokiによって寄稿されました。)
文字列内の特定のUnicode文字(ウクライナ語の大文字「Є」など)の検索は、他の文字の検索よりも最大25倍遅くなりました。 最悪の場合、現在はわずか3倍遅くなっています。 (:issue: `24821` のSerhiyStorchakaによる寄稿。)
collections.namedtuple()ファクトリが再実装され、名前付きタプルの作成が4〜6倍高速になりました。 (:issue: `28638` で、INADA Naoki、Serhiy Storchaka、Raymond Hettingerによってさらに改善された、Jelle Zijlstraによる寄稿。)
date.fromordinal()
とdate.fromtimestamp()
は、一般的なケースで最大30 % f asterになりました。 (:issue: `32403` でPaulGanssleによって寄稿されました。)
os.fwalk()関数は、 os.scandir()の使用により、最大2倍高速になりました。 (:issue: `25996` でSerhiyStorchakaによって寄稿されました。)
shutil.rmtree()関数の速度は、 os.scandir()関数の使用により、20〜40%向上しました。 (:issue: `28564` のSerhiyStorchakaによる寄稿。)
正規表現の大文字と小文字を区別しないマッチングと検索を最適化しました。 一部のパターンの検索が最大20倍高速になりました。 (:issue: `30285` のSerhiyStorchakaによる寄稿。)
re.compile()は、RegexFlag
の場合、flags
パラメーターをintオブジェクトに変換するようになりました。 現在はPython3.5と同じくらい高速で、Python3.6よりもパターンに約10 % d追加されています。 (:issue: `31671` でINADANaokiによって寄稿されました。)
クラス selectors.EpollSelector 、 selectors.PollSelector および selectors.DevpollSelector の modify()メソッドは約10 % f asterである可能性があります重い負荷の下で。 (:issue: `30014` のGiampaoloRodola 'による寄稿)
定数畳み込みは、のぞき穴オプティマイザーから新しいASTオプティマイザーに移動されました。これにより、最適化をより一貫して実行できます。 (:issue: `29469` および:issue:` 11549` でEugeneToderおよびINADANaokiによって寄稿されました。)
abc のほとんどの関数とメソッドはCで書き直されました。 これにより、抽象基本クラスの作成が可能になり、それらで isinstance()および issubclass()を呼び出すのが1.5倍速くなります。 これにより、Pythonの起動時間が最大10%短縮されます。 (:issue: `31333` でIvanLevkivskyiとINADANaokiによって寄稿されました)
サブクラスを構築しないときに高速パスコンストラクターを使用することにより、 datetime.date および datetime.datetime の代替コンストラクターの速度が大幅に向上しました。 (:issue: `32403` のPaulGanssleによる寄稿)
array.array インスタンスの比較速度は、特定の場合に大幅に改善されました。 同じ整数型の値を保持する配列を比較すると、10倍から70倍高速になりました。 (:issue: `24700` でAdrianWielgosikによって寄稿されました。)
math.erf()および math.erfc()関数は、ほとんどのプラットフォームで(より高速な)Cライブラリ実装を使用するようになりました。 (:issue: `26121` のSerhiyStorchakaによる寄稿。)
その他のCPython実装の変更
- トレースフックは、対応する新しい
f_trace_lines
およびf_trace_opcodes
属性をに設定することにより、line
の受信をオプトアウトし、インタープリターからのopcode
イベントの受信をオプトインできるようになりました。トレースされるフレーム。 (:issue: `31344` でNickCoghlanによって寄稿されました。) - 名前空間パッケージモジュール属性に関するいくつかの一貫性の問題を修正しました。 名前空間モジュールオブジェクトの
__file__
はNone
(以前は未設定)に設定され、__spec__.origin
もNone
(以前は文字列[ X160X] )。 :issue: `32305` を参照してください。 また、名前空間モジュールオブジェクトの__spec__.loader
は、__loader__
と同じ値に設定されます(以前はNone
に設定されていました)。 :issue: `32303` を参照してください。 - locals()辞書に、変数が定義された辞書順で表示されるようになりました。 以前は、順序は未定義でした。 (:issue: `32690` でRaymondHettingerによって寄稿されました。)
- distutils
upload
コマンドは、CRの行末文字をCRLFに変更しようとしなくなりました。 これにより、CRと同等のバイトで終了するsdistsの破損の問題が修正されます。 (:issue: `32304` でBoBaylesによって寄稿されました。)
非推奨のPythonの動作
歩留まり式(yield
句とyield from
句の両方)は、内包表記とジェネレータ式(左端のfor
句の反復可能な式を除く)で非推奨になりました。 これにより、内包表記は常に適切なタイプのコンテナをすぐに返します(ジェネレーターイテレーターオブジェクトを返す可能性はありません)が、ジェネレーター式は暗黙的な出力を明示的なyield式からの出力とインターリーブしようとしません。 。 Python 3.7では、このような式はコンパイル時に DeprecationWarning を発行しますが、Python3.8ではこれは SyntaxError になります。 (:issue: `10544` でSerhiyStorchakaによって寄稿されました。)
object .__ complex __()から complex のサブクラスを返すことは非推奨であり、将来のPythonバージョンではエラーになります。 これにより、__complex__()
は object .__ int __()および object .__ float __()と一致します。 (:issue: `28894` でSerhiyStorchakaによって寄稿されました。)
非推奨のPythonモジュール、関数、メソッド
aifc
aifc.openfp()
は非推奨になり、Python3.9で削除される予定です。 代わりに aifc.open()を使用してください。 (:issue: `31985` でBrianCurtinによって寄稿されました。)
asyncio
asyncio.Lock およびその他の非同期同期プリミティブの直接await
-ingインスタンスのサポートは非推奨になりました。 同期リソースを取得および解放するには、非同期コンテキストマネージャーを使用する必要があります。 (:issue: `32253` でAndrewSvetlovによって寄稿されました。)
asyncio.Task.current_task()および asyncio.Task.all_tasks()メソッドは非推奨になりました。 (:issue: `32250` でAndrewSvetlovによって寄稿されました。)
コレクション
Python 3.8では、 collections.abc の抽象基本クラスは通常の collections モジュールで公開されなくなります。 これにより、具象クラスと抽象基本クラスをより明確に区別できるようになります。 (:issue: `25988` でSerhiyStorchakaによって寄稿されました。)
dbm
dbm.dumb は、読み取り専用ファイルの読み取りをサポートするようになり、変更されていないときにインデックスファイルを書き込まなくなりました。 インデックスファイルが見つからず、'r'
および'w'
モードで再作成された場合、非推奨の警告が発行されるようになりました(これは将来のPythonリリースでエラーになります)。 (:issue: `28847` のSerhiyStorchakaによる寄稿。)
列挙型
Python 3.8では、Enum
クラスで非列挙型オブジェクトをチェックしようとすると、 TypeError が発生します(例: 1 in Color
); 同様に、Flag
メンバーの非フラグオブジェクトをチェックしようとすると、 TypeError が発生します(例: 1 in Perm.RW
); 現在、両方の操作は代わりに False を返します。 (:issue: `33217` でEthanFurmanによって寄稿されました。)
gettext
gettext で複数形を選択するために非整数値を使用することは非推奨になりました。 正しく機能しませんでした。 (:issue: `28692` でSerhiyStorchakaによって寄稿されました。)
importlib
メソッド MetaPathFinder.find_module()( MetaPathFinder.find_spec()に置き換え)および PathEntryFinder.find_loader()( PathEntryFinder.find_spec()に置き換え) )Python 3.4で非推奨になり、 DeprecationWarning を発行するようになりました。 (:issue: `29576` でMatthiasBussonnierによって寄稿されました)
importlib.abc.ResourceLoader ABCは廃止され、 importlib.abc.ResourceReader が採用されました。
ロケール
locale.format()は非推奨になりました。代わりに、 locale.format_string()を使用してください。 (:issue: `10379` でGarvitによって寄稿されました。)
糸脱毛
dummy_threading および _dummy_thread は非推奨になりました。 スレッドを無効にしてPythonをビルドすることはできなくなりました。 代わりにスレッドを使用してください。 (:issue: `31370` のAntoinePitrouによる寄稿。)
ソケット
socket.htons()および socket.ntohs()のサイレント引数値の切り捨ては非推奨になりました。 Pythonの将来のバージョンでは、渡された引数が16ビットより大きい場合、例外が発生します。 (:issue: `28332` でOrenMilmanによって寄稿されました。)
ssl
ssl.wrap_socket()は非推奨です。 代わりに ssl.SSLContext.wrap_socket()を使用してください。 (:issue: `28124` のChristianHeimesによる寄稿。)
スナウ
sunau.openfp()は非推奨になり、Python3.9で削除される予定です。 代わりに sunau.open()を使用してください。 (:issue: `31985` でBrianCurtinによって寄稿されました。)
sys
非推奨のsys.set_coroutine_wrapper()
およびsys.get_coroutine_wrapper()
。
文書化されていないsys.callstats()
関数は非推奨になり、将来のPythonバージョンで削除される予定です。 (:issue: `28799` でVictorStinnerによって寄稿されました。)
波
wave.openfp()は非推奨になり、Python3.9で削除される予定です。 代わりに wave.open()を使用してください。 (:issue: `31985` でBrianCurtinによって寄稿されました。)
非推奨の関数とCAPIのタイプ
Py_LIMITED_API
が0x03050400
から0x03060000
の範囲の値に設定または設定されていない場合、関数 PySlice_GetIndicesEx()は非推奨になり、マクロに置き換えられます(包括的ではありません)、または0x03060100
以上です。 (:issue: `27867` でSerhiyStorchakaによって寄稿されました。)
PyOS_AfterFork()は非推奨になりました。 代わりに、 PyOS_BeforeFork()、 PyOS_AfterFork_Parent()、または PyOS_AfterFork_Child()を使用してください。 (:issue: `16500` のAntoinePitrouによる寄稿。)
プラットフォームサポートの削除
FreeBSD9以前は正式にサポートされなくなりました。
拡張モジュール内を含む完全なUnicodeサポートのために、* nixプラットフォームは、
C.UTF-8
(フルロケール)、C.utf8
(フルロケール)、またはUTF-8
の少なくとも1つを提供することが期待されています。 (LC_CTYPE
のみのロケール)従来のASCII
ベースのC
ロケールの代替として。OpenSSL 0.9.8および1.0.1はサポートされなくなりました。つまり、これらのバージョンを引き続き使用している古いプラットフォームでSSL / TLSをサポートするCPython3.7をビルドするには、OpenSSLの最新バージョンにリンクするカスタムビルドオプションが必要です。
特に、この問題は、デフォルトでOpenSSL 1.0.1を使用しているため、Debian 8(別名「jessie」)およびUbuntu 14.04(別名「Trusty」)LTSLinuxディストリビューションに影響します。
Debian 9(「ストレッチ」)とUbuntu 16.04(「ゼニアル」)、および他のLTS Linuxリリースの最近のリリース(例: RHEL / CentOS 7.5、SLES 12-SP3)、OpenSSL 1.0.2以降を使用し、デフォルトのビルド構成で引き続きサポートされます。
CPython独自 :source: `CI構成ファイル<.travis.yml>` SSLの使用例を示します :source: `互換性テストインフラストラクチャ ` CPythonのテストスイートで、OpenSSLを提供する古いシステムではなくOpenSSL1.1.0に対してビルドおよびリンクします。
APIと機能の削除
次の機能とAPIがPython3.7から削除されました。
os.stat_float_times()
機能は削除されました。 Python2.2との下位互換性のためにPython2.3で導入され、Python3.1以降非推奨になりました。'\'
と re.sub()の置換テンプレートのASCII文字で構成される不明なエスケープは、Python 3.5で非推奨になり、エラーが発生するようになりました。- tarfile.TarFile.add()の exclude 引数のサポートを削除しました。 Python2.7および3.2では非推奨になりました。 代わりに filter 引数を使用してください。
ntpath
モジュールのsplitunc()
関数は、Python 3.1で非推奨になり、削除されました。 代わりに splitdrive()関数を使用してください。- collections.namedtuple()は、名前付きタプルクラスの生成されたソースコードを表示する verbose パラメーターまたは
_source
属性をサポートしなくなりました。 これは、クラスの作成を高速化するために設計された最適化の一部でした。 (:issue: `28638` で、INADA Naoki、Serhiy Storchaka、Raymond Hettingerによってさらに改善された、Jelle Zijlstraによる寄稿。) - 関数 bool()、 float()、 list()、および tuple()はキーワード引数を取りません。 int()の最初の引数は、位置引数としてのみ渡すことができるようになりました。
- plistlib モジュールのPython2.4クラス
Plist
、Dict
、_InternalDict
で以前に非推奨にされていたものを削除しました。 関数 readPlist()および readPlistFromBytes()の結果のディクト値が通常のディクトになりました。 属性アクセスを使用してこれらのディクショナリのアイテムにアクセスすることはできなくなりました。 asyncio.windows_utils.socketpair()
機能は削除されました。 代わりに socket.socketpair()関数を使用してください。これは、Python3.5以降のすべてのプラットフォームで使用できます。asyncio.windows_utils.socketpair
は、Python3.5以降のsocket.socketpair
の単なるエイリアスでした。- asyncio は、セレクターおよび
_overlapped
モジュールをasyncio.selectors
およびasyncio._overlapped
としてエクスポートしなくなりました。from asyncio import selectors
をimport selectors
に置き換えます。 - ssl.SSLSocket および ssl.SSLObject オブジェクトの直接インスタンス化は現在禁止されています。 コンストラクターは、パブリックコンストラクターとして文書化、テスト、または設計されたことはありません。 ユーザーは ssl.wrap_socket()または ssl.SSLContext を使用することになっています。 (:issue: `32951` でChristianHeimesによって寄稿されました。)
- 未使用の distutils
install_misc
コマンドは削除されました。 (EricNによる寄稿。 のVanderWeele:issue: `29218` 。)
モジュールの取り外し
fpectl
モジュールは削除されました。 デフォルトで有効になることはなく、x86-64で正しく機能することもありませんでした。また、C拡張機能の予期しない破損を引き起こす方法でPythonABIを変更しました。 (NathanielJによる寄稿。 のスミス:issue: `29137` 。)
Windowsのみの変更
Pythonランチャー(py.exe)は、32ビットと64ビットの指定子を受け入れることができますそれなしマイナーバージョンも指定する必要があります。 したがって、py -3-32
およびpy -3-64
は、py -3.7-32
と同様に有効になり、- m -64および- mn -64形式も有効になります。 32ビットが使用されていたとしても、64ビットのPythonを強制することが受け入れられるようになりました。 指定されたバージョンが利用できない場合、py.exeはエラー終了します。 (:issue: `30291` でSteveBarnesによって寄稿されました。)
ランチャーはpy -0
として実行して、インストールされているpythonのリストを生成できます。デフォルトではアスタリスクが付いています。 py -0p
を実行すると、パスが含まれます。 一致できないバージョン指定子を使用してpyを実行すると、使用可能な指定子の短縮形リストも出力されます。 (:issue: `30362` でSteveBarnesによって寄稿されました。)
Python3.7への移植
このセクションでは、コードの変更が必要になる可能性のある、前述の変更とその他のバグ修正を示します。
Pythonの動作の変更
async および await の名前が予約済みのキーワードになりました。 これらの名前を識別子として使用するコードは、 SyntaxError を発生させるようになりました。 (:issue: `30406` のJelleZijlstraによる寄稿。)
PEP 479 はPython3.7のすべてのコードで有効になっています。つまり、コルーチンとジェネレーターで直接または間接的に発生した StopIteration 例外は、 RuntimeError に変換されます。 ]例外。 (:issue: `32670` でYurySelivanovによって寄稿されました。)
object .__ aiter __()メソッドは非同期として宣言できなくなりました。 (:issue: `31709` でYurySelivanovによって寄稿されました。)
見落としのため、以前のPythonバージョンは誤って次の構文を受け入れていました。
f(1 for x in [1],) class C(1 for x in [1]): pass
Python 3.7では、 SyntaxError が正しく発生するようになりました。これは、ジェネレータ式が常に括弧のセット内に直接存在する必要があり、どちらの側にもコンマを含めることができず、括弧の重複は呼び出しでのみ省略できるためです。 (:issue: `32012` および:issue:` 32023` でSerhiyStorchakaによって寄稿されました。)
-m スイッチを使用すると、空の文字列(各インポート時に現在の作業ディレクトリを動的に示す)ではなく、最初の作業ディレクトリが sys.path に追加されるようになりました。 )。 空の文字列をチェックしているプログラム、または以前の動作に依存しているプログラムは、それに応じて更新する必要があります(例: コードが最初に空の文字列をチェックしていた理由に応じて、
os.getcwd()
またはos.path.dirname(__main__.__file__)
もチェックします)。
PythonAPIの変更
socketserver.ThreadingMixIn.server_close()
は、デーモン以外のすべてのスレッドが完了するまで待機するようになりました。 新しいsocketserver.ThreadingMixIn.block_on_close
クラス属性をFalse
に設定して、3.7より前の動作を取得します。 (:issue: `31233` および:issue:` 33540` でVictorStinnerによって寄稿されました。)socketserver.ForkingMixIn.server_close()
は、すべての子プロセスが完了するまで待機するようになりました。 新しいsocketserver.ForkingMixIn.block_on_close
クラス属性をFalse
に設定して、3.7より前の動作を取得します。 (:issue: `31151` および:issue:` 33540` でVictorStinnerによって寄稿されました。)locale.localeconv()関数は、
LC_CTYPE
ロケールを一時的にLC_NUMERIC
の値に設定する場合があります。 (:issue: `31900` でVictorStinnerによって寄稿されました。)pkgutil.walk_packages()は、 path が文字列の場合、 ValueError を発生させるようになりました。 以前は、空のリストが返されていました。 (:issue: `24744` でSanyamKhuranaによって寄稿されました。)
string.Formatter.format()のフォーマット文字列引数が位置のみになりました。 キーワード引数として渡すことは、Python3.5では非推奨になりました。 (:issue: `29193` でSerhiyStorchakaによって寄稿されました。)
クラス http.cookies.Morsel の属性 key 、 value 、および coded_value は読み取り専用になりました。 それらへの割り当ては、Python3.5で非推奨になりました。 それらを設定するには、 set()メソッドを使用します。 (:issue: `29192` でSerhiyStorchakaによって寄稿されました。)
os.makedirs()の mode 引数は、新しく作成された中間レベルのディレクトリのファイル許可ビットに影響を与えなくなりました。 ファイルパーミッションビットを設定するには、
makedirs()
を呼び出す前にumaskを設定できます。 (:issue: `19930` でSerhiyStorchakaによって寄稿されました。)struct.Struct.format タイプは、 bytes ではなく str になりました。 (:issue: `21071` でVictorStinnerによって寄稿されました。)
parse_multipart()は、 encoding および errors 引数を受け入れ、
FieldStorage
と同じ結果を返すようになりました。ファイル以外のフィールドの場合、関連付けられた値キーには、バイトではなく文字列のリストがあります。 (:issue: `29979` でPierreQuentelによって寄稿されました。)socket の内部変更により、古いPythonバージョンで socket.share によって作成されたソケットで socket.fromshare()を呼び出すことはサポートされていません。
BaseException の
repr
が変更され、末尾のコンマが含まれなくなりました。 ほとんどの例外は、この変更の影響を受けます。 (:issue: `30399` でSerhiyStorchakaによって寄稿されました。)datetime.timedelta の
repr
が変更され、出力にキーワード引数が含まれるようになりました。 (:issue: `30302` のUtkarshUpadhyayによる寄稿。)shutil.rmtree()は os.scandir()関数を使用して実装されるようになったため、ユーザー指定のハンドラー onerror が最初の引数
os.scandir
になります。Unicode Technical Standard#18 のように、ネストされたセットと正規表現でのセット操作のサポートが将来追加される可能性があります。 これにより構文が変更されます。 この将来の変更を容易にするために、当面の間、あいまいな場合に FutureWarning が発生します。 これには、リテラル
'['
で始まるセット、またはリテラル文字シーケンス'--'
、'&&'
、'~~'
、および'||'
を含むセットが含まれます。 警告を回避するには、円記号でそれらをエスケープします。 (:issue: `30349` でSerhiyStorchakaによって寄稿されました。)空の文字列と一致する可能性のある正規表現で文字列を分割した結果が変更されました。 たとえば、
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」を置き換え、2番目のマイナスは間の空の文字列を置き換えます'x'および 'd')。(:issue: `25054` および:issue:` 32308` でSerhiyStorchakaによって寄稿されました。)
re.escape()を変更して、ASCII文字、数字、および
'_'
以外のすべての文字をエスケープするのではなく、正規表現の特殊文字のみをエスケープします。 (:issue: `29995` でSerhiyStorchakaによって寄稿されました。)tracemalloc.Traceback フレームは、 traceback との整合性を高めるために、古いものから新しいものへと並べ替えられるようになりました。 (:issue: `32121` でJesseBakkerによって寄稿されました。)
socket.SOCK_NONBLOCK または socket.SOCK_CLOEXEC ビットフラグをサポートするOSでは、 socket.type にそれらが適用されなくなりました。 したがって、
if sock.type == socket.SOCK_STREAM
のようなチェックはすべてのプラットフォームで期待どおりに機能します。 (:issue: `32331` でYurySelivanovによって寄稿されました。)Windowsでは、 subprocess.Popen の close_fds 引数のデフォルトが、標準ハンドルをリダイレクトするときに False から True に変更されました。 subprocess.Popen を標準のIOリダイレクトで使用するときに継承されるハンドルに以前依存していた場合は、
close_fds=False
を渡して以前の動作を保持するか、 STARTUPINFO.lpAttributeList [を使用する必要があります。 X227X]。importlib.machinery.PathFinder.invalidate_caches() –これは暗黙的に importlib.invalidate_caches()に影響します– sys.path_importer_cache の
None
。 (:issue: `33169` のBrettCannonによる寄稿。)asyncio 、
loop.sock_recv()
、loop.sock_sendall()
、loop.sock_accept()
、loop.getaddrinfo()
、loop.getnameinfo()
が適切なコルーチンに変更されましたドキュメントに一致するメソッド。 以前は、これらのメソッドは asyncio.Future インスタンスを返していました。 (:issue: `32327` でYurySelivanovによって寄稿されました。)asyncio.Server.sockets は、サーバーソケットの内部リストを直接返すのではなく、そのコピーを返すようになりました。 (:issue: `32662` でYurySelivanovによって寄稿されました。)
Struct.format は、 bytes インスタンスではなく、 str インスタンスになりました。 (:issue: `21071` でVictorStinnerによって寄稿されました。)
argparse サブパーサーは、
required=True
を ArgumentParser.add_subparsers()に渡すことで必須にできるようになりました。 (:issue: `26510` のAnthonySottileによる寄稿。)ast.literal_eval()がより厳密になりました。 任意の数の加算と減算は許可されなくなりました。 (:issue: `31778` でSerhiyStorchakaによって寄稿されました。)
Calendar.itermonthdates は、日付が
0001-01-01
から9999-12-31
の範囲外の場合に、一貫して例外を発生させるようになりました。 このような例外を許容できないアプリケーションをサポートするために、新しい Calendar.itermonthdays3 および Calendar.itermonthdays4 を使用できます。 新しいメソッドはタプルを返し、 datetime.date でサポートされる範囲によって制限されません。 (:issue: `28292` でAlexanderBelopolskyによって寄稿されました。)collections.ChainMap は、基になるマッピングの順序を保持するようになりました。 (:issue: `32792` でRaymondHettingerによって寄稿されました。)
concurrent.futures.ThreadPoolExecutor および concurrent.futures.ProcessPoolExecutor の
submit()
メソッドは、インタープリターのシャットダウン中に呼び出された場合に RuntimeError を発生させるようになりました。 (:issue: `33097` のMarkNemecによる寄稿。)configparser.ConfigParser コンストラクターは、
read_dict()
を使用してデフォルト値を処理するようになり、その動作がパーサーの他の部分と一致するようになりました。 デフォルト辞書の文字列以外のキーと値は、暗黙的に文字列に変換されるようになりました。 (:issue: `23835` でJamesTocknellによって寄稿されました。)文書化されていないいくつかの内部インポートが削除されました。 一例として、
os.errno
は使用できなくなりました。 代わりにimport errno
を直接使用してください。 このような文書化されていない内部インポートは、マイクロバージョンのリリースであっても、通知なしにいつでも削除される可能性があることに注意してください。
CAPIの変更
関数 PySlice_GetIndicesEx()は、サイズ変更可能なシーケンスに対して安全でないと見なされます。 スライスインデックスが int のインスタンスではなく、__index__()
メソッドを実装するオブジェクトである場合、シーケンスの長さを!PySlice_GetIndicesEx に渡した後でサイズを変更できます。 これにより、シーケンスの長さからインデックスが返される可能性があります。 発生する可能性のある問題を回避するには、新しい関数 PySlice_Unpack()および PySlice_AdjustIndices()を使用します。 (:issue: `27867` でSerhiyStorchakaによって寄稿されました。)
CPythonバイトコードの変更
:opcode: `LOAD_METHOD` と:opcode:` CALL_METHOD` の2つの新しいオペコードがあります。 (:issue: `26110` でYurySelivanovとINADANaokiによって寄稿されました。)
:opcode: `STORE_ANNOTATION` オペコードは削除されました。 (:issue: `32550` でMarkShannonによって寄稿されました。)
Windowsのみの変更
sys.path のオーバーライドに使用されるファイルは、'sys.path'
ではなく<python-executable>._pth
と呼ばれるようになりました。 詳細については、モジュールの検索を参照してください。 (:issue: `28137` でSteveDowerによって寄稿されました。)
その他のCPython実装の変更
パブリックCPythonランタイム初期化APIへの潜在的な将来の変更に備えて(初期の、しかしやや時代遅れのドラフトについては PEP 432 を参照)、CPythonの内部起動および構成管理ロジックは大幅に変更されましたリファクタリング。 これらの更新は、埋め込みアプリケーションと通常のCPython CLIのユーザーの両方に対して完全に透過的であることを目的としていますが、リファクタリングによってインタープリターの起動中にさまざまな操作の内部順序が変更されるため、以前の潜在的な欠陥が明らかになる可能性があるため、ここで言及しています。アプリケーションの埋め込み、またはCPython自体。 (最初は:issue: `22257` の一部としてNickCoghlanとEricSnowによって寄稿され、さらにNick、Eric、Victor Stinnerによって他の多くの問題で更新されました)。 影響を受けるいくつかの既知の詳細:
- PySys_AddWarnOptionUnicode()は、 Py_Initialize を呼び出す前にUnicodeオブジェクトを作成する必要があるため、現在、アプリケーションの埋め込みでは使用できません。 代わりに PySys_AddWarnOption()を使用してください。
- PySys_AddWarnOption()を使用して埋め込みアプリケーションによって追加された警告フィルターは、インタープリターによって設定されたデフォルトのフィルターよりも一貫して優先されるようになりました。
デフォルトの警告フィルターの構成方法が変更されたため、 Py_BytesWarningFlag を1より大きい値に設定するだけでは、 BytesWarning メッセージを送信して例外に変換するのに十分ではなくなりました。 代わりに、フラグを設定し(最初に警告を発行させるため)、明示的なerror::BytesWarning
警告フィルターを追加して例外に変換する必要があります。
コンパイラによるdocstringの処理方法が変更されたため、docstringのみで構成される関数本体の暗黙的なreturn None
は、関数のヘッダー行ではなく、docstringと同じ行にあるものとしてマークされるようになりました。 。
現在の例外状態は、フレームオブジェクトからコルーチンに移動されました。 これにより、インタープリターが簡素化され、ジェネレーターに出入りするときにスワップ例外状態が発生することによって発生するいくつかのあいまいなバグが修正されました。 (:issue: `25612` でMarkShannonによって寄稿されました。)
Python3.7.1での注目すべき変更
3.7.1以降、 Py_Initialize()は、 Py_Main()と同じ環境設定をすべて一貫して読み取り、尊重するようになりました(以前のPythonバージョンでは、これらの環境変数は、Python 3.7.0では、:issue: `34247` のために、それらのいずれも読み取れませんでした。 この動作が望ましくない場合は、 Py_Initialize()を呼び出す前に、 Py_IgnoreEnvironmentFlag を1に設定してください。
3.7.1では、コンテキスト変数のC APIが PyObject ポインターを使用するように更新されました。 :issue: `34762` も参照してください。
3.7.1では、 tokenize モジュールは、末尾に改行がない入力が提供されたときに、NEWLINE
トークンを暗黙的に発行するようになりました。 この動作は、Cトークナイザーが内部で行う動作と一致するようになりました。 (:issue: `33899` でAmmarAskarによって寄稿されました。)
Python3.7.2での注目すべき変更
3.7.2では、Windowsの venv は元のバイナリをコピーしなくなりましたが、代わりにpython.exe
およびpythonw.exe
という名前のリダイレクタスクリプトを作成します。 これにより、Pythonを更新するたびにすべての仮想環境をアップグレードまたは再作成する必要があるという長年の問題が解決されます。 ただし、このリリースでは、新しいスクリプトを取得するために仮想環境を再作成する必要があることに注意してください。
Python3.7.6での注目すべき変更
重大なセキュリティ上の懸念により、asyncio.loop.create_datagram_endpoint()
の reuse_address パラメーターはサポートされなくなりました。 これは、UDPのソケットオプションSO_REUSEADDR
の動作が原因です。 詳細については、loop.create_datagram_endpoint()
のドキュメントを参照してください。 (:issue: `37228` で、Kyle Stanley、Antoine Pitrou、およびYury Selivanovによって寄稿されました。)
Python3.7.10での注目すべき変更
以前のPythonバージョンでは、 urllib.parse.parse_qs()および urllib.parse.parse_qsl()のクエリパラメーター区切り文字として;
と&
の両方を使用できました。 ]。 セキュリティ上の懸念と、新しいW3Cの推奨事項に準拠するために、これは、&
をデフォルトとして、単一の区切りキーのみを許可するように変更されました。 この変更は、影響を受ける関数を内部で使用するため、 cgi.parse()および cgi.parse_multipart()にも影響します。 詳細については、それぞれのドキュメントを参照してください。 (:issue: `42967` でAdamGoldschmidt、Senthil Kumaran、Ken Jinによって寄稿されました。)