Python3.6の新機能
- 編集者
- Elvis Pranskevichus < [email protected] >、ユーリー・セリバノフ< [email protected] >>
この記事では、3.5と比較したPython3.6の新機能について説明します。 Python3.6は2016年12月23日にリリースされました。 変更の完全なリストについては、 changelog を参照してください。
概要–リリースのハイライト
新しい構文機能:
新しいライブラリモジュール:
CPython実装の改善:
- dict タイプは、 Raymond Hettinger による提案に基づいて、 PyPydict実装と同様のよりコンパクトな表現を使用するように再実装されました。 。 これにより、Python 3.5と比較して辞書の使用メモリが20%から25%少なくなりました。
- 新しいプロトコルにより、クラス作成のカスタマイズが簡素化されました。
- クラス属性定義の順序は現在保持されています。
**kwargs
の要素の順序は、がキーワード引数が関数に渡された順序に対応するようになりました。- DTraceおよびSystemTap プロービングサポートが追加されました。
- 新しい PYTHONMALLOC 環境変数を使用して、インタープリターのメモリ割り当てとアクセスエラーをデバッグできるようになりました。
標準ライブラリの大幅な改善:
- asyncio モジュールは、新機能、大幅なユーザビリティとパフォーマンスの改善、およびかなりの量のバグ修正を受け取りました。 Python 3.6以降、
asyncio
モジュールは暫定的ではなくなり、そのAPIは安定していると見なされます。 - パスのようなオブジェクトをサポートするために、新しいファイルシステムパスプロトコルが実装されました。 パスで動作するすべての標準ライブラリ関数は、新しいプロトコルで動作するように更新されました。
- datetime モジュールは、 Local Time Disambiguation のサポートを取得しました。
- タイピングモジュールは多くの改善を受け取りました。
- tracemalloc モジュールは大幅に作り直され、 ResourceWarning の出力を改善し、メモリ割り当てエラーの診断を改善するために使用されるようになりました。 詳細については、 PYTHONMALLOCセクションを参照してください。
セキュリティの改善:
- 新しい secrets モジュールが追加され、アカウント認証やトークンなどの秘密の管理に適した、暗号的に強力な疑似乱数の生成が簡素化されました。
- Linuxでは、 os.urandom()は、セキュリティを強化するためにシステムのurandomエントロピープールが初期化されるまでブロックするようになりました。 理論的根拠については、 PEP 524 を参照してください。
- hashlib および ssl モジュールがOpenSSL1.1.0をサポートするようになりました。
- ssl モジュールのデフォルト設定と機能セットが改善されました。
- hashlib モジュールは、BLAKE2、SHA-3、SHAKEハッシュアルゴリズムと crypto()鍵導出関数のサポートを受けました。
Windowsの改善:
- PEP 528 および PEP 529 、WindowsファイルシステムおよびコンソールエンコーディングがUTF-8に変更されました。
py.exe
ランチャーは、インタラクティブに使用される場合、ユーザーがバージョンを指定しない場合(コマンドライン引数または構成ファイルを介して)、Python3よりもPython2を優先しなくなりました。 シバンラインの処理は変更されていません。その場合、「python」はPython2を指します。python.exe
およびpythonw.exe
はロングパス対応としてマークされています。これは、260文字のパス制限が適用されなくなる可能性があることを意味します。 詳細については、 MAX_PATH制限の削除を参照してください。._pth
ファイルを追加して、分離モードを強制し、すべての検索パスを完全に指定して、レジストリと環境の検索を回避できます。 詳細については、ドキュメントを参照してください。python36.zip
ファイルは、 PYTHONHOME を推測するためのランドマークとして機能するようになりました。 詳細については、ドキュメントを参照してください。
新機能
PEP 498:フォーマットされた文字列リテラル
PEP 498 では、新しい種類の文字列リテラル f-strings 、または形式の文字列リテラルが導入されています。
フォーマットされた文字列リテラルには'f'
というプレフィックスが付いており、 str.format()で受け入れられるフォーマット文字列に似ています。 中括弧で囲まれた置換フィールドが含まれています。 置換フィールドは式であり、実行時に評価され、 format()プロトコルを使用してフォーマットされます。
>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}" # nested fields
'result: 12.35'
PEP 526:変数注釈の構文
PEP 484 は、関数パラメーターの型注釈の標準、別名を導入しました タイプのヒント。 このPEPは、クラス変数やインスタンス変数などの変数の型に注釈を付けるための構文をPythonに追加します。
primes: List[int] = []
captain: str # Note: no initial value!
class Starship:
stats: Dict[str, int] = {}
関数アノテーションと同様に、Pythonインタープリターは変数アノテーションに特定の意味を付加せず、クラスまたはモジュールの__annotations__
属性にのみ格納します。
静的に型付けされた言語の変数宣言とは対照的に、注釈構文の目的は、抽象構文ツリーと__annotations__
属性を介して、サードパーティのツールとライブラリの構造化型メタデータを簡単に指定する方法を提供することです。
PEP 515:数値リテラルのアンダースコア
PEP 515 は、読みやすさを向上させるために、数値リテラルでアンダースコアを使用する機能を追加します。 例えば:
>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295
数字の間および基数指定子の後には、単一の下線を使用できます。 先頭、末尾、または複数のアンダースコアを続けて使用することはできません。
文字列フォーマット言語は、'_'
オプションもサポートするようになり、浮動小数点表示タイプおよび整数表示タイプ'd'
の千単位の区切り文字にアンダースコアを使用することを通知します。 。 整数表示タイプ'b'
、'o'
、'x'
、および'X'
の場合、アンダースコアは4桁ごとに挿入されます。
>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'
PEP 525:非同期発電機
PEP 492 は、ネイティブコルーチンとasync
/ await
構文のサポートをPython3.5に導入しました。 Python 3.5実装の注目すべき制限は、await
とyield
を同じ関数本体で使用できないことです。 Python 3.6では、この制限が解除され、非同期ジェネレーターを定義できるようになりました。
async def ticker(delay, to):
"""Yield numbers from 0 to *to* every *delay* seconds."""
for i in range(to):
yield i
await asyncio.sleep(delay)
新しい構文により、より高速で簡潔なコードが可能になります。
PEP 530:非同期内包表記
PEP 530 は、リスト、セット、辞書内包表記、およびジェネレーター式でasync for
を使用するためのサポートを追加します。
result = [i async for i in aiter() if i % 2]
さらに、await
式は、あらゆる種類の内包表記でサポートされています。
result = [await fun() for fun in funcs if await condition()]
PEP 487:クラス作成のより簡単なカスタマイズ
メタクラスを使用せずにサブクラスの作成をカスタマイズできるようになりました。 新しいサブクラスが作成されるたびに、新しい__init_subclass__
クラスメソッドが基本クラスで呼び出されます。
class PluginBase:
subclasses = []
def __init_subclass__(cls, **kwargs):
super().__init_subclass__(**kwargs)
cls.subclasses.append(cls)
class Plugin1(PluginBase):
pass
class Plugin2(PluginBase):
pass
引数なしの super()呼び出しが __ init_subclass __()実装から正しく機能するようにするには、カスタムメタクラスで新しい__classcell__
名前空間エントリがに伝播されるようにする必要があります。 type.__new__
(クラスオブジェクトの作成で説明されているように)。
PEP 487:記述子プロトコルの機能強化
PEP 487 は、記述子プロトコルを拡張して、新しいオプションの __ set_name __()メソッドを含めます。 新しいクラスが定義されるたびに、定義に含まれるすべての記述子で新しいメソッドが呼び出され、定義されているクラスへの参照と、クラス名前空間内の記述子に付けられた名前が提供されます。 つまり、記述子のインスタンスは、所有者クラスの記述子の属性名を知ることができるようになりました。
class IntField:
def __get__(self, instance, owner):
return instance.__dict__[self.name]
def __set__(self, instance, value):
if not isinstance(value, int):
raise ValueError(f'expecting integer in {self.name}')
instance.__dict__[self.name] = value
# this is the new initializer:
def __set_name__(self, owner, name):
self.name = name
class Model:
int_field = IntField()
PEP 519:ファイルシステムパスプロトコルの追加
ファイルシステムパスは、これまで str または bytes オブジェクトとして表されてきました。 これにより、ファイルシステムパスを操作するコードを作成する人々は、そのようなオブジェクトはこれら2つのタイプの1つにすぎないと想定するようになりました(ファイル記述子を表す int は、ファイルパスではないためカウントされません)。 。 残念ながら、その仮定は、 pathlib のようなファイルシステムパスの代替オブジェクト表現がPythonの標準ライブラリを含む既存のコードで機能することを妨げます。
この状況を修正するために、 os.PathLike で表される新しいインターフェイスが定義されました。 __fspath__()
メソッドを実装することにより、オブジェクトはパスを表すことを通知します。 オブジェクトは、ファイルシステムパスの低レベル表現を str または bytes オブジェクトとして提供できます。 これは、オブジェクトが os.PathLike を実装している場合、またはファイルを表す str または bytes オブジェクトである場合、オブジェクトは path-like と見なされることを意味します。システムパス。 コードは、 os.fspath()、 os.fsdecode()、または os.fsencode()を使用して、 str を明示的に取得できます。および/またはパスのようなオブジェクトの bytes 表現。
組み込みの open()関数が更新され、 os.PathLike オブジェクトを受け入れるようになりました。また、 os および osのすべての関連関数も同様です。 path モジュール、および標準ライブラリ内の他のほとんどの関数とクラス。 os.DirEntry クラスおよび pathlib の関連クラスも、 os.PathLike を実装するように更新されました。
ファイルシステムパスを操作するための基本的な機能を更新すると、サードパーティのコードがコードを変更せずにすべてのパスのようなオブジェクトを暗黙的にサポートするようになるか、少なくともごくわずかなオブジェクト(例: パスのようなオブジェクトを操作する前に、コードの先頭で os.fspath()を呼び出します)。
新しいインターフェイスで pathlib.Path を既存のコードでより簡単かつ透過的に使用できるようにする方法の例を次に示します。
>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
... contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'
(Brett Cannon、Ethan Furman、Dusty Phillips、およびJelle Zijlstraによって実装されています。)
PEP 495:現地時間の曖昧性解消
世界のほとんどの場所で、ローカル時計が戻されることがあります。 その際、ローカル時計が同じ日に2回同じ時刻を表示する間隔が導入されます。 このような状況では、ローカルクロックに表示される(またはPython datetimeインスタンスに格納される)情報は、特定の時点を識別するには不十分です。
PEP 495 は、新しい fold 属性を datetime.datetime および datetime.time クラスのインスタンスに追加して区別します現地時間が同じである2つの瞬間の間:
>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
... u = u0 + i*HOUR
... t = u.astimezone(Eastern)
... print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0
fold 属性の値は、あいまいな場合の2番目の(時系列の)瞬間を表すものを除いて、すべてのインスタンスで値0
を持ちます。
PEP 529:WindowsファイルシステムのエンコーディングをUTF-8に変更します
ファイルシステムパスの表現は、バイトではなくstr(Unicode)を使用して実行するのが最適です。 ただし、バイトを使用するだけで十分で正しい場合があります。
Python 3.6より前は、Windowsでバイトパスを使用するとデータが失われる可能性がありました。 この変更により、パスを表すバイトの使用がWindowsでサポートされるようになりました。ただし、これらのバイトが sys.getfilesystemencoding()によって返されるエンコードでエンコードされ、デフォルトで'utf-8'
になります。
パスを表すためにstrを使用しないアプリケーションは、 os.fsencode()および os.fsdecode()を使用して、バイトが正しくエンコードされていることを確認する必要があります。 以前の動作に戻すには、 PYTHONLEGACYWINDOWSFSENCODING を設定するか、 sys._enablelegacywindowsfsencoding()を呼び出します。
必要になる可能性のあるコード変更の詳細と説明については、 PEP 529 を参照してください。
PEP 528:WindowsコンソールのエンコーディングをUTF-8に変更します
Windowsのデフォルトのコンソールは、すべてのUnicode文字を受け入れ、Pythonコードに正しく読み取られたstrオブジェクトを提供するようになりました。 sys.stdin
、sys.stdout
、およびsys.stderr
は、デフォルトでutf-8エンコーディングになりました。
この変更は、インタラクティブコンソールを使用している場合にのみ適用され、ファイルやパイプをリダイレクトする場合には適用されません。 インタラクティブコンソールを使用するために以前の動作に戻すには、 PYTHONLEGACYWINDOWSSTDIO を設定します。
PEP 520:クラス属性定義の順序の保持
クラス定義本体の属性には、自然な順序があります。つまり、名前がソースに表示されるのと同じ順序です。 この順序は、新しいクラスの __ dict __ 属性で保持されるようになりました。
また、有効なデフォルトクラス execute 名前空間( type .__ prepare __()から返される)は、挿入順序を保持するマッピングになりました。
PEP 468:キーワード引数の順序を維持する
関数シグネチャの**kwargs
は、挿入順序を保持するマッピングであることが保証されるようになりました。
新しい dict の実装
dict タイプは、PyPy によって最初に実装された Raymond Hettinger による提案に基づく「コンパクト」表現を使用するようになりました。 新しい dict()のメモリ使用量は、Python 3.5と比較して20%から25%少なくなっています。
この新しい実装の順序保持の側面は、実装の詳細と見なされ、信頼されるべきではありません(これは将来変更される可能性がありますが、言語仕様を変更する前に、いくつかのリリースでこの新しいdict実装を言語で使用することが望まれます現在および将来のすべてのPython実装に順序保持セマンティクスを義務付ける。これは、ランダムな反復順序がまだ有効な古いバージョンの言語との下位互換性を維持するのにも役立ちます。 Python 3.5)。
(:issue: `27350` でINADANaokiによって寄稿されました。 アイデア元々はレイモンドヘッティンガーによって提案されました。)
PEP 523:フレーム評価APIをCPythonに追加する
Pythonは、コードの実行方法をカスタマイズするための広範なサポートを提供しますが、それが行われていない場所の1つは、フレームオブジェクトの評価です。 Pythonでフレーム評価をインターセプトする方法が必要な場合は、定義された関数の関数ポインターを直接操作しない限り、実際には方法はありませんでした。
PEP 523 は、フレーム評価を経営幹部レベルでプラグイン可能にするAPIを提供することにより、これを変更します。 これにより、デバッガーやJITなどのツールが、Pythonコードの実行を開始する前にフレーム評価をインターセプトできるようになります。 これにより、Pythonコード、追跡フレーム評価などの代替評価実装を使用できるようになります。
このAPIは制限付きCAPIの一部ではなく、このAPIの使用が制限されると予想され、非常に選択された低レベルのユースケースにのみ適用可能であることを示すためにプライベートとしてマークされます。 APIのセマンティクスは、必要に応じてPythonで変更されます。
PYTHONMALLOC環境変数
新しい PYTHONMALLOC 環境変数を使用すると、Pythonメモリアロケータを設定し、デバッグフックをインストールできます。
PYTHONMALLOC=debug
を使用して、リリースモードでコンパイルされたPythonのPythonメモリアロケータにデバッグフックをインストールできるようになりました。 デバッグフックの影響:
- 新しく割り当てられたメモリはバイト
0xCB
で満たされます - 解放されたメモリはバイト
0xDB
でいっぱいになります - PythonメモリアロケータAPIの違反を検出します。 たとえば、 PyObject_Free()は、 PyMem_Malloc()によって割り当てられたメモリブロックで呼び出されます。
- バッファの開始前に書き込みを検出します(バッファアンダーフロー)
- バッファの終了後の書き込みを検出します(バッファオーバーフロー)
PYMEM_DOMAIN_OBJ
(例: PyObject_Malloc())およびPYMEM_DOMAIN_MEM
(例: PyMem_Malloc( ))ドメインが呼び出されます。
GILが保持されているかどうかの確認も、Python3.6の新機能です。
Pythonメモリアロケータのデバッグフックについては、 PyMem_SetupDebugHooks()関数を参照してください。
PYTHONMALLOC=malloc
を使用して、すべてのPythonメモリ割り当てにCライブラリのmalloc()
アロケータを強制的に使用することもできるようになりました。 これは、リリースモードでコンパイルされたPythonでValgrindなどの外部メモリデバッガーを使用する場合に役立ちます。
エラー時に、Pythonメモリアロケータのデバッグフックが tracemalloc モジュールを使用して、メモリブロックが割り当てられたトレースバックを取得するようになりました。
python3.6 -X tracemalloc=5
を使用したバッファオーバーフローでの致命的なエラーの例(5フレームをトレースに保存):
Debug memory block at address p=0x7fbcd41666f8: API 'o'
4 bytes originally requested
The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
at tail+0: 0x02 *** OUCH
at tail+1: 0xfb
at tail+2: 0xfb
at tail+3: 0xfb
at tail+4: 0xfb
at tail+5: 0xfb
at tail+6: 0xfb
at tail+7: 0xfb
The block was made by call #1233329 to debug malloc/realloc.
Data at p: 1a 2b 30 00
Memory block allocated at (most recent call first):
File "test/test_bytes.py", line 323
File "unittest/case.py", line 600
File "unittest/case.py", line 648
File "unittest/suite.py", line 122
File "unittest/suite.py", line 84
Fatal Python error: bad trailing pad byte
Current thread 0x00007fbcdbd32700 (most recent call first):
File "test/test_bytes.py", line 323 in test_hex
File "unittest/case.py", line 600 in run
File "unittest/case.py", line 648 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
File "unittest/suite.py", line 122 in run
File "unittest/suite.py", line 84 in __call__
...
(:issue: `26516` および:issue:` 26564` でVictorStinnerによって寄稿されました。)
DTraceおよびSystemTapプロービングのサポート
Pythonをビルドできるようになりました--with-dtrace
。これにより、インタープリターで次のイベントの静的マーカーが有効になります。
- 関数の呼び出し/戻り
- ガベージコレクションの開始/終了
- 実行されたコード行。
これは、特定のデバッグビルドを再コンパイルしたり、アプリケーション固有のプロファイリング/デバッグコードを提供したりすることなく、本番環境で実行中のインタープリターをインストルメント化するために使用できます。
詳細については、 DTraceおよびSystemTapを使用したCPythonのインストルメンテーションを参照してください。
現在の実装はLinuxとmacOSでテストされています。 将来、追加のマーカーが追加される可能性があります。
(:issue: `21590` のŁukaszLangaによる寄稿、JesúsCeaAvión、David Malcolm、およびNikhil Beneschによるパッチに基づく。)
その他の言語の変更
コアPython言語に加えられたいくつかの小さな変更は次のとおりです。
global
またはnonlocal
ステートメントは、同じスコープで影響を受ける名前を最初に使用する前に、テキストで表示される必要があります。 以前は、これは SyntaxWarning でした。- 特殊メソッドを
None
に設定して、対応する操作が利用できないことを示すことができるようになりました。 たとえば、クラスが__iter__()
をNone
に設定している場合、そのクラスは反復可能ではありません。 (AndrewBarnertとIvanLevkivskyiが:issue: `25958` で寄稿しました。) - 繰り返されるトレースバックラインの長いシーケンスは、
"[Previous line repeated {count} more times]"
と省略されるようになりました(例については、 traceback を参照してください)。 (:issue: `26823` でEmanuelBarryによって寄稿されました。) - インポートでモジュールが見つからない場合、インポートで新しい例外 ModuleNotFoundError ( ImportError のサブクラス)が発生するようになりました。 現在ImportErrorをチェックしているコード(try-except)は引き続き機能します。 (:issue: `15767` のEricSnowによる寄稿。)
- ゼロ引数
super()
に依存するクラスメソッドは、クラスの作成中にメタクラスメソッドから呼び出されたときに正しく機能するようになりました。 (:issue: `23722` でMartinTeichmannによって寄稿されました。)
新しいモジュール
秘密
新しい secrets モジュールの主な目的は、アカウント認証やトークンなどの秘密の管理に適した、暗号的に強力な疑似ランダム値を確実に生成するための明白な方法を提供することです。
警告
random モジュールの疑似ランダムジェネレーターはセキュリティ目的で NOT を使用する必要があることに注意してください。 Python3.6以降では secrets を使用し、Python3.5以前では os.urandom()を使用します。
改善されたモジュール
配列
array.array の枯渇したイテレーターは、反復配列が拡張された場合でも、使い果たされたままになります。 これは、他の可変シーケンスの動作と一致しています。
:issue: `26492` でSerhiyStorchakaによって寄稿されました。
ast
新しい ast.Constant ASTノードが追加されました。 定数畳み込みの目的で、外部ASTオプティマイザーで使用できます。
:issue: `26146` でVictorStinnerによって寄稿されました。
asyncio
Python 3.6以降、asyncio
モジュールは暫定的ではなくなり、そのAPIは安定していると見なされます。
Python 3.5.0以降の asyncio モジュールの注目すべき変更(暫定ステータスのためにすべて3.5.xにバックポートされました):
- get_event_loop()関数は、コルーチンおよびコールバックから呼び出されたときに常に現在実行中のループを返すように変更されました。 (:issue: `28613` でYurySelivanovによって寄稿されました。)
- sure_future()関数と、それを使用する loop.run_until_complete()などのすべての関数は、すべての種類の待機可能オブジェクトを受け入れるようになりました。 (Yury Selivanovによる寄稿。)
- 他のスレッドからのイベントループにコルーチンを送信するための新しい run_coroutine_threadsafe()関数。 (Vincent Michelによる寄稿。)
- トランスポートが閉じているか閉じているかを確認するための新しい Transport.is_closeing()メソッド。 (Yury Selivanovによる寄稿。)
loop.create_server()
メソッドは、ホストのリストを受け入れることができるようになりました。 (Yann Sionneauによる寄稿。)- Futureオブジェクトを作成するための新しい loop.create_future()メソッド。 これにより、 uvloop などの代替イベントループ実装が、より高速な asyncio.Future 実装を提供できるようになります。 (:issue: `27041` でYurySelivanovによって寄稿されました。)
- 現在の例外ハンドラーを取得するための新しい loop.get_exception_handler()メソッド。 (:issue: `27040` でYurySelivanovによって寄稿されました。)
- セパレータバイトシーケンスが表示されるまでストリームからデータを読み取る新しい
StreamReader.readuntil()
メソッド。 (Mark Korenbergによる寄稿。) StreamReader.readexactly()
のパフォーマンスが改善されました。 (:issue: `28370` でMarkKorenbergによって寄稿されました。)loop.getaddrinfo()
メソッドは、アドレスがすでに解決されている場合にシステムgetaddrinfo
関数を呼び出さないように最適化されています。 (Aによる寄稿。 ジェシー・ジリュウ・デイビス。)- loop.stop()メソッドは、現在の反復の直後にループを停止するように変更されました。 最後の反復の結果としてスケジュールされた新しいコールバックはすべて破棄されます。 (:issue: `25593` でGuidovan Rossumによって寄稿されました。)
Future.set_exception
は、 StopIteration 例外のインスタンスが渡されたときに、 TypeError を発生させるようになりました。 (:issue: `26221` でChrisAngelicoによって寄稿されました。)- asyncioの外部の接続を受け入れるが、それらを処理するためにasyncioを使用するサーバーによって使用される新しい
loop.connect_accepted_socket()
メソッド。 (:issue: `27392` でJimFultonによって寄稿されました。) TCP_NODELAY
フラグは、デフォルトですべてのTCPトランスポートに設定されるようになりました。 (:issue: `27456` でYurySelivanovによって寄稿されました。)- 新しい
loop.shutdown_asyncgens()
は、ループを閉じる前に保留中の非同期ジェネレーターを適切に閉じます。 (:issue: `28003` でYurySelivanovによって寄稿されました。) - Future および Task クラスには、最大30 % f asterの非同期コードを作成する最適化されたC実装が含まれるようになりました。 (:issue: `26081` および:issue:` 28544` でYurySelivanovとINADANaokiによって寄稿されました。)
binascii
b2a_base64()関数は、オプションの newline キーワード引数を受け入れて、改行文字を戻り値に追加するかどうかを制御するようになりました。 (:issue: `25357` でVictorStinnerによって寄稿されました。)
cmath
新しい cmath.tau (τ)定数が追加されました。 (:issue: `12345` のLisaRoachによる寄稿。詳細については、 PEP 628 を参照してください。)
新しい定数: cmath.inf と cmath.nan は、 math.inf と math.nan 、および cmathと一致します.infj および cmath.nanj は、複雑なreprで使用される形式と一致します。 (:issue: `23229` でMarkDickinsonによって寄稿されました。)
コレクション
新しい Collection 抽象基本クラスが追加され、サイズ変更された反復可能なコンテナークラスを表します。 (Ivan Levkivskyiによる寄稿、:issue: `27598` のNeilGirdharによるドキュメント。)
新しい Reversible 抽象基本クラスは、__reversed__()
メソッドも提供する反復可能なクラスを表します。 (:issue: `25987` でIvanLevkivskyiによって寄稿されました。)
新しい AsyncGenerator 抽象基本クラスは、非同期ジェネレーターを表します。 (:issue: `28720` でYurySelivanovによって寄稿されました。)
namedtuple()関数は、オプションのキーワード引数 module を受け入れるようになりました。これは、指定された場合、返される名前付きタプルクラスの__module__
属性に使用されます。 (:issue: `17941` でRaymondHettingerによって寄稿されました。)
namesedtuple()の verbose および rename 引数がキーワードのみになりました。 (:issue: `25628` でRaymondHettingerによって寄稿されました。)
再帰的な collections.deque インスタンスをpickle化できるようになりました。 (:issue: `26482` のSerhiyStorchakaによる寄稿。)
コンカレント.futures
ThreadPoolExecutor クラスコンストラクターは、オプションの thread_name_prefix 引数を受け入れるようになり、プールによって作成されたスレッドの名前をカスタマイズできるようになりました。 (GregoryPによる寄稿。 のSmith:issue: `27664` 。)
contextlib
contextlib.AbstractContextManager クラスが追加され、コンテキストマネージャーに抽象基本クラスが提供されます。 これは、 __ enter __()の適切なデフォルト実装を提供し、self
を返し、 __ exit __()を抽象メソッドのままにします。 一致するクラスが typing モジュールに typing.ContextManager として追加されました。 (:issue: `25609` のBrettCannonによる寄稿。)
日付時刻
datetime クラスと time クラスには、必要に応じて現地時間を明確にするために使用される新しいfold
属性があります。 datetime の多くの関数が更新され、現地時間の曖昧性解消がサポートされています。 詳細については、現地時間の曖昧性解消セクションを参照してください。 (:issue: `24773` でAlexanderBelopolskyによって寄稿されました。)
datetime.strftime()および date.strftime()メソッドは、ISO8601日付ディレクティブ%G
、%u
、および%V
をサポートするようになりました。 ]。 (:issue: `12006` でAshleyAndersonによって寄稿されました。)
datetime.isoformat()関数は、含める時間値の追加コンポーネントの数を指定するオプションの timespec 引数を受け入れるようになりました。 (:issue: `19475` でAlessandroCucciとAlexanderBelopolskyによって寄稿されました。)
datetime.combine()は、オプションの tzinfo 引数を受け入れるようになりました。 (:issue: `27661` でAlexanderBelopolskyによって寄稿されました。)
10進数
新しい Decimal.as_integer_ratio()メソッドは、指定された Decimal インスタンスを分数として、最低条件で正の分母で表す整数のペア(n, d)
を返します。
>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)
(:issue: `25928` でStefanKrahおよびMarkDickinsonによって寄稿されました。)
distutils
default_format
属性はdistutils.command.sdist.sdist
から削除され、formats
属性はデフォルトで['gztar']
になります。 予期されていませんが、default_format
の存在に依存するコードを適合させる必要がある場合があります。 詳細については、:issue: `27819` を参照してください。
Eメール
policy キーワードを介してさまざまなコンストラクターに対して有効化された新しい電子メールAPIは、暫定的ではなくなりました。 email のドキュメントは、レガシーAPIの古いドキュメントを保持しながら、新しいAPIに焦点を当てるように再編成および書き直されました。 (Rによる寄稿。 のDavidMurray:issue: `24277` 。)
email.mime クラスはすべて、オプションの policy キーワードを受け入れるようになりました。 (:issue: `27331` のBerkerPeksagによる寄稿。)
DecodedGenerator は、 policy キーワードをサポートするようになりました。
新しい policy 属性 message_factory があり、パーサーが新しいメッセージオブジェクトを作成するときにデフォルトで使用されるクラスを制御します。 email.policy.compat32 ポリシーの場合、これは Message であり、新しいポリシーの場合、これは EmailMessage です。 (Rによる寄稿。 のDavidMurray:issue: `20476` 。)
エンコーディング
Windowsでは、CP_OEMCP
を使用する'oem'
エンコーディングと、CP_ACP
を使用する既存の'mbcs'
エンコーディングの'ansi'
エイリアスを追加しました。コードページ。 (:issue: `27959` でSteveDowerによって寄稿されました。)
列挙型
enum モジュールに、 Flag とIntFlags
の2つの新しい列挙型基本クラスが追加されました。 どちらも、ビット演算子を使用して組み合わせることができる定数を定義するために使用されます。 (:issue: `23591` でEthanFurmanによって寄稿されました。)
多くの標準ライブラリモジュールは、定数にIntFlags
クラスを使用するように更新されています。
新しい enum.auto 値を使用して、列挙型メンバーに値を自動的に割り当てることができます。
>>> from enum import Enum, auto
>>> class Color(Enum):
... red = auto()
... blue = auto()
... green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]
フォールトハンドラー
Windowsでは、 faulthandler モジュールがWindows例外のハンドラーをインストールするようになりました。 faulthandler.enable()を参照してください。 (:issue: `23848` でVictorStinnerによって寄稿されました。)
hashlib
hashlib はOpenSSL1.1.0をサポートします。 推奨される最小バージョンは1.0.2です。 (:issue: `26470` でChristianHeimesによって寄稿されました。)
BLAKE2ハッシュ関数がモジュールに追加されました。 blake2b()および blake2s()は常に利用可能であり、BLAKE2の全機能セットをサポートします。 (:issue: `26798` のChristianHeimesによる寄稿、DmitryChestnykhとSamuelNevesのコードに基づいています。 Dmitry Chestnykhによって書かれたドキュメント。)
SHA-3ハッシュ関数sha3_224()
、sha3_256()
、sha3_384()
、sha3_512()
、およびSHAKEハッシュ関数shake_128()
および [X112X ]が追加されました。 (:issue: `16113` のChristianHeimesによる寄稿。 Guido Bertoni、Joan Daemen、MichaëlPeeters、Gilles Van Assche、およびRonny VanKeerによるKeccakコードパッケージ。)
パスワードベースの鍵導出関数 scrypt()が、OpenSSL1.1.0以降で使用できるようになりました。 (:issue: `27928` でChristianHeimesによって寄稿されました。)
http.client
HTTPConnection.request()と endheaders()の両方で、チャンクエンコーディングリクエストボディがサポートされるようになりました。 (:issue: `12319` でDemianBrechtとRolfKrahlによって寄稿されました。)
idlelibとIDLE
idlelibパッケージは、IDLEの外観と動作を改善し、コードの理解、テスト、および改善を容易にするために、最新化およびリファクタリングされています。 特にLinuxとMacでIDLEの見栄えを良くすることの一部は、主にダイアログでttkウィジェットを使用することです。 その結果、IDLEはtcl / tk8.4で実行されなくなりました。 現在、tcl / tk8.5または8.6が必要です。 いずれかの最新リリースを実行することをお勧めします。
「近代化」には、idlelibモジュールの名前変更と統合が含まれます。 部分的に大文字の名前を持つファイルの名前変更は、たとえば、3.0でのTkinterとTkFontのtkinterとtkinter.fontへの名前変更に似ています。 その結果、3.5で機能していたidlelibファイルのインポートは、通常3.6では機能しません。 少なくともモジュール名の変更が必要になります(idlelib / README.txtを参照)。場合によってはそれ以上の変更が必要になります。 (:issue: `24225` でAlSwiegartとTerryReedyによって提供された名前の変更。 それ以来、ほとんどのidlelibパッチは、プロセスの一部であり、今後も含まれる予定です。)
代償として、最終的な結果として、一部のidlelibクラスは使いやすくなり、より優れたAPIとdocstringでそれらを説明できるようになります。 利用可能な場合、追加の有用な情報がidlelibに追加されます。
3.6.2の新機能:
オートコンプリートの複数の修正。 (:issue: `15786` のLouieLuによる寄稿。)
3.6.3の新機能:
モジュールブラウザ(以前はクラスブラウザと呼ばれていました)は、トップレベルの関数とクラスに加えて、ネストされた関数とクラスを表示するようになりました。 (:issue: `1612262` で、Guilherme Polo、Cheryl Sabella、およびTerry Jan Reedyによって寄稿されました。)
以前は拡張機能として実装されていたIDLE機能が、通常の機能として再実装されました。 それらの設定は、[拡張機能]タブから他のダイアログタブに移動されました。 (:issue: `27099` でCharlesWohlgangerとTerryJan Reedyによって寄稿されました。)
[設定]ダイアログ([オプション]、[IDLEの構成])は、外観と機能の両方を改善するために部分的に書き直されました。 (CherylSabellaとTerryJan Reedyが複数の問題で寄稿しました。)
3.6.4の新機能:
フォントサンプルには、ユーザーが特定のフォントを選択した場合の効果をよりよく確認できるように、非ラテン文字の選択が含まれるようになりました。 (:issue: `13802` のTerryJan Reedyによる寄稿。)サンプルを編集して、他のキャラクターを含めることができます。 (:issue: `31860` でSerhiyStorchakaによって寄稿されました。)
3.6.6の新機能:
エディタコードのコンテキストオプションが改訂されました。 ボックスには、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.6.7の新機能:
N行(デフォルトでは50)を超える出力は、ボタンに絞り込まれます。 Nは、[設定]ダイアログの[一般]ページの[PyShell]セクションで変更できます。 出力を右クリックすることで、より少ないが、場合によっては非常に長い行を絞ることができます。 スクイーズされた出力は、ボタンをダブルクリックして所定の位置に展開するか、ボタンを右クリックしてクリップボードまたは別のウィンドウに展開できます。 (:issue: `1529353` のTalEinatによる寄稿。)
importlib
インポートでモジュールが見つからない場合、インポートで新しい例外 ModuleNotFoundError ( ImportError のサブクラス)が発生するようになりました。 現在ImportError
をチェックするコード(try-except)は引き続き機能します。 (:issue: `15767` のEricSnowによる寄稿。)
importlib.util.LazyLoader は、ラップされたローダーで create_module()を呼び出すようになり、 importlib.machinery.BuiltinImporter および importlib.machineryの制限がなくなりました。 ExtensionFileLoader を importlib.util.LazyLoader と一緒に使用できませんでした。
importlib.util.cache_from_source()、 importlib.util.source_from_cache()、および importlib.util.spec_from_file_location()がパスを受け入れるようになりました-オブジェクトのように。
検査する
inspect.signature()関数は、コンパイラーによって生成された暗黙の.0
パラメーターを、implicit0
と呼ばれる位置のみのパラメーターであるかのように理解およびジェネレーター式スコープとして報告するようになりました。 (:issue: `19611` のJelleZijlstraによる寄稿。)
Python2.7および従来の inspect.getargspec() APIからアップグレードする際のコードチャーンを減らすために、以前に文書化された inspect.getfullargspec()の非推奨が取り消されました。 この関数はシングル/ソースのPython2 / 3コードベースに便利ですが、より豊富な inspect.signature()インターフェイスは新しいコードに推奨されるアプローチのままです。 (:issue: `27172` でNickCoghlanによって寄稿されました)
json
json.load()および json.loads()がバイナリ入力をサポートするようになりました。 エンコードされたJSONは、UTF-8、UTF-16、またはUTF-32のいずれかを使用して表す必要があります。 (:issue: `17909` でSerhiyStorchakaによって寄稿されました。)
ロギング
新しい WatchedFileHandler.reopenIfNeeded()メソッドが追加され、ログファイルを再度開く必要があるかどうかを確認する機能が追加されました。 (:issue: `24884` でMarianHorbanによって寄稿されました。)
算数
タウ(τ)定数が math および cmath モジュールに追加されました。 (:issue: `12345` のLisaRoachによる寄稿。詳細については、 PEP 628 を参照してください。)
マルチプロセッシング
multiprocessing.Manager()
によって返されるプロキシオブジェクトをネストできるようになりました。 (:issue: `6766` のDavinPottsによる寄稿。)
os
os および os.path モジュールがパスのようなオブジェクトをサポートする方法の詳細については、 PEP 519 の概要を参照してください。
scandir()は、Windowsで bytes パスをサポートするようになりました。
新しい close()メソッドを使用すると、 scandir()イテレータを明示的に閉じることができます。 scandir()イテレータは、コンテキストマネージャプロトコルをサポートするようになりました。 scandir()
イテレータが使い果たされておらず、明示的に閉じられていない場合、 ResourceWarning がデストラクタで発行されます。 (:issue: `25994` でSerhiyStorchakaによって寄稿されました。)
Linuxでは、 os.urandom()は、セキュリティを強化するためにシステムのurandomエントロピープールが初期化されるまでブロックするようになりました。 理論的根拠については、 PEP 524 を参照してください。
Linux getrandom()
システムコール(ランダムバイトを取得)が、新しい os.getrandom()関数として公開されるようになりました。 ( PEP 524 の一部であるVictorStinnerによる寄稿)
pathlib
pathlib が path-likeオブジェクトをサポートするようになりました。 (:issue: `27186` のBrettCannonによる寄稿。)
詳細については、 PEP 519 の概要を参照してください。
漬物
キーワード引数で呼び出される__new__
を必要とするオブジェクトは、プロトコルバージョン4より古い pickleプロトコルを使用してpickle化できるようになりました。 プロトコルバージョン4はすでにこのケースをサポートしています。 (:issue: `24164` のSerhiyStorchakaによる寄稿。)
pickletools
pickletools.dis()は、MEMOIZE
オペコードの暗黙的なメモインデックスを出力するようになりました。 (:issue: `25382` でSerhiyStorchakaによって寄稿されました。)
pydoc
pydoc モジュールは、MANPAGER
環境変数を尊重することを学習しました。 (:issue: `8637` のMatthiasKloseによる寄稿。)
help()および pydoc は、名前付きタプルフィールドを、アルファベット順ではなく、定義された順序で一覧表示できるようになりました。 (:issue: `24879` でRaymondHettingerによって寄稿されました。)
ランダム
新しい choices()関数は、オプションの重みを使用して、指定された母集団から指定されたサイズの要素のリストを返します。 (:issue: `18844` でRaymondHettingerによって寄稿されました。)
NS
正規表現の修飾子スパンのサポートが追加されました。 例:'(?i:p)ython'
は'python'
および'Python'
と一致しますが、'PYTHON'
とは一致しません。 '(?i)g(?-i:v)r'
は'GvR'
および'gvr'
と一致しますが、'GVR'
とは一致しません。 (:issue: `433028` のSerhiyStorchakaによる寄稿。)
一致オブジェクトグループには、__getitem__
からアクセスできます。これはgroup()
と同等です。 したがって、mo['name']
はmo.group('name')
と同等になります。 (:issue: `24454` でEricSmithによって寄稿されました。)
Match
オブジェクトは、グループインデックスとしてインデックスのようなオブジェクトをサポートするようになりました。 (:issue: `27177` でJeroenDemeyerとXiangZhangによって寄稿されました。)
rlcompleter
プレフィックスがアンダースコアで始まらない限り、プライベート属性名と特殊属性名は省略されるようになりました。 いくつかの完成したキーワードの後にスペースまたはコロンが追加されます。 (:issue: `25011` および:issue:` 25209` でSerhiyStorchakaによって寄稿されました。)
shlex
shlex は、句読点として扱われる文字を制御するための新しい punctuation_chars 引数により、シェル互換性が大幅に改善されています。 (:issue: `1521950` でVinaySajipによって寄稿されました。)
サイト
.pth ファイルの sys.path に追加するパスを指定するときに、ディレクトリの上にファイルパスを指定できるようになりました(例: zipファイル)。 (:issue: `26587` でWolfgangLangnerによって寄稿されました)。
sqlite3
sqlite3.Cursor.lastrowid がREPLACE
ステートメントをサポートするようになりました。 (:issue: `16864` でAlexLordThorsenによって寄稿されました。)
ソケット
ioctl()関数は、 SIO_LOOPBACK_FAST_PATH 制御コードをサポートするようになりました。 (:issue: `26536` のDanielStokesによる寄稿。)
getsockopt()定数SO_DOMAIN
、SO_PROTOCOL
、SO_PEERSEC
、およびSO_PASSSEC
がサポートされるようになりました。 (:issue: `26907` でChristianHeimesによって寄稿されました。)
setsockopt()がsetsockopt(level, optname, None, optlen: int)
フォームをサポートするようになりました。 (:issue: `27744` のChristianHeimesによる寄稿。)
ソケットモジュールは、Linuxカーネル暗号化APIとインターフェイスするために、アドレスファミリ AF_ALG をサポートするようになりました。 ALG_*
、SOL_ALG
、 sendmsg_afalg()が追加されました。 (:issue: `27744` のChristianHeimesによる寄稿、Victor Stinnerのサポートによる。)
新しいLinux定数TCP_USER_TIMEOUT
およびTCP_CONGESTION
が追加されました。 (Omar Sandovalによる寄稿、問題: 26273 )。
ソケットサーバー
socketserver モジュールに基づくサーバー( http.server 、 xmlrpc.server 、 wsgiref.simple_server で定義されているサーバーを含む)は、 コンテキストマネージャープロトコル。 (:issue: `26404` でAvivPalivodaによって寄稿されました。)
StreamRequestHandler クラスのwfile
属性は、 io.BufferedIOBase 書き込み可能インターフェイスを実装するようになりました。 特に、 write()を呼び出すと、データが完全に送信されることが保証されます。 (:issue: `26721` でMartinPanterによって寄稿されました。)
ssl
ssl はOpenSSL1.1.0をサポートします。 推奨される最小バージョンは1.0.2です。 (:issue: `26470` でChristianHeimesによって寄稿されました。)
3DESはデフォルトの暗号スイートから削除され、ChaCha20Poly1305暗号スイートが追加されました。 (:issue: `27850` および:issue:` 27766` でChristianHeimesによって寄稿されました。)
SSLContext には、オプションと暗号のデフォルト構成が優れています。 (:issue: `28043` でChristianHeimesによって寄稿されました。)
SSLセッションは、新しい SSLSession クラスを使用して、あるクライアント側接続から別のクライアント側接続にコピーできます。 TLSセッションの再開により、最初のハンドシェイクが高速化され、待ち時間が短縮され、パフォーマンスが向上します(Alex Warhawkによるドラフトに基づく:issue: `19500` のChristianHeimesによる寄稿)。
新しい get_ciphers()メソッドを使用して、有効な暗号のリストを暗号の優先度順に取得できます。
すべての定数とフラグは IntEnum とIntFlags
に変換されています。 (:issue: `28025` でChristianHeimesによって寄稿されました。)
SSLContext 用のサーバーおよびクライアント側固有のTLSプロトコルが追加されました。 (:issue: `28085` でChristianHeimesによって寄稿されました。)
構造体
struct は、'e'
フォーマット指定子を介してIEEE754半精度浮動小数点数をサポートするようになりました。 (:issue: `11734` のEliStevens、Mark Dickinsonによる寄稿。)
サブプロセス
subprocess.Popen デストラクタは、子プロセスがまだ実行中の場合に ResourceWarning 警告を発行するようになりました。 コンテキストマネージャプロトコル(with proc: ...
)を使用するか、 wait()メソッドを明示的に呼び出して、子プロセスの終了ステータスを読み取ります。 (:issue: `26741` でVictorStinnerによって寄稿されました。)
subprocess.Popen コンストラクターと、それに引数を渡すすべての関数は、 encoding および errors 引数を受け入れるようになりました。 これらのいずれかを指定すると、 stdin 、 stdout 、および stderr ストリームのテキストモードが有効になります。 (:issue: `6135` でSteveDowerによって寄稿されました。)
sys
新しい getfilesystemencodeerrors()関数は、Unicodeファイル名とバイトファイル名の間の変換に使用されるエラーモードの名前を返します。 (:issue: `27781` でSteveDowerによって寄稿されました。)
Windowsでは、 getwindowsversion()関数の戻り値に、 platform_version フィールドが含まれるようになりました。このフィールドには、バージョンではなく、現在のオペレーティングシステムの正確なメジャーバージョン、マイナーバージョン、およびビルド番号が含まれます。これはプロセス用にエミュレートされています(:issue: `27932` のSteveDowerによる寄稿)。
timeit
新しい Timer.autorange()コンビニエンスメソッドが追加され、 Timer.timeit()を繰り返し呼び出すようになり、合計実行時間が200ミリ秒以上になりました。 (:issue: `6422` でStevenD'Apranoによって寄稿されました。)
timeit は、最良の時間と最悪の時間の間に実質的な(4x)差異がある場合に警告するようになりました。 (:issue: `23552` のSerhiyStorchakaによる寄稿。)
tkinter
tkinter.Variable
クラスにメソッドtrace_add()
、trace_remove()
、trace_info()
を追加しました。 これらは、廃止されたTclコマンドを使用し、将来のバージョンのTclでは機能しない可能性がある古いメソッドtrace_variable()
、trace()
、trace_vdelete()
、およびtrace_vinfo()
を置き換えます。 (:issue: `22115` のSerhiyStorchakaによる寄稿)。
トレースバック
次の例に示すように、トレースバックモジュールとインタプリタの組み込み例外表示の両方で、トレースバック内の繰り返される行の長いシーケンスが省略されるようになりました。
>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
File "<stdin>", line 1, in f
[Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded
(:issue: `26823` でEmanuelBarryによって寄稿されました。)
tracemalloc
tracemalloc モジュールは、複数の異なるアドレス空間でのメモリ割り当てのトレースをサポートするようになりました。
新しい DomainFilter フィルタークラスが追加され、アドレス空間(ドメイン)でブロックトレースをフィルター処理します。
(:issue: `26588` でVictorStinnerによって寄稿されました。)
タイピング
typing モジュールは provisional であるため、Python3.6で導入されたすべての変更もPython3.5.xにバックポートされています。
typing モジュールでは、ジェネリック型エイリアスのサポートが大幅に改善されています。 たとえば、Dict[str, Tuple[S, T]]
は有効な型注釈になりました。 ( Github#195 でGuidovan Rossumによって寄稿されました。)
contextlib.AbstractContextManager を表すために typing.ContextManager クラスが追加されました。 (:issue: `25609` のBrettCannonによる寄稿。)
collections.abc.Collection を表すために typing.Collection クラスが追加されました。 (:issue: `27598` でIvanLevkivskyiによって寄稿されました。)
typing.ClassVar 型コンストラクトが追加され、クラス変数をマークします。 PEP 526 で紹介されているように、ClassVarでラップされた変数アノテーションは、特定の属性がクラス変数として使用されることを意図しており、そのクラスのインスタンスに設定されるべきではないことを示します。 ( Github#280 でIvanLevkivskyiによって寄稿されました。)
新しい TYPE_CHECKING 定数。静的型チェッカーによってTrue
と見なされますが、実行時にはFalse
です。 ( Github#230 でGuidovan Rossumによって寄稿されました。)
新しい NewType()ヘルパー関数が追加され、アノテーション用の軽量の個別タイプが作成されました。
from typing import NewType
UserId = NewType('UserId', int)
some_id = UserId(524313)
静的型チェッカーは、新しい型を元の型のサブクラスであるかのように扱います。 ( Github#189 でIvanLevkivskyiによって寄稿されました。)
unittest.mock
Mock クラスには次の改善があります。
- モックオブジェクトが呼び出されたかどうかを確認するための2つの新しいメソッド Mock.assert_called()と Mock.assert_called_once()。 (:issue: `26323` でAmitSahaによって寄稿されました。)
- Mock.reset_mock()メソッドに、 return_value と side_effect の2つのオプションのキーワードのみの引数が追加されました。 (:issue: `21271` のKushalDasによる寄稿。)
urllib.request
HTTPリクエストにファイルまたは反復可能な本文(バイトオブジェクト以外)が含まれているが、Content-Length
ヘッダーがない場合、エラーをスローするのではなく、AbstractHTTPHandler
がフォールバックしてチャンク転送エンコーディングを使用するようになりました。 (:issue: `12319` でDemianBrechtとRolfKrahlによって寄稿されました。)
urllib.robotparser
RobotFileParser は、Crawl-delay
およびRequest-rate
拡張機能をサポートするようになりました。 (:issue: `16099` でNikolayBogoychevによって寄稿されました。)
venv
venv は新しいパラメーター--prompt
を受け入れます。 このパラメーターは、仮想環境の代替プレフィックスを提供します。 (ŁukaszBalcerzakによって提案され、:issue: `22829` でStéphaneWirtelによって3.6に移植されました。)
警告
新しいオプションの source パラメーターが warnings.warn_explicit()関数に追加されました: ResourceWarning を発行した破棄されたオブジェクト。 source 属性もwarnings.WarningMessage
に追加されました(:issue: `26568` および:issue:` 26567` [X141XでVictorStinnerによって寄稿されました) ])。
ResourceWarning 警告がログに記録されると、 tracemalloc モジュールを使用して、破棄されたオブジェクトが割り当てられたトレースバックを取得しようとします。
スクリプトexample.py
の例:
import warnings
def func():
return open(__file__)
f = func()
f = None
コマンドpython3.6 -Wd -X tracemalloc=5 example.py
の出力:
example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
f = None
Object allocated at (most recent call first):
File "example.py", lineno 4
return open(__file__)
File "example.py", lineno 6
f = func()
「オブジェクトが割り当てられました」トレースバックは新しく、 tracemalloc がPythonメモリ割り当てをトレースしていて、警告モジュールがすでにインポートされている場合にのみ表示されます。
xmlrpc.client
xmlrpc.client モジュールは、ApacheXML-RPC実装で数値およびNone
に使用される追加のデータ型のアンマーシャリングをサポートするようになりました。 (:issue: `26885` でSerhiyStorchakaによって寄稿されました。)
ZIPファイル
新しい ZipInfo.from_file()クラスメソッドを使用すると、ファイルシステムファイルから ZipInfo インスタンスを作成できます。 新しい ZipInfo.is_dir()メソッドを使用して、 ZipInfo インスタンスがディレクトリを表すかどうかを確認できます。 (:issue: `26039` でThomasKluyverによって寄稿されました。)
ZipFile.open()メソッドを使用して、データをZIPファイルに書き込んだり、データを抽出したりできるようになりました。 (:issue: `26039` でThomasKluyverによって寄稿されました。)
zlib
compress()および decompress()関数は、キーワード引数を受け入れるようになりました。 (:issue: `26243` のAvivPalivodaと:issue:` 16764` のXiangZhangによってそれぞれ寄稿されました。)
最適化
- Pythonインタープリターは、バイトコードの代わりに16ビットのワードコードを使用するようになりました。これにより、多くのオペコードの最適化が可能になりました。 (:issue: `26647` および:issue:` 28050` のSerhiyStorchakaおよびVictorStinnerからの入力とレビューでDemurRumedによって寄稿されました。)
- asyncio.Future クラスには、最適化されたC実装が含まれるようになりました。 (:issue: `26081` でYurySelivanovとINADANaokiによって寄稿されました。)
- asyncio.Task クラスに最適化されたC実装が追加されました。 (:issue: `28544` でYurySelivanovによって寄稿されました。)
- タイピングモジュールのさまざまな実装の改善(ジェネリック型のキャッシュなど)により、パフォーマンスが最大30倍向上し、メモリフットプリントが削減されます。
- ASCIIデコーダーは、エラーハンドラー
surrogateescape
、ignore
、およびreplace
の最大60倍の速度になりました(:issue: `24870` [のVictorStinnerによる寄稿X154X])。 - ASCIIおよびLatin1エンコーダーは、エラーハンドラー
surrogateescape
の最大3倍の速度になりました(:issue: `25227` のVictorStinnerによる寄稿)。 - UTF-8エンコーダーは、エラーハンドラー
ignore
、replace
、surrogateescape
、surrogatepass
の最大75倍の速度になりました(VictorStinnerによる[ X144X]:issue: `25267` )。 - UTF-8デコーダーは、エラーハンドラー
ignore
、replace
、およびsurrogateescape
で最大15倍高速になりました(:issue: `25301でVictorStinnerが寄稿) `)。 bytes % args
が最大2倍高速になりました。 (:issue: `25349` のVictorStinnerによる寄稿)。bytearray % args
は、2.5〜5倍高速になりました。 (:issue: `25399` のVictorStinnerによる寄稿)。- bytes.fromhex()と bytearray.fromhex()を最適化します。これらは2倍から3.5倍高速になりました。 (:issue: `25401` のVictorStinnerによる寄稿)。
bytes.replace(b, b'.')
およびbytearray.replace(b
, b'.')
を最適化:最大80 % f aster。 (:issue: `26574` のJoshSniderによる寄稿)。- PyMem_Malloc()ドメイン(
PYMEM_DOMAIN_MEM
)のアロケータ関数は、Cライブラリのmalloc()
関数の代わりに pymallocメモリアロケータを使用するようになりました。 pymallocアロケータは、寿命が短い512バイト以下のオブジェクト用に最適化されており、大きなメモリブロックにはmalloc()
を使用します。 (:issue: `26249` のVictorStinnerによる寄稿)。 - pickle.load()および pickle.loads()は、多くの小さなオブジェクトを逆シリアル化するときに最大10 % f asterになりました(:issue: `のVictorStinnerによる寄稿27056` )。
- キーワード引数を関数に渡すことは、位置引数を渡すことと比較してオーバーヘッドがあります。 現在、引数クリニックを使用して実装された拡張関数では、このオーバーヘッドが大幅に削減されています。 (:issue: `27574` のSerhiyStorchakaによる寄稿)。
- glob モジュールで最適化された glob()および iglob()関数。 現在、約3〜6倍高速です。 (:issue: `25596` のSerhiyStorchakaによる寄稿)。
- os.scandir()を使用して、 pathlib のグロブを最適化しました。 現在は約1.5〜4倍高速です。 (:issue: `26032` のSerhiyStorchakaによる寄稿)。
- xml.etree.ElementTree の解析、反復、およびディープコピーのパフォーマンスが大幅に改善されました。 (:issue: `25638` 、:issue:` 25873` 、および:issue: `25869` でSerhiyStorchakaによって寄稿されました。)
- floatとdecimalsからの fractions.Fraction インスタンスの作成は、2〜3倍高速になりました。 (:issue: `25971` でSerhiyStorchakaによって寄稿されました。)
ビルドとCAPIの変更
- Pythonは、ビルドするためにツールチェーンでC99サポートを必要とします。 最も注目すべきは、Pythonが
PY_LONG_LONG
のようなカスタムマクロの代わりに標準の整数型とマクロを使用するようになったことです。 詳細については、 PEP 7 および:issue: `17884` を参照してください。 - AndroidNDKとAndroidAPIレベルを21(Android 5.0 Lollipop)以上に設定してCPythonをクロスコンパイルすると、正常に実行されます。 Androidはまだサポートされているプラットフォームではありませんが、PythonテストスイートはAndroidエミュレーターで実行され、テストは約16回失敗します。 Androidメタイシュー:issue: `26865` を参照してください。
--enable-optimizations
構成フラグが追加されました。 オンにすると、PGOなどの高価な最適化がアクティブになります。 (:issue: `26359` のIntelのAlecsandruPatrascuによるオリジナルパッチ。)- GIL は、
PYMEM_DOMAIN_OBJ
(例: PyObject_Malloc())およびPYMEM_DOMAIN_MEM
(例: PyMem_Malloc( ))ドメインが呼び出されます。 - バッファリングされたデータのフラッシュが失敗したかどうかを示す新しい Py_FinalizeEx() API。 (:issue: `5319` でMartinPanterによって寄稿されました。)
- PyArg_ParseTupleAndKeywords()は、位置のみのパラメーターをサポートするようになりました。 位置のみのパラメーターは、空の名前で定義されます。 (:issue: `26282` のSerhiyStorchakaによる寄稿)。
PyTraceback_Print
メソッドは、繰り返される行の長いシーケンスを"[Previous line repeated {count} more times]"
と短縮するようになりました。 (:issue: `26823` でEmanuelBarryによって寄稿されました。)- 新しい PyErr_SetImportErrorSubclass()関数を使用すると、発生させる ImportError のサブクラスを指定できます。 (:issue: `15767` のEricSnowによる寄稿。)
- 新しい PyErr_ResourceWarning()関数を使用して、リソース割り当てのソースを提供する ResourceWarning を生成できます。 (:issue: `26567` でVictorStinnerによって寄稿されました。)
- 新しい PyOS_FSPath()関数は、パスのようなオブジェクトのファイルシステム表現を返します。 (:issue: `27186` のBrettCannonによる寄稿。)
- PyUnicode_FSConverter()および PyUnicode_FSDecoder()関数は、パスのようなオブジェクトを受け入れるようになりました。
その他の改善
-version (短縮形: -V )が2回指定されると、Pythonは詳細情報として sys.version を出力します。
$ ./python -VV Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04) [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
非推奨
新しいキーワード
async
およびawait
を変数、クラス、関数、またはモジュール名として使用することはお勧めしません。 Python3.5の PEP 492 によって導入され、Python3.7では適切なキーワードになります。 Python 3.6以降、名前としてasync
またはawait
を使用すると、 DeprecationWarning が生成されます。
非推奨のPythonの動作
ジェネレーター内で StopIteration 例外を発生させると、 DeprecationWarning が生成され、Python3.7で RuntimeError がトリガーされます。 詳細については、 PEP 479:ジェネレーター内のStopIteration処理の変更を参照してください。
__aiter__()
メソッドは、以前のように待機可能オブジェクトを返すのではなく、非同期イテレーターを直接返すことが期待されるようになりました。 前者を実行すると、 DeprecationWarning がトリガーされます。 下位互換性はPython3.7で削除されます。 (:issue: `27243` でYurySelivanovによって寄稿されました。)
有効なエスケープシーケンスではない円記号と文字のペアが、 DeprecationWarning を生成するようになりました。 これは最終的に SyntaxError になりますが、いくつかのPythonリリースではそうではありません。 (:issue: `27364` でEmanuelBarryによって寄稿されました。)
相対インポートを実行するときに、__spec__
または__package__
が定義されていないときに、呼び出し元モジュールから__name__
および__path__
にフォールバックすると、 ImportWarningが発生するようになりました。 。 (:issue: `25791` のRoseAmesによる寄稿。)
非推奨のPythonモジュール、関数、メソッド
dbm
他の dbm 実装とは異なり、 dbm.dumb モジュールは、'rw'
モードでデータベースを作成し、'r'
モードで開いたデータベースを変更できます。 この動作は非推奨になり、3.8で削除される予定です。 (:issue: `21708` でSerhiyStorchakaによって寄稿されました。)
distutils
Distribution
コンストラクターに対する文書化されていないextra_path
引数は非推奨と見なされ、設定されている場合は警告が表示されます。 このパラメーターのサポートは、将来のPythonリリースで削除される予定です。 詳細については、:issue: `27919` を参照してください。
importlib
importlib.machinery.SourceFileLoader.load_module()および importlib.machinery.SourcelessFileLoader.load_module()メソッドは非推奨になりました。 これらは、 importlib の importlib.abc.Loader.load_module()の残りの実装であり、 importlib.abcを優先して以前のバージョンのPythonでは非推奨ではありませんでした。 Loader.exec_module()。
importlib.machinery.WindowsRegistryFinder クラスは非推奨になりました。 3.6.0以降、デフォルトで sys.meta_path に追加されています(Windowsの場合)が、将来のリリースで変更される可能性があります。
os
os 関数、 compile()および同様の関数のパスとしての一般的なバイトのようなオブジェクトの文書化されていないサポートは非推奨になりました。 (:issue: `25791` および:issue:` 26754` でSerhiyStorchakaによって寄稿されました。)
NS
正規表現の途中でのインラインフラグ(?letters)
のサポートは非推奨になり、将来のPythonバージョンで削除される予定です。 正規表現の先頭にあるフラグは引き続き使用できます。 (:issue: `22493` でSerhiyStorchakaによって寄稿されました。)
ssl
OpenSSL 0.9.8、1.0.0、および1.0.1は非推奨になり、サポートされなくなりました。 将来的には、 ssl モジュールには少なくともOpenSSL1.0.2または1.1.0が必要になります。
ftplib 、 http.client 、 imaplib のcertfile
、keyfile
、check_hostname
などのSSL関連の引数]、 poplib 、および smtplib は非推奨になり、context
が優先されます。 (:issue: `28022` でChristianHeimesによって寄稿されました。)
ssl モジュールのいくつかのプロトコルと機能は非推奨になりました。 一部の機能は、OpenSSLの将来のバージョンでは使用できなくなります。 他の機能は廃止され、別のAPIが採用されました。 (:issue: `28022` および:issue:` 26470` でChristianHeimesによって寄稿されました。)
venv
pyvenv
スクリプトは非推奨になり、python3 -m venv
が優先されます。 これにより、どのPythonインタープリターpyvenv
が接続されているか、したがって仮想環境でどのPythonインタープリターが使用されるかについての混乱を防ぐことができます。 (:issue: `25154` のBrettCannonによる寄稿。)
非推奨の関数とCAPIのタイプ
文書化されていない機能PyUnicode_AsEncodedObject()
、PyUnicode_AsDecodedObject()
、PyUnicode_AsEncodedUnicode()
、およびPyUnicode_AsDecodedUnicode()
は非推奨になりました。 代わりに、汎用コーデックベースのAPI を使用してください。
非推奨のビルドオプション
--with-system-ffi
設定フラグは、非macOSUNIXプラットフォームでデフォルトでオンになりました。 --without-system-ffi
を使用すると無効になる場合がありますが、フラグの使用は非推奨であり、Python3.7では受け入れられません。 macOSはこの変更の影響を受けません。 多くのOSディストリビューターは、システムPythonを構築するときに、すでに--with-system-ffi
フラグを使用していることに注意してください。
NS
APIと機能の削除
'\'
と正規表現のASCII文字で構成される不明なエスケープにより、エラーが発生するようになりました。 re.sub()の置換テンプレートでは、引き続き許可されますが、非推奨になります。 re.LOCALE フラグは、バイナリパターンでのみ使用できるようになりました。inspect.getmoduleinfo()
は削除されました(CPython 3.3以降非推奨になりました)。 inspect.getmodulename()は、特定のパスのモジュール名を取得するために使用する必要があります。 (:issue: `13248` でYurySelivanovによって寄稿されました。)traceback.Ignore
クラスおよびtraceback.usage
、traceback.modname
、traceback.fullmodname
、traceback.find_lines_from_code
、traceback.find_lines
、traceback.find_strings
、traceback.find_executable_lines
メソッドは traceback モジュールから削除されました。 Python 3.2および同等の機能がプライベートメソッドから利用できるため、これらは非推奨のドキュメント化されていないメソッドでした。- tkinter ウィジェットクラスの
tk_menuBar()
およびtk_bindForTraversal()
ダミーメソッドが削除されました(対応するTkコマンドはTk 4.0以降廃止されました)。 - zipfile.ZipFile クラスの open()メソッドは、
'U'
モードをサポートしなくなりました(Python 3.4以降非推奨)。 ユニバーサルニューラインモードで圧縮テキストファイルを読み取るには、 io.TextIOWrapper を使用します。 - 文書化されていない
IN
、CDROM
、DLFCN
、TYPES
、CDIO
、およびSTROPTS
モジュールは削除されました。 それらはプラットフォーム固有のLib/plat-*/
ディレクトリで利用可能でしたが、慢性的に古く、プラットフォーム間で一貫して利用できず、保守されていませんでした。 これらのモジュールを作成したスクリプトは、:source: `Tools / scripts / h2py.py` のソースディストリビューションで引き続き利用できます。 - 非推奨の
asynchat.fifo
クラスは削除されました。
Python3.6への移植
このセクションでは、コードの変更が必要になる可能性のある、前述の変更とその他のバグ修正を示します。
'python'コマンドの動作の変更
COUNT_ALLOCS
、SHOW_ALLOC_COUNT
、またはSHOW_TRACK_COUNT
マクロが定義された特別なPythonビルドの出力がデフォルトでオフになりました。-X showalloccount
オプションを使用して再度有効にすることができます。stdout
ではなくstderr
に出力するようになりました。 (:issue: `23034` のSerhiyStorchakaによる寄稿。)
PythonAPIの変更
open()は、
'U'
モードフラグを'+'
と組み合わせることを許可しなくなりました。 (:issue: `2091` でJeffBaloghとJohnO'Connorによって寄稿されました。)sqlite3 は、DDLステートメントの前にオープントランザクションを暗黙的にコミットしなくなりました。
Linuxでは、 os.urandom()は、セキュリティを強化するためにシステムのurandomエントロピープールが初期化されるまでブロックするようになりました。
importlib.abc.Loader.exec_module()を定義する場合は、 importlib.abc.Loader.create_module()も定義する必要があります。
PyErr_SetImportError()は、 msg 引数が設定されていない場合に、 TypeError を設定するようになりました。 以前は、
NULL
のみが返されていました。コードオブジェクトの
co_lnotab
属性の形式が変更され、負の行番号デルタがサポートされるようになりました。 デフォルトでは、Pythonは負の行番号デルタを持つバイトコードを出力しません。frame.f_lineno
、PyFrame_GetLineNumber()
、またはPyCode_Addr2Line()
を使用する機能は影響を受けません。co_lnotab
を直接デコードする関数は、行番号デルタに符号付き8ビット整数型を使用するように更新する必要がありますが、これは負の行番号デルタを使用するアプリケーションをサポートする場合にのみ必要です。co_lnotab
形式とそのデコード方法については、Objects/lnotab_notes.txt
を参照してください。理論的根拠については、 PEP 511 を参照してください。compileall モジュールの関数は、
1
または0
の代わりにブール値を返し、それぞれ成功または失敗を表すようになりました。 整数のサブクラスであるブール値のおかげで、これは1
または0
のIDチェックを行っている場合にのみ問題になるはずです。 :issue: `25768` を参照してください。urllib.parse.urlsplit()および urlparse()の結果の
port
属性を読み取ると、範囲外の値に対して ValueError が発生するようになりました。 、 None を返すのではなく。 :issue: `20059` を参照してください。imp モジュールは、 PendingDeprecationWarning ではなく DeprecationWarning を発生させるようになりました。
次のモジュールでは、ドキュメント化されたAPIと一致するように
__all__
属性に不足しているAPIが追加されています: calendar 、 cgi 、 csv 、 ElementTree 、列挙型、ファイル入力、 ftplib 、ロギング、メールボックス、 mimetypes [ X281X]、 optparse 、 plistlib 、 smtpd 、サブプロセス、 tarfile 、スレッドおよび wave 。 これは、import *
が使用されている場合に新しいシンボルをエクスポートすることを意味します。 (:issue: `23883` でJoelTaddeiとJacekKołodziejによって寄稿されました。)相対インポートを実行するときに、
__package__
が__spec__.parent
と等しくない場合、 ImportWarning が発生します。 (:issue: `25791` のBrettCannonによる寄稿。)相対インポートが実行され、親パッケージが不明な場合、 ImportError が発生します。 以前は、 SystemError が発生する可能性がありました。 (:issue: `18018` のBrettCannonによる寄稿。)
socketserver モジュールに基づくサーバー( http.server 、 xmlrpc.server 、 wsgiref.simple_server で定義されているサーバーを含む)は、キャッチのみになりました。 例外から派生した例外。 したがって、リクエストハンドラが SystemExit や KeyboardInterrupt などの例外を発生させた場合、 handle_error()は呼び出されなくなり、例外はシングルスレッドサーバーを停止します。 (:issue: `23430` でMartinPanterによって寄稿されました。)
spwd.getspnam()は、ユーザーに権限がない場合、 KeyError ではなく PermissionError を発生させるようになりました。
socket.socket.close()メソッドは、エラーが発生した場合に例外を発生させるようになりました(例:
EBADF
)は、基盤となるシステムコールによって報告されました。 (:issue: `26685` でMartinPanterによって寄稿されました。)smtpd.SMTPChannel および smtpd.SMTPServer コンストラクターの decode_data 引数は、デフォルトで
False
になりました。 これは、 process_message()に渡される引数がデフォルトでバイトオブジェクトになり、process_message()
にキーワード引数が渡されることを意味します。 3.5によって生成された非推奨の警告に従ってすでに更新されているコードは影響を受けません。dump()、 dumps()、 load()、 load()関数および JSONEncoderのすべてのオプションの引数 json モジュールのおよび JSONDecoder クラスコンストラクターは、キーワードのみになりました。 (:issue: `18726` でSerhiyStorchakaによって寄稿されました。)
type.__new__
をオーバーライドしない type のサブクラスは、オブジェクトの型を取得するために1つの引数形式を使用できなくなりました。PEP 487 の一部として、 type (メタクラスヒント
metaclass
を除く)に渡されるキーワード引数の処理が一貫して委任されるようになりました。 object .__ init_subclass __()に。 つまり、type.__new__()
とtype.__init__()
はどちらも任意のキーワード引数を受け入れるようになりましたが、 object .__ init_subclass __()(type.__new__()
から呼び出されます)はそれらを拒否しますデフォルトでは。 追加のキーワード引数を受け入れるカスタムメタクラスは、それに応じてtype.__new__()
への呼び出しを調整する必要があります(直接または super 経由)。distutils.command.sdist.sdist
では、default_format
属性が削除され、尊重されなくなりました。 代わりに、gzip圧縮されたtarfile形式がすべてのプラットフォームのデフォルトであり、プラットフォーム固有の選択は行われません。 ディストリビューションがWindows上に構築され、zipディストリビューションが必要な環境では、以下を含むsetup.cfg
ファイルを使用してプロジェクトを構成します。[sdist] formats=zip
この動作は、Setuptools26.0.0によって以前のPythonバージョンにもバックポートされています。
urllib.request モジュールおよび http.client.HTTPConnection.request()メソッドで、Content-Lengthヘッダーフィールドが指定されておらず、リクエストの本文がファイルオブジェクトの場合、 HTTP1.1チャンクエンコーディングで送信されるようになりました。 ファイルオブジェクトをHTTP1.0サーバーに送信する必要がある場合は、呼び出し元がContent-Length値を指定する必要があります。 (:issue: `12319` のMartinPanterからの調整により、DemianBrechtとRolfKrahlによって寄稿されました。)
DictReader は、タイプ OrderedDict の行を返すようになりました。 (:issue: `27842` でSteveHoldenによって寄稿されました。)
プラットフォームでサポートされていない場合、 crypt.METHOD_CRYPT は
crypt.methods
に追加されなくなります。 (:issue: `25287` でVictorStinnerによって寄稿されました。)namesedtuple()の verbose および rename 引数がキーワードのみになりました。 (:issue: `25628` でRaymondHettingerによって寄稿されました。)
Linuxでは、 ctypes.util.find_library()が
LD_LIBRARY_PATH
で共有ライブラリを検索するようになりました。 (:issue: `9998` のVinaySajipによる寄稿。)imaplib.IMAP4 クラスは、サーバーから送信されるメッセージに
']'
文字を含むフラグを処理するようになり、実際の互換性が向上しました。 (:issue: `21815` のLitaChoによる寄稿。)mmap.write()
関数は、他の書き込みメソッドと同様に書き込まれたバイト数を返すようになりました。 (:issue: `26335` でJakubStasiakによって寄稿されました。)pkgutil.iter_modules()および pkgutil.walk_packages()関数は、 ModuleInfo という名前のタプルを返すようになりました。 (:issue: `17211` のRamchandraApteによる寄稿。)
re.sub()は、パターンが文字列に見つからない場合でも、置換テンプレート内の無効な数値グループ参照に対してエラーを発生させるようになりました。 無効なグループ参照のエラーメッセージに、グループインデックスと参照の位置が含まれるようになりました。 (SilentGhost、Serhiy Storchakaによる:issue: `25953` での寄稿。)
zipfile.ZipFile は、認識されない圧縮値に対して NotImplementedError を発生させるようになりました。 以前は、プレーンな RuntimeError が発生していました。 さらに、閉じたZipFileで ZipFile メソッドを呼び出すか、モード
'r'
で作成されたZipFileで write()メソッドを呼び出すと、 ValueError が発生します。 。 以前は、これらのシナリオで RuntimeError が発生していました。カスタムメタクラスを引数なしの super()と組み合わせるか、メソッドから暗黙の
__class__
クロージャ変数への直接参照と組み合わせる場合、暗黙の__classcell__
名前空間エントリを渡す必要があります。初期化のためにtype.__new__
に。 そうしないと、Python3.6では DeprecationWarning になり、Python3.8では RuntimeError になります。ModuleNotFoundError の導入により、インポートシステムのコンシューマーは、インポートシステムの置き換えにより、具体性の低い ImportError ではなく、必要に応じてより具体的な例外が発生することを期待し始める場合があります。 このようなコンシューマーとの将来の互換性を提供するために、 __ import __()を完全に置き換える代替インポートシステムの実装者は、モジュールがまったく見つからない場合に新しいサブクラスを上げるように実装を更新する必要があります。 デフォルトのインポートシステムに準拠するプラグインの実装者は、必要に応じて新しいサブクラスを作成するため、変更を加える必要はありません。
CAPIの変更
- PyMem_Malloc()アロケータファミリは、システム
malloc()
ではなく pymallocアロケータを使用するようになりました。 GILを保持せずに PyMem_Malloc()を呼び出すアプリケーションがクラッシュする可能性があります。 PYTHONMALLOC 環境変数をdebug
に設定して、アプリケーションでのメモリアロケータの使用状況を検証します。 :issue: `26249` を参照してください。 - Py_Exit()(およびメインインタープリター)は、バッファーされたデータのフラッシュが失敗した場合に、終了ステータスを120でオーバーライドするようになりました。 :issue: `5319` を参照してください。
CPythonバイトコードの変更
Python3.6のバイトコードにいくつかの大きな変更がありました。
- Pythonインタープリターは、バイトコードの代わりに16ビットのワードコードを使用するようになりました。 (:issue: `26647` および:issue:` 28050` のSerhiyStorchakaおよびVictorStinnerからの入力とレビューでDemurRumedによって寄稿されました。)
- 新しい:opcode: `FORMAT_VALUE` および:opcode:` BUILD_STRING` オペコードは、形式の文字列リテラル実装の一部として機能します。 (:issue: `25483` のEricSmithと:issue:` 27078` のSerhiyStorchakaによる寄稿。)
- 新しい:opcode: `BUILD_CONST_KEY_MAP` オペコードは、定数キーを使用した辞書の作成を最適化します。 (:issue: `27140` のSerhiyStorchakaによる寄稿。)
- 関数呼び出しのオペコードは、パフォーマンスの向上と実装の簡素化のために大幅に作り直されました。 :opcode: `MAKE_FUNCTION` 、:opcode:` CALL_FUNCTION` 、:opcode: `CALL_FUNCTION_KW` および:opcode:` BUILD_MAP_UNPACK_WITH_CALL` [ X152X]オペコードが変更され、新しい:opcode: `CALL_FUNCTION_EX` および:opcode:` BUILD_TUPLE_UNPACK_WITH_CALL` が追加され、
CALL_FUNCTION_VAR
、 [ X318X]およびMAKE_CLOSURE
オペコードは削除されました。 (:issue: `27095` のDemurRumed、および:issue:` 27213` 、:issue: `28257` のSerhiyStorchakaによる寄稿。) - 新しい:opcode: `SETUP_ANNOTATIONS` および:opcode:` STORE_ANNOTATION` オペコードが追加され、新しい変数アノテーション構文がサポートされています。 (:issue: `27985` でIvanLevkivskyiによって寄稿されました。)
Python3.6.2での注目すべき変更
新しいmake regen-allビルドターゲット
クロスコンパイルを簡素化し、既存のバージョンのPythonがすでに利用可能でなくても、CPythonを確実にコンパイルできるようにするために、autotoolsベースのビルドシステムは、ファイルの変更時間に基づいて生成されたファイルを暗黙的に再コンパイルしようとしなくなりました。
代わりに、新しいmake regen-all
コマンドが追加され、必要に応じてこれらのファイルを強制的に再生成します(例: Pythonの初期バージョンが、事前に生成されたバージョンに基づいてすでに構築された後)。
より選択的な再生ターゲットも定義されています。詳細については、:source: `Makefile.pre.in` を参照してください。
(:issue: `23404` でVictorStinnerによって寄稿されました。)
バージョン3.6.2の新機能。
make touchビルドターゲットの削除
以前は、変更時刻を更新して生成されたファイルの暗黙的な再生成を要求するために使用されていたmake touch
ビルドターゲットが削除されました。
新しいmake regen-all
ターゲットに置き換えられました。
(:issue: `23404` でVictorStinnerによって寄稿されました。)
バージョン3.6.2で変更されました。
Python3.6.4での注目すべき変更
パブリックAPIの一部であったPyExc_RecursionErrorInst
シングルトンは、メンバーがクリアされないため、インタープリターのファイナライズ中にセグメンテーション違反が発生する可能性があるため、削除されました。 (Xavier de Gayeによる:issue: `22898` および:issue:` 30697` での寄稿)
Python3.6.5での注目すべき変更
locale.localeconv()関数は、LC_CTYPE
ロケールをLC_NUMERIC
ロケールに一時的に設定する場合があります。 (:issue: `31900` でVictorStinnerによって寄稿されました。)
Python3.6.7での注目すべき変更
3.6.7では、 tokenize モジュールは、末尾に改行がない入力が提供されたときに、NEWLINE
トークンを暗黙的に発行するようになりました。 この動作は、Cトークナイザーが内部で行う動作と一致するようになりました。 (:issue: `33899` でAmmarAskarによって寄稿されました。)
Python3.6.10での注目すべき変更
重大なセキュリティ上の懸念により、asyncio.loop.create_datagram_endpoint()
の reuse_address パラメーターはサポートされなくなりました。 これは、UDPのソケットオプションSO_REUSEADDR
の動作が原因です。 詳細については、loop.create_datagram_endpoint()
のドキュメントを参照してください。 (:issue: `37228` で、Kyle Stanley、Antoine Pitrou、およびYury Selivanovによって寄稿されました。)
Python3.6.13での注目すべき変更
以前のPythonバージョンでは、 urllib.parse.parse_qs()および urllib.parse.parse_qsl()のクエリパラメーター区切り文字として;
と&
の両方を使用できました。 ]。 セキュリティ上の懸念と、新しいW3Cの推奨事項に準拠するために、これは、&
をデフォルトとして、単一の区切りキーのみを許可するように変更されました。 この変更は、影響を受ける関数を内部で使用するため、 cgi.parse()および cgi.parse_multipart()にも影響します。 詳細については、それぞれのドキュメントを参照してください。 (:issue: `42967` でAdamGoldschmidt、Senthil Kumaran、Ken Jinによって寄稿されました。)