Python3.5の新機能
- 編集者
- Elvis Pranskevichus < [email protected] >、ユーリー・セリバノフ< [email protected] >>
この記事では、3.4と比較したPython3.5の新機能について説明します。 Python3.5は2015年9月13日にリリースされました。 変更の完全なリストについては、 changelog を参照してください。
概要–リリースのハイライト
新しい構文機能:
新しいライブラリモジュール:
新しい組み込み機能:
bytes % args
、bytearray % args
: PEP 461 –バイトおよびバイト配列に%
フォーマットを追加します。- 新しい bytes.hex()、 bytearray.hex()および memoryview.hex()メソッド。 (:issue: `9951` でArnonYaariによって寄稿されました。)
- memoryview は、タプルインデックス(多次元を含む)をサポートするようになりました。 (:issue: `23632` のAntoinePitrouによる寄稿。)
- ジェネレーターには新しい
gi_yieldfrom
属性があり、yield from
式によって繰り返されるオブジェクトを返します。 (:issue: `24450` でBennoLeslieとYurySelivanovによって寄稿されました。) - 最大再帰深度に達すると、新しい RecursionError 例外が発生するようになりました。 (:issue: `19235` でGeorgBrandlによって寄稿されました。)
CPython実装の改善:
LC_TYPE
ロケールがPOSIXロケール(C
ロケール)の場合、 sys.stdin および sys.stdout はsurrogateescape
を使用するようになりました。 ]strict
エラーハンドラの代わりに、エラーハンドラ。 (:issue: `19977` でVictorStinnerによって寄稿されました。).pyo
ファイルは使用されなくなり、.pyc
名に明示的に最適化レベルを含むより柔軟なスキームに置き換えられました。 ( PEP 488の概要を参照してください。)- 組み込みモジュールと拡張モジュールは、Pythonモジュールのロード方法と同様に、マルチフェーズプロセスで初期化されるようになりました。 ( PEP 489の概要を参照してください。)
標準ライブラリの大幅な改善:
- collections.OrderedDict が C に実装され、4〜100倍高速になりました。
- ssl モジュールは、SSLプロトコル処理をネットワークIOから切り離すメモリBIO のサポートを取得しました。
- 新しい os.scandir()関数は、ディレクトリトラバーサルのより優れた大幅に高速な方法を提供します。
- functools.lru_cache()は、ほとんどがC に再実装されており、パフォーマンスが大幅に向上しています。
- 新しい subprocess.run()関数は、サブプロセスを実行するための合理化された方法を提供します。
- traceback モジュールは、パフォーマンスと開発者の利便性を向上させるために大幅に拡張されています。
セキュリティの改善:
- SSLv3は、標準ライブラリ全体で無効になりました。 ssl.SSLContext を手動でインスタンス化することで引き続き有効にできます。 (詳細については、:issue: `22638` を参照してください。この変更は、CPython 3.4および2.7にバックポートされました。)
- 潜在的なインジェクション攻撃から保護するために、HTTPCookieの解析がより厳密になりました。 (:issue: `22796` のAntoinePitrouによる寄稿。)
Windowsの改善:
- Windows用の新しいインストーラーが古いMSIに取って代わりました。 詳細については、 WindowsでのPythonの使用を参照してください。
- WindowsビルドはMicrosoftVisual C ++ 14.0を使用するようになり、拡張モジュールも同じものを使用する必要があります。
他の多くの小さな改善、CPythonの最適化、非推奨、潜在的な移植の問題など、ユーザー向けの変更の包括的なリストをお読みください。
新機能
PEP492-非同期および待機構文のコルーチン
PEP 492 は、待機可能オブジェクト、コルーチン関数、非同期反復を追加することにより、Pythonでの非同期プログラミングのサポートを大幅に改善します。 、および非同期コンテキストマネージャー。
コルーチン関数は、新しい async def 構文を使用して宣言されます。
>>> async def coro():
... return 'spam'
コルーチン関数内では、新しい await 式を使用して、結果が利用可能になるまでコルーチンの実行を一時停止できます。 __await__()
メソッドを定義して awaitable プロトコルを実装している限り、どのオブジェクトも awaitable にすることができます。
PEP 492は、 async for ステートメントも追加して、非同期反復可能オブジェクトを簡単に反復できるようにします。
新しい構文を使用して記述された基本的なHTTPクライアントの例:
import asyncio
async def http_get(domain):
reader, writer = await asyncio.open_connection(domain, 80)
writer.write(b'\r\n'.join([
b'GET / HTTP/1.1',
b'Host: %b' % domain.encode('latin-1'),
b'Connection: close',
b'', b''
]))
async for line in reader:
print('>>>', line)
writer.close()
loop = asyncio.get_event_loop()
try:
loop.run_until_complete(http_get('example.com'))
finally:
loop.close()
非同期反復と同様に、非同期コンテキストマネージャーの新しい構文があります。 次のスクリプト:
import asyncio
async def coro(name, lock):
print('coro {}: waiting for lock'.format(name))
async with lock:
print('coro {}: holding the lock'.format(name))
await asyncio.sleep(1)
print('coro {}: releasing the lock'.format(name))
loop = asyncio.get_event_loop()
lock = asyncio.Lock()
coros = asyncio.gather(coro(1, lock), coro(2, lock))
try:
loop.run_until_complete(coros)
finally:
loop.close()
出力します:
coro 2: waiting for lock
coro 2: holding the lock
coro 1: waiting for lock
coro 2: releasing the lock
coro 1: holding the lock
coro 1: releasing the lock
async for と async with はどちらも、 async def で宣言されたコルーチン関数内でのみ使用できることに注意してください。
コルーチン関数は、 asyncioループなどの互換性のあるイベントループ内で実行することを目的としています。
ノート
バージョン3.5.2で変更: CPython 3.5.2以降、__aiter__
は非同期イテレーターを直接返すことができます。 awaitable オブジェクトを返すと、 PendingDeprecationWarning になります。
詳細については、非同期イテレータのドキュメントセクションを参照してください。
PEP465-行列乗算専用のインフィックス演算子
PEP 465 は、行列乗算用の@
中置演算子を追加します。 現在、組み込みのPython型は新しい演算子を実装していませんが、通常、反映、およびインプレース行列に対して__matmul__()
、__rmatmul__()
、および__imatmul__()
を定義することで実装できます。乗算。 これらのメソッドのセマンティクスは、他の中置算術演算子を定義するメソッドのセマンティクスと似ています。
行列の乗算は、数学、科学、工学の多くの分野で特に一般的な演算であり、@
を追加すると、よりクリーンなコードを記述できます。
S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)
それ以外の:
S = dot((dot(H, beta) - r).T,
dot(inv(dot(dot(H, V), H.T)), dot(H, beta) - r))
NumPy 1.10は、新しい演算子をサポートしています。
>>> import numpy
>>> x = numpy.ones(3)
>>> x
array([ 1., 1., 1.])
>>> m = numpy.eye(3)
>>> m
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
>>> x @ m
array([ 1., 1., 1.])
PEP448-追加の開梱の一般化
PEP 448 は、*
反復可能解凍演算子と**
辞書解凍演算子の許可された使用法を拡張します。 関数呼び出しで任意の数のアンパックを使用できるようになりました。
>>> print(*[1], *[2], 3, *[4, 5])
1 2 3 4 5
>>> def fn(a, b, c, d):
... print(a, b, c, d)
...
>>> fn(**{'a': 1, 'c': 3}, **{'b': 2, 'd': 4})
1 2 3 4
同様に、タプル、リスト、セット、および辞書の表示では、複数の解凍が可能です(式リストおよび辞書表示を参照)。
>>> *range(4), 4
(0, 1, 2, 3, 4)
>>> [*range(4), 4]
[0, 1, 2, 3, 4]
>>> {*range(4), 4, *(5, 6, 7)}
{0, 1, 2, 3, 4, 5, 6, 7}
>>> {'x': 1, **{'y': 2}}
{'x': 1, 'y': 2}
も参照してください
- PEP 448 –追加の開梱の一般化
- JoshuaLandauによって書かれたPEP。 Neil Girdhar、Thomas Wouters、およびJoshuaLandauによって実装されました。
PEP461-バイトおよびbytearrayのパーセントフォーマットサポート
PEP 461 は、%
補間演算子のサポートをバイトおよびバイトアレイに追加します。
補間は通常文字列演算と考えられていますが、bytes
またはbytearrays
での補間が理にかなっている場合があり、この欠落している機能を補うために必要な作業により、コード。 この問題は、バイナリとASCII互換のテキストが混在することが多いワイヤフォーマットプロトコルを扱う場合に特に重要です。
例:
>>> b'Hello %b!' % b'World'
b'Hello World!'
>>> b'x=%i y=%f' % (1, 2.5)
b'x=1 y=2.500000'
Unicodeは%b
には使用できませんが、%a
(repr(obj).encode('ascii', 'backslashreplace')
と同等)では使用できます。
>>> b'Hello %b!' % 'World'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: %b requires bytes, or an object that implements __bytes__, not 'str'
>>> b'price: %a' % '10€'
b"price: '10\\u20ac'"
%s
および%r
変換タイプはサポートされていますが、Python2との互換性が必要なコードベースでのみ使用する必要があることに注意してください。
も参照してください
- PEP 461 –バイトおよびバイト配列に% f ormattingを追加
- イーサンファーマンによって書かれたPEP; NeilSchemenauerとEthanFurmanによって実装されました。
PEP484-タイプのヒント
関数アノテーション構文はバージョン3.0( PEP 3107 )以降Pythonの機能ですが、アノテーションのセマンティクスは未定義のままです。
経験によれば、関数アノテーションの使用の大部分は、関数パラメーターと戻り値に型ヒントを提供することでした。 標準ライブラリに型注釈の基本定義とツールが含まれていれば、Pythonユーザーにとって有益であることが明らかになりました。
PEP 484 は、暫定モジュールを導入して、これらの標準定義とツールを提供し、注釈が利用できない状況でのいくつかの規則を提供します。
たとえば、引数と戻り値の型がアノテーションで宣言されている単純な関数を次に示します。
def greeting(name: str) -> str:
return 'Hello ' + name
これらの注釈は、通常の__annotations__
属性を介して実行時に使用できますが、実行時に自動型チェックは行われません。 代わりに、別のオフラインタイプチェッカー(例: mypy )は、オンデマンドのソースコード分析に使用されます。
型システムは、ユニオン、ジェネリック型、および Any という名前の特別な型をサポートします。 すべてのタイプとの間で割り当て可能)。
PEP 471-os.scandir()関数–より優れたより高速なディレクトリイテレータ
PEP 471 は、新しいディレクトリ反復関数 os.scandir()を標準ライブラリに追加します。 さらに、 os.walk()はscandir
を使用して実装されるようになりました。これにより、POSIXシステムでは3〜5倍、Windowsシステムでは7〜20倍高速になります。 これは主に、ディレクトリツリーをウォークするために必要な os.stat()への呼び出しの数を大幅に減らすことによって達成されます。
さらに、scandir
は、ファイル名のリストを返すのではなく、イテレータを返します。これにより、非常に大きなディレクトリを反復処理するときのメモリ効率が向上します。
次の例は、 os.scandir()を使用して、'.'
で始まらない特定のパス内のすべてのファイル(ディレクトリを除く)を表示する簡単な使用法を示しています。 。 entry.is_file()呼び出しは、通常、追加のシステムコールを行いません。
for entry in os.scandir(path):
if not entry.name.startswith('.') and entry.is_file():
print(entry.name)
PEP 475:EINTRで失敗したシステムコールの再試行
errno.EINTR エラーコードは、I / Oを待機しているシステムコールがシグナルによって中断されるたびに返されます。 以前は、Pythonはそのような場合に InterruptedError を発生させていました。 つまり、Pythonアプリケーションを作成するとき、開発者には2つの選択肢がありました。
InterruptedError
は無視してください。InterruptedError
を処理し、すべてのコールサイトで中断されたシステムコールの再開を試みます。
最初のオプションでは、アプリケーションが断続的に失敗します。 2番目のオプションは、コードをほとんど読めないようにする大量の定型文を追加します。 比較:
print("Hello World")
と:
while True:
try:
print("Hello World")
break
except InterruptedError:
continue
PEP 475 は、EINTR
でシステムコールの自動再試行を実装します。 これにより、ほとんどの状況でユーザーコードのEINTR
または InterruptedError を処理する負担がなくなり、標準ライブラリを含むPythonプログラムがより堅牢になります。 システムコールは、シグナルハンドラが例外を発生させない場合にのみ再試行されることに注意してください。
以下は、シグナルによって中断されたときに再試行される関数のリストです。
- open()および io.open();
- faulthandler モジュールの機能。
- os 関数: fchdir()、 fchmod()、 fchown()、 fdatasync()、[ X102X] fstat()、 fstatvfs()、 fsync()、 ftrancate()、 mkfifo()、[ X200X] mknod()、 open()、 posix_fadvise()、 posix_fallocate()、 pread()、[ X317X] pwrite()、 read()、 readv()、 sendfile()、 wait3()、[ X420X] wait4()、 wait()、 waitid()、 waitpid()、 write()、[ X522X] writev();
- 特殊なケース: os.close()および os.dup2()は EINTR エラーを無視するようになりました。 システムコールは再試行されません(理論的根拠についてはPEPを参照してください)。
- select 関数: devpoll.poll()、 epoll.poll()、 kqueue.control()、 poll。 poll()、 select();
- socket クラスのメソッド: accept()、 connect()(非ブロッキングソケットを除く)、 recv()、 recvfrom()、 recvmsg()、 send()、 sendall()、 sendmsg()、 sendto();
- signal.sigtimedwait()および signal.sigwaitinfo();
- time.sleep()。
も参照してください
- PEP 475 –EINTRで失敗したシステムコールの再試行
- Charles-FrançoisNataliとVictorStinnerが、Antoine Pitrou(フランスのつながり)の助けを借りて作成したPEPと実装。
PEP 479:ジェネレーター内のStopIteration処理を変更
Python3.4以前のジェネレーターと StopIteration の相互作用は、驚くべき場合があり、あいまいなバグを隠すことができました。 以前は、ジェネレーター関数内で誤って発生したStopIteration
は、ジェネレーターを駆動するループ構造によって反復の終了として解釈されていました。
PEP 479 は、ジェネレーターの動作を変更します。ジェネレーター内でStopIteration
例外が発生すると、終了する前に RuntimeError に置き換えられます。ジェネレーターフレーム。 この変更の主な目的は、保護されていない next()呼び出しがStopIteration
を発生させ、ジェネレーターによって制御される反復をサイレントに終了させる状況でのデバッグを容易にすることです。 これは、yield from
コンストラクトと組み合わせると特に有害です。
これは後方互換性のない変更であるため、新しい動作を有効にするには、 __ future __ インポートが必要です。
>>> from __future__ import generator_stop
>>> def gen():
... next(iter([]))
... yield
...
>>> next(gen())
Traceback (most recent call last):
File "<stdin>", line 2, in gen
StopIteration
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: generator raised StopIteration
__future__
インポートがないと、ジェネレーター内で StopIteration 例外が発生するたびに、 PendingDeprecationWarning が発生します。
も参照してください
- PEP 479 –ジェネレーター内のStopIteration処理を変更
- クリスアンジェリコとグイドヴァンロッサムによって書かれたPEP。 Chris Angelico、Yury Selivanov、NickCoghlanによって実装されました。
PEP 485:近似等式をテストするための関数
PEP 485 は、 math.isclose()および cmath.isclose()関数を追加して、2つの値がほぼ等しいか「互いに近い」。 2つの値が近いと見なされるかどうかは、指定された絶対公差と相対公差に従って決定されます。 相対許容誤差は、isclose
引数間で許容される最大の差であり、絶対値が大きい方を基準にしています。
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, rel_tol=1e-5)
True
>>> math.isclose(a, b, rel_tol=1e-6)
False
絶対許容値を使用して2つの値を比較することもできます。これは、負でない値である必要があります。
>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False
PEP 486:PythonLauncherに仮想環境を認識させる
PEP 486 は、Windowsランチャー( PEP 397 を参照)にアクティブな仮想環境を認識させます。 デフォルトのインタープリターが使用され、VIRTUAL_ENV
環境変数が設定されている場合、仮想環境のインタープリターが使用されます。
PEP 488:PYOファイルの削除
PEP 488 は、.pyo
ファイルの概念を廃止します。 これは、.pyc
ファイルが最適化されていないバイトコードと最適化されたバイトコードの両方を表すことを意味します。 バイトコードファイルを絶えず再生成する必要をなくすために、.pyc
ファイルの名前には、バイトコードが最適化されたときにオプションのopt-
タグが含まれるようになりました。 これには、 -O または -OO のいずれかで実行しているときに、バイトコードファイル名が衝突しなくなるという副作用があります。 その結果、 -O と -OO から生成されたバイトコードファイルが同時に存在する可能性があります。 importlib.util.cache_from_source()には、この変更に役立つ更新されたAPIがあります。
PEP 489:マルチフェーズ拡張モジュールの初期化
PEP 489 は、拡張モジュールの初期化を更新して、Python3.4の PEP 451 によって導入された2ステップのモジュール読み込みメカニズムを利用します。
この変更により、新しいメカニズムの使用をオプトインする拡張モジュールのインポートセマンティクスが、ASCIIに制限されるのではなく、モジュール名として有効な識別子を使用する機能など、Pythonソースおよびバイトコードモジュールのインポートセマンティクスにはるかに近くなります。
も参照してください
- PEP 489 –多相拡張モジュールの初期化
- Petr Viktorin、Stefan Behnel、およびNickCoghlanによって作成されたPEP。 PetrViktorinによって実装されました。
その他の言語の変更
コアPython言語に加えられたいくつかの小さな変更は次のとおりです。
"namereplace"
エラーハンドラーを追加しました。"backslashreplace"
エラーハンドラーは、デコードと変換で機能するようになりました。 (:issue: `19676` および:issue:` 22286` でSerhiyStorchakaによって寄稿されました。)- -b オプションは、 bytes と int の比較に影響するようになりました。 (:issue: `23681` のSerhiyStorchakaによる寄稿。)
- 新しいカザフ語
kz1048
とタジク語koi8_t
コーデック。 (:issue: `22682` および:issue:` 22681` でSerhiyStorchakaによって寄稿されました。) - プロパティのdocstringが書き込み可能になりました。 これは、 collections.namedtuple() docstringに特に役立ちます。 (:issue: `24064` のBerkerPeksagによる寄稿。)
- 相対インポートを含む循環インポートがサポートされるようになりました。 (:issue: `17636` のBrettCannonとAntoinePitrouによる寄稿。)
新しいモジュール
zipapp
新しい zipapp モジュール( PEP 441 で指定)は、Python2.6で[ X198X]:issue: `1739468` ですが、当時もそれ以降もあまり公表されていませんでした。
新しいモジュールを使用すると、アプリケーションのバンドルは、__main__.py
ファイルを含むすべてのファイルをディレクトリmyapp
に入れて実行するのと同じくらい簡単です。
$ python -m zipapp myapp
$ python myapp.pyz
モジュールの実装は、Paul Mooreによって:issue: `23491` で提供されています。
改善されたモジュール
argparse
ArgumentParser クラスでは、 allow_abbrev をFalse
に設定することにより、長いオプションの省略使用を無効にできるようになりました。 (:issue: `14910` で、Jonathan Paugh、Steven Bethard、paul j3、Daniel Erikssonによって寄稿されました。)
asyncio
asyncio モジュールは provisional であるため、Python3.5で導入されたすべての変更もPython3.4.xにバックポートされています。
Python 3.4.0以降の asyncio モジュールの注目すべき変更点:
- 新しいデバッグAPI: loop.set_debug()および loop.get_debug()メソッド。 (Victor Stinnerによる寄稿。)
- proactorイベントループがSSLをサポートするようになりました。 (:issue: `22560` でAntoinePitrouとVictorStinnerによって寄稿されました。)
- イベントループが閉じているかどうかを確認するための新しい loop.is_closed()メソッド。 (:issue: `21326` でVictorStinnerによって寄稿されました。)
- コルーチンの新しいタスクを便利に作成およびスケジュールするための新しい loop.create_task()。
create_task
メソッドは、asyncio.wait()
、asyncio.gather()
など、コルーチンをタスクにラップするすべての非同期関数でも使用されます。 (Victor Stinnerによる寄稿。) - フロー制御の高-および低-水制限を照会するための新しい transport.get_write_buffer_limits()メソッド。 (Victor Stinnerによる寄稿。)
async()
関数は非推奨になり、 sure_future()が優先されます。 (Yury Selivanovによる寄稿。)- loop.set_task_factory()および loop.get_task_factory()メソッドを使用して、 loop.create_task()メソッドが使用するタスクファクトリをカスタマイズします。 (Yury Selivanovによる寄稿。)
- 新しい
Queue.join()
および Queue.task_done()キューメソッド。 (Victor Stinnerによる寄稿。) JoinableQueue
クラスが削除され、 asyncio.Queue クラスが優先されました。 (Victor Stinnerによる寄稿。)
3.5.1での更新:
- sure_future()関数と、それを使用する loop.run_until_complete()などのすべての関数は、すべての種類の待機可能オブジェクトを受け入れるようになりました。 (Yury Selivanovによる寄稿。)
- 他のスレッドからのイベントループにコルーチンを送信するための新しい run_coroutine_threadsafe()関数。 (Vincent Michelによる寄稿。)
- トランスポートが閉じているか閉じているかを確認するための新しい Transport.is_closeing()メソッド。 (Yury Selivanovによる寄稿。)
loop.create_server()
メソッドは、ホストのリストを受け入れることができるようになりました。 (Yann Sionneauによる寄稿。)
3.5.2での更新:
- Futureオブジェクトを作成するための新しい loop.create_future()メソッド。 これにより、 uvloop などの代替イベントループ実装が、より高速な asyncio.Future 実装を提供できるようになります。 (Yury Selivanovによる寄稿。)
- 現在の例外ハンドラーを取得するための新しい loop.get_exception_handler()メソッド。 (Yury Selivanovによる寄稿。)
- セパレータバイトシーケンスが表示されるまでストリームからデータを読み取る新しい
StreamReader.readuntil()
メソッド。 (Mark Korenbergによる寄稿。) loop.create_connection()
およびloop.create_server()
メソッドは、アドレスがすでに解決されている場合にシステムgetaddrinfo
関数を呼び出さないように最適化されています。 (Aによる寄稿。 ジェシー・ジリュウ・デイビス。)loop.sock_connect(sock, address)
では、呼び出し前にアドレスを解決する必要がなくなりました。 (Aによる寄稿。 ジェシー・ジリュウ・デイビス。)
bz2
BZ2Decompressor.decompress メソッドは、オプションの max_length 引数を受け入れて、解凍されたデータの最大サイズを制限するようになりました。 (:issue: `15955` のNikolausRathによる寄稿。)
コード
InteractiveInterpreter.showtraceback()メソッドは、インタラクティブインタープリターと同じように、完全にチェーンされたトレースバックを出力するようになりました。 (:issue: `17442` のClaudiuPopaによる寄稿。)
コレクション
OrderedDict クラスがCで実装されるようになり、4〜100倍高速になりました。 (:issue: `16991` のEricSnowによる寄稿。)
OrderedDict.items()
、OrderedDict.keys()
、OrderedDict.values()
ビューは、 reverse()反復をサポートするようになりました。 (:issue: `19505` のSerhiyStorchakaによる寄稿。)
deque クラスは、 index()、 insert()、および copy()を定義し、+
をサポートするようになりました。 ]および*
演算子。 これにより、両端キューが MutableSequence として認識され、リストの代替可能性が向上します。 (:issue: `23704` でRaymondHettingerによって寄稿されました。)
namedtuple()によって生成されたDocstringを更新できるようになりました。
Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coodinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'
(:issue: `24064` のBerkerPeksagによる寄稿。)
UserString クラスは、__getnewargs__()
、__rmod__()
、 casefold()、 format_map()、 isprintableを実装するようになりました。 ()、および maketrans()メソッドは、 str の対応するメソッドと一致します。 (:issue: `22189` でJoeJevnikによって寄稿されました。)
collections.abc
Sequence.index()
メソッドは、 start および stop 引数を受け入れて、 tuple 、 list などの対応するメソッドと一致するようになりました。 (:issue: `23086` でDevinJeanpierreによって寄稿されました。)
新しい Generator 抽象基本クラス。 (:issue: `24018` でStefanBehnelによって寄稿されました。)
新しい Awaitable 、 Coroutine 、 AsyncIterator 、および AsyncIterable 抽象基本クラス。 (:issue: `24184` でYurySelivanovによって寄稿されました。)
以前のPythonバージョンでは、新しいABCのバックポートが外部 PyPIパッケージで利用できます。
compileall
新しい compileall オプション-j N
を使用すると、 N ワーカーを同時に実行して並列バイトコードコンパイルを実行できます。 compile_dir()関数には、対応するworkers
パラメーターがあります。 (:issue: `16104` のClaudiuPopaによる寄稿。)
もう1つの新しいオプション-r
を使用すると、サブディレクトリの最大再帰レベルを制御できます。 (:issue: `19628` でClaudiuPopaによって寄稿されました。)
-q
コマンドラインオプションを複数回指定できるようになりました。この場合、エラーを含むすべての出力が抑制されます。 compile_dir()、 compile_file()、および compile_path()の対応するquiet
パラメーターは、のレベルを示す整数値を受け入れることができるようになりました。出力抑制。 (:issue: `21338` でThomasKluyverによって寄稿されました。)
コンカレント.futures
Executor.map()メソッドが chunksize 引数を受け入れるようになり、 ProcessPoolExecutor()が使用されている場合に、タスクのバッチ処理によってパフォーマンスが向上します。 (:issue: `11271` でDanO'Reillyによって寄稿されました。)
ThreadPoolExecutor コンストラクターのワーカー数はオプションになりました。 デフォルト値はCPU数の5倍です。 (:issue: `21527` のClaudiuPopaによる寄稿。)
configparser
configparser は、 ConfigParser コンストラクターでコンバーターのディクショナリを指定するか、ConfigParser
サブクラスでメソッドとして定義することにより、値の変換をカスタマイズする方法を提供するようになりました。 パーサーインスタンスで定義されたコンバーターは、そのセクションプロキシによって継承されます。
例:
>>> import configparser
>>> conv = {}
>>> conv['list'] = lambda v: [e.strip() for e in v.split() if e.strip()]
>>> cfg = configparser.ConfigParser(converters=conv)
>>> cfg.read_string("""
... [s]
... list = a b c d e f g
... """)
>>> cfg.get('s', 'list')
'a b c d e f g'
>>> cfg.getlist('s', 'list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
>>> section = cfg['s']
>>> section.getlist('list')
['a', 'b', 'c', 'd', 'e', 'f', 'g']
(:issue: `18159` のŁukaszLangaによる寄稿。)
contextlib
新しい redirect_stderr() context manager ( redirect_stdout()と同様)により、ユーティリティスクリプトが出力をに書き込む柔軟性のないAPIを簡単に処理できるようになります。 sys.stderr であり、リダイレクトするオプションを提供していません。
>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
... logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'
(:issue: `22389` のBerkerPeksagによる寄稿。)
csv
writerow()メソッドは、シーケンスだけでなく、任意の反復可能オブジェクトをサポートするようになりました。 (:issue: `23171` のSerhiyStorchakaによる寄稿。)
のろい
新しい update_lines_cols()関数は、 LINES
および COLS
環境変数を更新します。 これは、手動の画面サイズ変更を検出するのに役立ちます。 (:issue: `4254` でArnonYaariによって寄稿されました。)
difflib
HtmlDiff.make_file()によって生成されたHTMLドキュメントの文字セットは、新しい charset キーワードのみの引数を使用してカスタマイズできるようになりました。 HTMLドキュメントのデフォルトの文字セットが"ISO-8859-1"
から"utf-8"
に変更されました。 (:issue: `2052` のBerkerPeksagによる寄稿。)
diff_bytes()関数は、バイト文字列のリストを比較できるようになりました。 これにより、Python2からのリグレッションが修正されます。 (TerryJによる寄稿。 のReedyとGregWard:issue: `17445` 。)
distutils
build
コマンドとbuild_ext
コマンドの両方で、-j
オプションを受け入れて、拡張モジュールの並列構築を有効にするようになりました。 (:issue: `5309` のAntoinePitrouによる寄稿。)
distutils モジュールはxz
圧縮をサポートするようになり、xztar
を引数としてbdist --format
に渡すことで有効にできます。 (:issue: `16314` のSerhiyStorchakaによる寄稿。)
doctest
DocTestSuite()関数は、[X84X] ValueError を発生させる代わりに、 module にdocstringが含まれていない場合、空の unittest.TestSuite を返します。 (:issue: `15916` でGlennJonesによって寄稿されました。)
Eメール
新しいポリシーオプション Policy.mangle_from_ は、電子メール本文の"From "
で始まる行の前にジェネレーターによって">"
文字を付けるかどうかを制御します。 デフォルトは、 compat32 の場合はTrue
、その他のすべてのポリシーの場合はFalse
です。 (:issue: `20098` でMilanOberkirchによって寄稿されました。)
新しい Message.get_content_disposition()メソッドを使用すると、 Content-Disposition ヘッダーの正規値に簡単にアクセスできます。 (:issue: `21083` のAbhilashRajによる寄稿。)
新しいポリシーオプション EmailPolicy.utf8 をTrue
に設定して、エンコードされた単語を使用する代わりにUTF-8文字セットを使用して電子メールヘッダーをエンコードできます。 これにより、Messages
を RFC 6532 に従ってフォーマットし、 RFC 6531 をサポートするSMTPサーバーで使用できます。 SMTPUTF8
拡張。 (Rによる寄稿。 :issue: `24211` のDavidMurray。)
mime.text.MIMEText コンストラクターは、 charset.Charset インスタンスを受け入れるようになりました。 (:issue: `16324` でClaudeParozとBerkerPeksagによって寄稿されました。)
列挙型
Enum 呼び出し可能オブジェクトには、名前のみが指定されている場合に列挙値の初期数を指定するための新しいパラメーター start があります。
>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>
(:issue: `21706` でEthanFurmanによって寄稿されました。)
フォールトハンドラー
enable()、 register()、 dump_traceback()、および dump_traceback_later()関数は、ファイルに加えてファイル記述子を受け入れるようになりました-オブジェクトのように。 (:issue: `23566` でWeiWuによって寄稿されました。)
functools
lru_cache()機構のほとんどがCで実装されるようになり、大幅に高速化されました。 (:issue: `14373` のMattJoiner、Alexey Kachayev、およびSerhiy Storchakaによる寄稿。)
グロブ
iglob()および glob()関数は、"**"
パターンを使用して、サブディレクトリでの再帰検索をサポートするようになりました。 (:issue: `13968` でSerhiyStorchakaによって寄稿されました。)
gzip
GzipFile コンストラクターの mode 引数は、排他的作成を要求するために"x"
を受け入れるようになりました。 (:issue: `19222` でTimHeaneyによって寄稿されました。)
heapq
merge()の要素比較は、新しいオプションの key キーワード引数と新しいオプションの reverse [でキー関数を渡すことでカスタマイズできるようになりました。 X175X]キーワード引数を使用して、要素の比較を逆にすることができます。
>>> import heapq
>>> a = ['9', '777', '55555']
>>> b = ['88', '6666']
>>> list(heapq.merge(a, b, key=len))
['9', '88', '777', '6666', '55555']
>>> list(heapq.merge(reversed(a), reversed(b), key=len, reverse=True))
['55555', '6666', '777', '88', '9']
(:issue: `13742` でRaymondHettingerによって寄稿されました。)
http
英語で書かれたHTTPステータスコード、理由フレーズ、および長い説明のセットを定義する新しい HTTPStatus 列挙型。 (:issue: `21793` のDemianBrechtによる寄稿。)
http.client
HTTPConnection.getresponse()は、リモートサーバー接続が予期せず閉じられたときに RemoteDisconnected 例外を発生させるようになりました。 さらに、 ConnectionError (RemoteDisconnected
はサブクラス)が発生した場合、クライアントソケットは自動的に閉じられ、次の要求で再接続します。
import http.client
conn = http.client.HTTPConnection('www.python.org')
for retries in range(3):
try:
conn.request('GET', '/')
resp = conn.getresponse()
except http.client.RemoteDisconnected:
pass
(:issue: `3566` でMartinPanterによって寄稿されました。)
idlelibとIDLE
idlelibはIDLEシェルとエディターを実装し、他のプログラムによるインポートを目的としていないため、リリースごとに改善されます。 3.4.0以降の変更の累積リスト、および将来の3.5.xリリースで行われた変更については、Lib/idlelib/NEWS.txt
を参照してください。 このファイルは、IDLE ダイアログからも入手できます。
imaplib
IMAP4 クラスは、コンテキストマネージャープロトコルをサポートするようになりました。 with ステートメントで使用すると、IMAP4 LOGOUT
コマンドがブロックの最後で自動的に呼び出されます。 (:issue: `4972` でTarekZiadéとSerhiyStorchakaによって寄稿されました。)
imaplib モジュールは、 RFC 5161 (ENABLE Extension)および RFC 6855 (UTF-8サポート)をサポートするようになりました。 IMAP4.enable()メソッドを介して。 新しい IMAP4.utf8_enabled 属性は、 RFC 6855 サポートが有効になっているかどうかを追跡します。 (Milan Oberkirch、Rによる寄稿。 :issue: `21800` のDavidMurrayとMaciejSzulik。)
imaplib モジュールは、RFCで推奨されているように、UTF-8を使用して非ASCII文字列のユーザー名とパスワードを自動的にエンコードするようになりました。 (:issue: `21800` でMilanOberkirchによって寄稿されました。)
imghdr
what()関数は、 OpenEXR 形式(MartinVignaliとClaudiuPopaが:issue: `20295` で提供)とを認識するようになりました。 WebP 形式(:issue: `20197` でFabriceAnecheとClaudiuPopaによって寄稿されました。)
importlib
util.LazyLoader クラスを使用すると、起動時間が重要なアプリケーションでモジュールを遅延ロードできます。 (:issue: `17621` のBrettCannonによる寄稿。)
abc.InspectLoader.source_to_code()メソッドが静的メソッドになりました。 これにより、exec(code, module.__dict__)
を実行して、文字列からコンパイルされたコードでモジュールオブジェクトを簡単に初期化できます。 (:issue: `21156` のBrettCannonによる寄稿。)
新しい util.module_from_spec()関数は、新しいモジュールを作成するための推奨される方法になりました。 types.ModuleType インスタンスを直接作成するのとは対照的に、この新しい関数は、渡されたスペックオブジェクトに基づいてさまざまなインポート制御属性を設定します。 (:issue: `20383` のBrettCannonによる寄稿。)
検査する
Signature クラスと Parameter クラスの両方が、選択可能でハッシュ可能になりました。 (:issue: `20726` および:issue:` 20334` でYurySelivanovによって寄稿されました。)
新しい BoundArguments.apply_defaults()メソッドは、欠落している引数のデフォルト値を設定する方法を提供します。
>>> def foo(a, b='ham', *args): pass
>>> ba = inspect.signature(foo).bind('spam')
>>> ba.apply_defaults()
>>> ba.arguments
OrderedDict([('a', 'spam'), ('b', 'ham'), ('args', ())])
(:issue: `24190` でYurySelivanovによって寄稿されました。)
新しいクラスメソッド Signature.from_callable()により、 Signature のサブクラス化が容易になります。 (:issue: `17373` でYurySelivanovとEricSnowによって寄稿されました。)
signature()関数は、 follow_wrapped オプションのキーワード引数を受け入れるようになりました。これをFalse
に設定すると、__wrapped__
リンクの自動フォローが無効になります。 (:issue: `20691` でYurySelivanovによって寄稿されました。)
コルーチン関数およびコルーチンオブジェクトを検査するための一連の新しい関数が追加されました: iscoroutine()、 iscoroutinefunction()、[X166X ] isawaitable()、 getcoroutinelocals()、および getcoroutinestate()。 (:issue: `24017` および:issue:` 24400` でYurySelivanovによって寄稿されました。)
stack()、 trace()、 getouterframes()、および getinnerframes()関数は、名前付きタプルのリストを返すようになりました。 (:issue: `16808` でDanielShahafによって寄稿されました。)
io
新しい BufferedIOBase.readinto1()メソッド。基になるrawストリームの RawIOBase.read()または RawIOBase.readinto()メソッドへの呼び出しを最大1回使用します。 。 (:issue: `20578` のNikolausRathによる寄稿。)
IPアドレス
IPv4Network クラスと IPv6Network クラスの両方が、(address, netmask)
タプル引数を受け入れるようになり、既存のアドレスからネットワークオブジェクトを簡単に構築できるようになりました。
>>> import ipaddress
>>> ipaddress.IPv4Network(('127.0.0.0', 8))
IPv4Network('127.0.0.0/8')
>>> ipaddress.IPv4Network(('127.0.0.0', '255.0.0.0'))
IPv4Network('127.0.0.0/8')
(:issue: `16531` でPeterMoodyとAntoinePitrouによって寄稿されました。)
IPv4Network および IPv6Network クラスの新しいreverse_pointer
属性は、逆引きDNSPTRレコードの名前を返します。
>>> import ipaddress
>>> addr = ipaddress.IPv4Address('127.0.0.1')
>>> addr.reverse_pointer
'1.0.0.127.in-addr.arpa'
>>> addr6 = ipaddress.IPv6Address('::1')
>>> addr6.reverse_pointer
'1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa'
(:issue: `20480` でLeonWeberによって寄稿されました。)
json
json.tool コマンドラインインターフェイスは、入力で渡されるJSONオブジェクトのキーの順序を保持するようになりました。 新しい--sort-keys
オプションを使用して、キーをアルファベット順に並べ替えることができます。 (:issue: `21650` のBerkerPeksagによる寄稿。)
JSONデコーダーは、 ValueError ではなく JSONDecodeError を発生させて、エラーに関するより適切なコンテキスト情報を提供するようになりました。 (:issue: `19361` でSerhiyStorchakaによって寄稿されました。)
linecache
新しい lazycache()関数を使用して、非ファイルベースのモジュールに関する情報をキャプチャし、後で getline()を介してその行を取得できるようにすることができます。 これにより、モジュールグローバルを無期限に持ち歩く必要がなく、ラインが実際に必要になるまでI / Oを実行する必要がなくなります。 (:issue: `17911` でRobertCollinsによって寄稿されました。)
ロケール
新しい delocalize()関数を使用して、LC_NUMERIC
設定を考慮に入れて、文字列を正規化された数値文字列に変換できます。
>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, 'de_DE.UTF-8')
'de_DE.UTF-8'
>>> locale.delocalize('1.234,56')
'1234.56'
>>> locale.setlocale(locale.LC_NUMERIC, 'en_US.UTF-8')
'en_US.UTF-8'
>>> locale.delocalize('1,234.56')
'1234.56'
(:issue: `13918` のCédricKrierによる寄稿。)
ロギング
すべてのロギングメソッド(ロガー log()、例外()、クリティカル()、デバッグ()など)、ブール値と例外タプルに加えて、 exc_info 引数として例外インスタンスを受け入れるようになりました。
>>> import logging
>>> try:
... 1/0
... except ZeroDivisionError as ex:
... logging.error('exception', exc_info=ex)
ERROR:root:exception
(:issue: `20537` でYurySelivanovによって寄稿されました。)
handlers.HTTPHandler クラスは、オプションの ssl.SSLContext インスタンスを受け入れて、HTTP接続で使用されるSSL設定を構成するようになりました。 (:issue: `22788` でAlexGaynorによって寄稿されました。)
handlers.QueueListener クラスは respect_handler_level キーワード引数を取り、True
に設定すると、ハンドラーレベルを考慮してメッセージをハンドラーに渡します。 (Vinay Sajipによる寄稿)
lzma
LZMADecompressor.decompress()メソッドは、オプションの max_length 引数を受け入れて、解凍されたデータの最大サイズを制限するようになりました。 (:issue: `15955` でMartinPanterによって寄稿されました。)
算数
math モジュールに、 inf と nan の2つの新しい定数が追加されました。 (:issue: `23185` でMarkDickinsonによって寄稿されました。)
新しい関数 isclose()は、近似的な同等性をテストする方法を提供します。 (:issue: `24270` でChrisBarkerとTalEinatによって寄稿されました。)
新しい gcd()関数が追加されました。 fractions.gcd()関数は非推奨になりました。 (:issue: `22486` でMarkDickinsonとSerhiyStorchakaによって寄稿されました。)
マルチプロセッシング
sharedctypes.synchronized()オブジェクトは、コンテキストマネージャープロトコルをサポートするようになりました。 (:issue: `21565` でCharles-FrançoisNataliによって寄稿されました。)
オペレーター
attrgetter()、 itemgetter()、および methodcaller()オブジェクトがpickle化をサポートするようになりました。 (:issue: `22955` でJoshRosenbergとSerhiyStorchakaによって寄稿されました。)
新しい matmul()および imatmul()関数は、行列の乗算を実行します。 (:issue: `21176` でBenjaminPetersonによって寄稿されました。)
os
DirEntry オブジェクトのイテレータを返す新しい scandir()関数が追加されました。 可能であれば、 scandir()はディレクトリのスキャン中にファイル属性を抽出し、ファイルタイプまたは属性を決定するために後続のシステムコールを実行する必要をなくします。これにより、パフォーマンスが大幅に向上する可能性があります。 (:issue: `22524` でVictorStinnerの助けを借りてBenHoytによって寄稿されました。)
Windowsでは、新しい stat_result.st_file_attributes 属性が使用可能になりました。 これは、GetFileInformationByHandle()
によって返されるBY_HANDLE_FILE_INFORMATION
構造体のdwFileAttributes
メンバーに対応します。 (:issue: `21719` でBenHoytによって寄稿されました。)
urandom()関数は、Linux3.17以降ではgetrandom()
システムコールを使用し、OpenBSD5.6以降ではgetentropy()
を使用するようになり、/dev/urandom
を使用する必要がなくなりました。 ]そして潜在的なファイル記述子の枯渇による失敗を回避します。 (:issue: `22181` でVictorStinnerによって寄稿されました。)
新しい get_blocking()および set_blocking()関数を使用すると、ファイル記述子のブロックモード( O_NONBLOCK )を取得および設定できます(のVictor Stinnerによる寄稿)。発行: `22054` 。)
truncate()および ftrancate()関数がWindowsでサポートされるようになりました。 (:issue: `23668` でSteveDowerによって寄稿されました。)
渡された各パス名の最長の共通サブパスを返す新しい os.path.commonpath()関数があります。 os.path.commonprefix()関数とは異なり、常に有効なパスを返します。
>>> os.path.commonprefix(['/usr/lib', '/usr/local/lib'])
'/usr/l'
>>> os.path.commonpath(['/usr/lib', '/usr/local/lib'])
'/usr'
(:issue: `10395` でRafikDraouiとSerhiyStorchakaによって寄稿されました。)
pathlib
新しい Path.samefile()メソッドを使用して、パスが別の Path オブジェクトまたは文字列のいずれかである別のパスと同じファイルを指しているかどうかを確認できます。
>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True
(:issue: `19775` でVajraskyKokとAntoinePitrouによって寄稿されました。)
Path.mkdir()メソッドは、mkdir -p
および os.makedirs()機能に一致する新しいオプションの exit_ok 引数を受け入れるようになりました。 (:issue: `21539` のBerkerPeksagによる寄稿。)
~
および~user
プレフィックスを展開するための新しい Path.expanduser()メソッドがあります。 (:issue: `19776` でSerhiyStorchakaとClaudiuPopaによって寄稿されました。)
新しい Path.home()クラスメソッドを使用して、ユーザーのホームディレクトリを表す Path インスタンスを取得できます。 (:issue: `19777` でVictorSalgadoとMayankTripathiによって寄稿されました。)
新しい Path.write_text()、 Path.read_text()、 Path.write_bytes()、 Path.read_bytes()メソッドファイルの読み取り/書き込み操作を簡素化します。
次のコードスニペットは、既存のファイル~/spam42
を作成または書き換えます。
>>> import pathlib
>>> p = pathlib.Path('~/spam42')
>>> p.expanduser().write_text('ham')
3
(:issue: `20218` でChristopherWelbornによって寄稿されました。)
きゅうりのピクルス
バインドされていないメソッドやネストされたクラスなどのネストされたオブジェクトは、プロトコルバージョン4より古い pickleプロトコルを使用してpickle化できるようになりました。 プロトコルバージョン4はすでにこれらのケースをサポートしています。 (:issue: `23611` のSerhiyStorchakaによる寄稿。)
poplib
新しい POP3.utf8()コマンドは、POPサーバーがサポートしている場合、 RFC 6856 (国際化された電子メール)のサポートを有効にします。 (:issue: `21804` でMilanOberKirchによって寄稿されました。)
NS
固定長のグループへの参照と条件付き参照が、後読みアサーションで許可されるようになりました。
>>> import re
>>> pat = re.compile(r'(a|b).(?<=\1)c')
>>> pat.match('aac')
<_sre.SRE_Match object; span=(0, 3), match='aac'>
>>> pat.match('bbc')
<_sre.SRE_Match object; span=(0, 3), match='bbc'>
(:issue: `9179` でSerhiyStorchakaによって寄稿されました。)
正規表現でのキャプチャグループの数は100に制限されなくなりました。 (:issue: `22437` のSerhiyStorchakaによる寄稿。)
sub()および subn()関数は、例外を発生させる代わりに、一致しないグループを空の文字列に置き換えるようになりました。 (:issue: `1519638` でSerhiyStorchakaによって寄稿されました。)
re.error 例外には、 msg 、 pattern 、 pos 、 lineno 、およびという新しい属性があります。 ] colno 、エラーに関するより良いコンテキスト情報を提供します:
>>> re.compile("""
... (?x)
... .++
... """)
Traceback (most recent call last):
...
sre_constants.error: multiple repeat at position 16 (line 3, column 7)
(:issue: `22578` でSerhiyStorchakaによって寄稿されました。)
読み込まれた行
新しい append_history_file()関数を使用して、指定された数の履歴内の末尾要素を指定されたファイルに追加できます。 (:issue: `22940` でBrunoCauetによって寄稿されました。)
セレクター
新しい DevpollSelector は、Solarisでの効率的な/dev/poll
ポーリングをサポートします。 (:issue: `18931` のGiampaoloRodola 'による寄稿。)
シャティル
move()関数は copy_function 引数を受け入れるようになり、たとえば、デフォルトの copy2の代わりに copy()関数を使用できるようになりました。 ()移動時にファイルメタデータを無視する必要がある場合。 (:issue: `19840` でClaudiuPopaによって寄稿されました。)
make_archive()関数は、 xztar 形式をサポートするようになりました。 (:issue: `5411` のSerhiyStorchakaによる寄稿。)
信号
Windowsでは、 set_wakeup_fd()関数がソケットハンドルもサポートするようになりました。 (:issue: `22018` でVictorStinnerによって寄稿されました。)
signal モジュールのさまざまなSIG*
定数は、列挙型に変換されています。 これにより、整数の「マジックナンバー」の代わりに、意味のある名前をデバッグ中に出力できます。 (:issue: `21076` のGiampaoloRodola 'による寄稿。)
smtpd
SMTPServer クラスと SMTPChannel クラスの両方が、 decode_data キーワード引数を受け入れて、SMTPトランザクションのDATA
部分が[ X196X] コーデック、または代わりに SMTPServer.process_message()メソッドにバイト文字列として提供されます。 下位互換性の理由から、デフォルトはTrue
ですが、Python3.6ではFalse
に変更されます。 decode_data がFalse
に設定されている場合、process_message
メソッドはキーワード引数を受け入れるように準備する必要があります。 (:issue: `19662` でMaciejSzulikによって寄稿されました。)
SMTPServer クラスは、 decode_data が設定されている場合、8BITMIME
拡張機能( RFC 6152 )をアドバタイズするようになりました [ X139X]。 クライアントがMAIL
コマンドでBODY=8BITMIME
を指定すると、 mail_options キーワードを介して SMTPServer.process_message()に渡されます。 (MilanOberkirchとRによる寄稿。 のDavidMurray:issue: `21795` 。)
SMTPServer クラスは、SMTPUTF8
拡張機能( RFC 6531 :国際化された電子メール)もサポートするようになりました。 クライアントがMAIL
コマンドでSMTPUTF8 BODY=8BITMIME
を指定した場合、それらは mail_options キーワードを介して SMTPServer.process_message()に渡されます。 SMTPUTF8
データを正しく処理するのは、process_message
メソッドの責任です。 (:issue: `21725` でMilanOberkirchによって寄稿されました。)
SMTPServer コンストラクターでIPv6アドレスを直接または名前解決を介して提供し、正常に接続できるようになりました。 (:issue: `14758` でMilanOberkirchによって寄稿されました。)
smtplib
新しい SMTP.auth()メソッドは、カスタム認証メカニズムを実装するための便利な方法を提供します。 (:issue: `15014` でMilanOberkirchによって寄稿されました。)
SMTP.set_debuglevel()メソッドは、追加のデバッグレベル(2)を受け入れるようになりました。これにより、デバッグメッセージでタイムスタンプが有効になります。 (:issue: `16914` でGavinChappellとMaciejSzulikによって寄稿されました。)
SMTP.sendmail()メソッドと SMTP.send_message()メソッドの両方が RFC 6531 (SMTPUTF8)をサポートするようになりました。 (MilanOberkirchとRによる寄稿。 のDavidMurray:issue: `22027` 。)
ソケット
タイムアウトのある関数は、システムクロックではなく、単調なクロックを使用するようになりました。 (:issue: `22043` でVictorStinnerによって寄稿されました。)
新しい socket.sendfile()メソッドを使用すると、UNIXで高性能の os.sendfile()関数を使用して、ソケットを介してファイルを送信できます。アップロードは2〜3になります。プレーンな socket.send()を使用する場合よりも数倍高速です。 (:issue: `17552` のGiampaoloRodola 'による寄稿。)
socket.sendall()メソッドは、バイトが送受信されるたびにソケットタイムアウトをリセットしなくなりました。 ソケットタイムアウトは、すべてのデータを送信するための最大合計期間になりました。 (:issue: `23853` でVictorStinnerによって寄稿されました。)
socket.listen()メソッドの backlog 引数はオプションになりました。 デフォルトでは、 SOMAXCONN または128
のいずれか小さい方に設定されています。 (:issue: `21455` でCharles-FrançoisNataliによって寄稿されました。)
ssl
メモリBIOサポート
(:issue: `21965` でGeertJansenによって寄稿されました。)
新しい SSLObject クラスが追加され、 SSLSocket のネットワークI / O機能が不要であるか、最適ではない場合にSSLプロトコルサポートを提供します。 SSLObject
はSSLプロトコルインスタンスを表しますが、ネットワークI / Oメソッドを実装せず、代わりにメモリバッファインターフェイスを提供します。 新しい MemoryBIO クラスを使用して、PythonとSSLプロトコルインスタンス間でデータを渡すことができます。
メモリBIOSSLサポートは、主に、 SSLSocket の準備モデル(「選択/ポーリング」)が非効率的な非同期I / Oを実装するフレームワークで使用することを目的としています。
新しい SSLContext.wrap_bio()メソッドを使用して、新しいSSLObject
インスタンスを作成できます。
アプリケーション層プロトコルネゴシエーションのサポート
(:issue: `20188` でBenjaminPetersonによって寄稿されました。)
OpenSSLサポートが存在する場合、 ssl モジュールは、 RFC 7301 で説明されているように、 Application-Layer Protocol Negotiation TLS拡張を実装するようになりました。
新しい SSLContext.set_alpn_protocols()を使用して、TLSハンドシェイク中にソケットがアドバタイズするプロトコルを指定できます。
新しい SSLSocket.selected_alpn_protocol()は、TLSハンドシェイク中に選択されたプロトコルを返します。 HAS_ALPN フラグは、ALPNサポートが存在するかどうかを示します。
その他の変更
使用中の実際のプロトコルバージョンを照会するための新しい SSLSocket.version()メソッドがあります。 (:issue: `20421` のAntoinePitrouによる寄稿。)
SSLSocket クラスがSSLSocket.sendfile()
メソッドを実装するようになりました。 (:issue: `17552` のGiampaoloRodola 'による寄稿。)
SSLSocket.send()
メソッドは、操作がブロックされる場合、非ブロックソケットで ssl.SSLWantReadError または ssl.SSLWantWriteError 例外を発生させるようになりました。 以前は、0
を返していました。 (:issue: `20951` のNikolausRathによる寄稿。)
cert_time_to_seconds()関数は、 RFC 5280 に従って、入力時刻を現地時間ではなくUTCとして解釈するようになりました。 また、戻り値は常に int です。 (:issue: `19940` のAkiraLiによる寄稿。)
新しいSSLObject.shared_ciphers()
および SSLSocket.shared_ciphers()メソッドは、ハンドシェイク中にクライアントによって送信された暗号のリストを返します。 (:issue: `23186` でBenjaminPetersonによって寄稿されました。)
の SSLSocket.do_handshake()、 SSLSocket.read()、SSLSocket.shutdown()
、および SSLSocket.write()メソッド。 SSLSocket クラスは、バイトが送受信されるたびにソケットタイムアウトをリセットしなくなりました。 ソケットタイムアウトは、メソッドの最大合計期間になりました。 (:issue: `23853` でVictorStinnerによって寄稿されました。)
match_hostname()関数は、IPアドレスの照合をサポートするようになりました。 (:issue: `23239` のAntoinePitrouによる寄稿。)
sqlite3
Row クラスは、シーケンスプロトコル、特に reverse()反復とスライスインデックスを完全にサポートするようになりました。 (:issue: `10203` のClaudiuPopaによる寄稿、:issue:` 13583` のLucasSinclair、Jessica McKellar、Serhiy Storchakaによる寄稿)
サブプロセス
新しい run()関数が追加されました。 指定されたコマンドを実行し、完了したプロセスを説明する CompletedProcess オブジェクトを返します。 新しいAPIはより一貫性があり、以前のPythonバージョンとの互換性を維持する必要のないPythonコードでサブプロセスを呼び出すための推奨されるアプローチです。 (:issue: `23342` でThomasKluyverによって寄稿されました。)
例:
>>> subprocess.run(["ls", "-l"]) # doesn't capture output
CompletedProcess(args=['ls', '-l'], returncode=0)
>>> subprocess.run("exit 1", shell=True, check=True)
Traceback (most recent call last):
...
subprocess.CalledProcessError: Command 'exit 1' returned non-zero exit status 1
>>> subprocess.run(["ls", "-l", "/dev/null"], stdout=subprocess.PIPE)
CompletedProcess(args=['ls', '-l', '/dev/null'], returncode=0,
stdout=b'crw-rw-rw- 1 root root 1, 3 Jan 23 16:23 /dev/null\n')
sys
新しいset_coroutine_wrapper()
関数を使用すると、コルーチンオブジェクトが async def 関数によって作成されるたびに呼び出されるグローバルフックを設定できます。 対応するget_coroutine_wrapper()
を使用して、現在設定されているラッパーを取得できます。 どちらの機能も暫定であり、デバッグのみを目的としています。 (:issue: `24017` でYurySelivanovによって寄稿されました。)
新しい is_finalizing()関数を使用して、Pythonインタープリターがシャットダウンしているかどうかを確認できます。 (:issue: `22696` のAntoinePitrouによる寄稿。)
sysconfig
Windowsのユーザースクリプトディレクトリの名前に、Pythonバージョンの最初の2つのコンポーネントが含まれるようになりました。 (:issue: `23437` でPaulMooreによって寄稿されました。)
tarfile
open()関数の mode 引数は、"x"
を受け入れて排他的作成を要求するようになりました。 (:issue: `21717` のBerkerPeksagによる寄稿。)
TarFile.extractall()および TarFile.extract()メソッドは、キーワード引数 numeric_owner を受け取るようになりました。 True
に設定すると、抽出されたファイルとディレクトリは、tarfileの数値uid
とgid
によって所有されます。 False
(デフォルト、および3.5より前のバージョンでの動作)に設定されている場合、それらはtarfile内の指定されたユーザーとグループによって所有されます。 (:issue: `23193` でMichaelVogtとEricSmithによって寄稿されました。)
TarFile.list()は、 TarFile.getmembers()によって返されるリストのサブセットに設定できるオプションの members キーワード引数を受け入れるようになりました。 (:issue: `21549` でSerhiyStorchakaによって寄稿されました。)
糸脱毛
Lock.acquire()メソッドと RLock.acquire()メソッドの両方で、タイムアウト管理に単調なクロックが使用されるようになりました。 (:issue: `22043` でVictorStinnerによって寄稿されました。)
timeit
新しいコマンドラインオプション-u
または--unit=U
を使用して、タイマー出力の時間単位を指定できます。 サポートされているオプションは、usec
、msec
、またはsec
です。 (:issue: `18983` でJulianGindiによって寄稿されました。)
timeit()関数には、コードが実行される名前空間を指定するための新しい globals パラメーターがあります。 (:issue: `2527` でBenRobertsによって寄稿されました。)
tkinter
WindowsでTcl / Tk環境をセットアップするために使用されるtkinter._fix
モジュールは、環境変数に永続的な変更を加えない_tkinter
モジュールのプライベート関数に置き換えられました。 (:issue: `20035` のZacharyWareによる寄稿。)
トレースバック
新しい walk_stack()および walk_tb()関数は、フレームおよびトレースバックオブジェクトを便利にトラバースします。 (:issue: `17911` でRobertCollinsによって寄稿されました。)
新しい軽量クラス: TracebackException 、 StackSummary 、および FrameSummary 。 (:issue: `17911` でRobertCollinsによって寄稿されました。)
print_tb()関数と print_stack()関数の両方で、 limit 引数の負の値がサポートされるようになりました。 (:issue: `22619` のDmitryKazakovによる寄稿。)
種類
ジェネレーターおよびジェネレーターのようなオブジェクトを待機可能ファイルに変換する新しいコルーチン()関数。 (:issue: `24017` でYurySelivanovによって寄稿されました。)
CoroutineType と呼ばれる新しい型。これは、 async def 関数によって作成された coroutine オブジェクトに使用されます。 (:issue: `24400` でYurySelivanovによって寄稿されました。)
単体テスト
TestLoader.loadTestsFromModule()メソッドは、3番目の引数としてload_tests
に渡されるキーワードのみの引数 pattern を受け入れるようになりました。 パッケージ名がデフォルトのパターンと一致することは不可能であるため、見つかったパッケージは、パスがパターンと一致するかどうかに関係なく、load_tests
についてチェックされるようになりました。 (RobertCollinsとBarryAによる寄稿。 のワルシャウ:issue: `16662` 。)
ユニットテスト検出エラーは、 TestLoader インスタンスの TestLoader.errors 属性で公開されるようになりました。 (:issue: `19746` でRobertCollinsによって寄稿されました。)
トレースバックでローカル変数を表示するための新しいコマンドラインオプション--locals
。 (:issue: `22936` でRobertCollinsによって寄稿されました。)
unittest.mock
Mock クラスには次の改善があります。
- クラスコンストラクターに新しい unsafe パラメーターがあります。これにより、モックオブジェクトは
"assert"
で始まる属性名で AttributeError を発生させます。 (:issue: `21238` のKushalDasによる寄稿。) - モックオブジェクトが呼び出されたかどうかを確認するための新しい Mock.assert_not_called()メソッド。 (:issue: `21262` のKushalDasによる寄稿。)
MagicMock クラスは、__truediv__()
、__divmod__()
、および__matmul__()
演算子をサポートするようになりました。 (:issue: `20968` のJohannesBaiter、および:issue:` 23581` および:issue: `23568` のHåkanLövdahlによる寄稿。)
組み込み名にパッチを適用するときに、create=True
を patch()関数に明示的に渡す必要がなくなりました。 (:issue: `17660` のKushalDasによる寄稿。)
urllib
新しい request.HTTPPasswordMgrWithPriorAuth クラスを使用すると、HTTP基本認証のクレデンシャルを管理して、不要な401
応答処理を排除したり、最初のリクエストで無条件にクレデンシャルを送信して、 Authorization
ヘッダーが送信されない場合、401
の代わりに404
応答を返します。 (:issue: `19494` のMatejCeplと:issue:` 7159` のAkshitKhuranaによる寄稿。)
parse.urlencode()関数の新しい quote_via 引数は、必要に応じてクエリパーツのエンコードを制御する方法を提供します。 (:issue: `13866` でSamwyseとArnonYaariによって寄稿されました。)
request.urlopen()関数は、 ssl.SSLContext オブジェクトを context 引数として受け入れます。これは、HTTPS接続に使用されます。 (:issue: `22366` でAlexGaynorによって寄稿されました。)
parse.urljoin()が更新され、 ではなく、 RFC 3986 セマンティクスを相対URLの解決に使用するようになりました。 RFC 1808 および RFC 2396 。 (:issue: `22118` でDemianBrechtとSenthilKumaranによって寄稿されました。)
wsgiref
headers.Headers クラスコンストラクターの headers 引数はオプションになりました。 (:issue: `5800` のPabloTorres NavarreteとSilentGhostによる寄稿。)
xmlrpc
client.ServerProxy クラスは、コンテキストマネージャープロトコルをサポートするようになりました。 (:issue: `20627` でClaudiuPopaによって寄稿されました。)
client.ServerProxy コンストラクターは、オプションの ssl.SSLContext インスタンスを受け入れるようになりました。 (:issue: `22960` でAlexGaynorによって寄稿されました。)
xml.sax
SAXパーサーは、 xmlreader.InputSource オブジェクトの文字ストリームをサポートするようになりました。 (:issue: `2175` でSerhiyStorchakaによって寄稿されました。)
parseString()は、 str インスタンスを受け入れるようになりました。 (:issue: `10590` でSerhiyStorchakaによって寄稿されました。)
ZIPファイル
ZIP出力をシークできないストリームに書き込むことができるようになりました。 (:issue: `23252` のSerhiyStorchakaによる寄稿。)
ZipFile.open()メソッドの mode 引数は、"x"
を受け入れて排他的作成を要求するようになりました。 (:issue: `21717` のSerhiyStorchakaによる寄稿。)
その他のモジュールレベルの変更
mmap 、 ossaudiodev 、 socket 、 ssl 、および codecs モジュールの多くの関数が、書き込み可能なを受け入れるようになりました。 ]バイトのようなオブジェクト。 (:issue: `23001` のSerhiyStorchakaによる寄稿。)
最適化
os.walk()関数は、POSIXシステムでは3〜5倍、Windowsでは7〜20倍高速化されています。 これは、新しい os.scandir()関数を使用して行われました。この関数は、基になるreaddir
またはFindFirstFile
/ FindNextFile
システムコールからファイル情報を公開します。 (:issue: `23605` のVictorStinnerの助けを借りてBenHoytによって寄稿されました。)
bytes(int)
(0バイトで埋められる)の構築はより高速で、大きなオブジェクトに使用するメモリが少なくなります。 malloc()
の代わりにcalloc()
を使用して、これらのオブジェクトにメモリを割り当てます。 (:issue: `21233` でVictorStinnerによって寄稿されました。)
ipaddress IPv4Network および IPv6Network の一部の操作は、サブネット()、スーパーネット()[など、大幅に高速化されています。 X155X]、 summary_address_range()、 collectup_addresses()。 スピードアップは3〜15倍の範囲です。 (:issue: `21486` 、:issue:` 21487` 、:issue: `20826` のAntoinePitrou、Michel Albert、Markusによる寄稿、:issue: `23266` 。)
ipaddress オブジェクトのピクルスは、大幅に小さい出力を生成するように最適化されました。 (:issue: `23133` でSerhiyStorchakaによって寄稿されました。)
io.BytesIO での多くの操作が、50%から100%高速になりました。 (:issue: `15381` のSerhiyStorchakaと:issue:` 22003` のDavidWilsonによる寄稿。)
marshal.dumps()関数が高速になりました。通常のデータではバージョン3および4で65〜85%、バージョン0〜2で20〜25%、最良の場合は最大5倍です。 (:issue: `20416` および:issue:` 23344` でSerhiyStorchakaによって寄稿されました。)
UTF-32エンコーダーは3〜7倍高速になりました。 (:issue: `15027` でSerhiyStorchakaによって寄稿されました。)
正規表現は最大10 % f asterで解析されるようになりました。 (:issue: `19380` でSerhiyStorchakaによって寄稿されました。)
json.dumps()関数は、ensure_ascii=True
と同じ速さでensure_ascii=False
で実行するように最適化されました。 (:issue: `23206` の稲田直樹による寄稿。)
PyObject_IsInstance()および PyObject_IsSubclass()関数は、2番目の引数が type をメタクラスとして持つ一般的なケースで高速化されました。 (:issue: `22540` でGeorgBrandlに寄稿されました。)
メソッドのキャッシュがわずかに改善され、一部のベンチマークで最大5%のパフォーマンスが向上しました。 (:issue: `22847` のAntoinePitrouによる寄稿。)
ランダムモジュールのオブジェクトは、64ビットビルドで50 % le ssメモリを使用するようになりました。 (:issue: `23488` のSerhiyStorchakaによる寄稿。)
property() getter呼び出しは最大25 % f asterです。 (:issue: `23910` でJoeJevnikによって寄稿されました。)
fractions.Fraction のインスタンス化は最大30 % f asterになりました。 (:issue: `22464` でStefanBehnelによって寄稿されました。)
文字列メソッド find()、 rfind()、 split()、 partition()および in 文字列演算子は、1文字の部分文字列を検索するために大幅に高速になりました。 (:issue: `23573` でSerhiyStorchakaによって寄稿されました。)
ビルドとCAPIの変更
新しいcalloc
関数が追加されました。
(:issue: `21233` でVictorStinnerによって寄稿されました。)
新しいエンコード/デコードヘルパー関数:
- Py_DecodeLocale()(
_Py_char2wchar()
を置き換え)、 - Py_EncodeLocale()(
_Py_wchar2char()
に置き換えられました)。
(:issue: `18395` でVictorStinnerによって寄稿されました。)
新しい PyCodec_NameReplaceErrors()関数は、Unicodeエンコードエラーを\N{...}
エスケープに置き換えます。 (:issue: `19676` でSerhiyStorchakaによって寄稿されました。)
新しい PyErr_FormatV()関数は、 PyErr_Format()に似ていますが、va_list
引数を受け入れます。 (:issue: `18711` のAntoinePitrouによる寄稿。)
新しいPyExc_RecursionError
例外。 (:issue: `19235` でGeorgBrandlによって寄稿されました。)
PEP 489 によって導入された新しい PyModule_FromDefAndSpec()、 PyModule_FromDefAndSpec2()、および PyModule_ExecDef()関数–マルチ-フェーズ拡張モジュールの初期化。 (:issue: `24268` のPetrViktorinによる寄稿。)
行列の乗算を実行するための新しい PyNumber_MatrixMultiply()および PyNumber_InPlaceMatrixMultiply()関数。 (:issue: `21176` でBenjaminPetersonによって寄稿されました。 詳細については、 PEP 465 も参照してください。)
PyTypeObject.tp_finalize スロットが安定したABIの一部になりました。
Windowsビルドには、 Visual Studio 2015 の一部として利用可能なMicrosoftVisual C ++ 14.0が必要になりました。
一部のプラットフォームでは、拡張モジュールのファイル名にプラットフォーム情報タグが含まれるようになりました(タグはオプションであり、CPythonはそれなしで拡張機能をインポートしますが、タグが存在して不一致の場合、拡張機能は読み込まれません)。
- Linuxでは、拡張モジュールのファイル名は
.cpython-<major><minor>m-<architecture>-<os>.pyd
で終わります。<major>
はPythonバージョンのメジャー番号です。 Python 3.5の場合、これは3
です。<minor>
はPythonバージョンのマイナー番号です。 Python 3.5の場合、これは5
です。<architecture>
は、拡張モジュールを実行するために構築されたハードウェアアーキテクチャです。 最も一般的には、32ビットIntelプラットフォームの場合はi386
、64ビットIntel(およびAMD)プラットフォームの場合はx86_64
のいずれかです。<os>
は常にlinux-gnu
です。ただし、64ビットプラットフォームで32ビットABIと通信するように構築された拡張機能は除きます。この場合、linux-gnu32
(および [ X145X]はx86_64
)になります。
- Windowsでは、拡張モジュールのファイル名は
<debug>.cp<major><minor>-<platform>.pyd
で終わります。<major>
はPythonバージョンのメジャー番号です。 Python 3.5の場合、これは3
です。<minor>
はPythonバージョンのマイナー番号です。 Python 3.5の場合、これは5
です。<platform>
は、拡張モジュールが構築されたプラットフォームであり、Win32の場合はwin32
、Win64の場合はwin_amd64
、Windows Itanium64の場合はwin_ia64
、win_arm
WindowsオンARM用。- デバッグモードでビルドされている場合、
<debug>
は_d
になり、それ以外の場合は空白になります。
- OS Xプラットフォームでは、拡張モジュールのファイル名が
-darwin.so
で終わるようになりました。 - 他のすべてのプラットフォームでは、拡張モジュールのファイル名はPython3.4の場合と同じです。
非推奨
新しいキーワード
async
およびawait
を変数、クラス、関数、またはモジュール名として使用することはお勧めしません。 Python3.5の PEP 492 によって導入され、Python3.7では適切なキーワードになります。
非推奨のPythonの動作
ジェネレーター内で StopIteration 例外を発生させると、サイレント PendingDeprecationWarning が生成されます。これは、Python 3.6では非サイレントの非推奨警告になり、 RuntimeError をトリガーします。 Python3.7。 詳細については、 PEP 479:ジェネレーター内のStopIteration処理の変更を参照してください。
サポートされていないオペレーティングシステム
Windows XPはMicrosoftでサポートされなくなったため、 PEP 11 により、CPython3.5はこのOSで正式にサポートされなくなりました。
非推奨のPythonモジュール、関数、メソッド
formatter モジュールは完全に非推奨になり、Python3.6での削除が予定されています。
asyncio.async()
関数は非推奨になり、 sure_future()が優先されます。
smtpd モジュールは、これまで常にutf-8
コーデックを使用して電子メールメッセージのDATA部分をデコードしてきました。 これは、 SMTPServer への新しい decode_data キーワードによって制御できるようになりました。 デフォルト値はTrue
ですが、このデフォルトは非推奨です。 decode_data キーワードを適切な値で指定して、非推奨の警告を回避します。
http.cookies.Morsel オブジェクトの key 、 value 、および coded_value に値を直接割り当てることは非推奨です。 代わりに set()メソッドを使用してください。 さらに、 set()の文書化されていない LegalChars パラメーターは非推奨になり、無視されるようになりました。
string.Formatter クラスの format()メソッドへのキーワード引数 format_string としてのフォーマット文字列の受け渡しは非推奨になりました。 (:issue: `23671` のSerhiyStorchakaによる寄稿。)
platform.dist()
およびplatform.linux_distribution()
関数は非推奨になりました。 Linuxディストリビューションは、それ自体を記述するために非常に多くの異なる方法を使用しているため、機能はパッケージに任されています。 (:issue: `1322` でVajraskyKokとBerkerPeksagによって寄稿されました。)
以前に文書化されていなかった inspect.Signature のfrom_function
およびfrom_builtin
メソッドは非推奨になりました。 代わりに、新しい Signature.from_callable()メソッドを使用してください。 (:issue: `24248` でYurySelivanovによって寄稿されました。)
inspect.getargspec()関数は非推奨であり、Python3.6で削除される予定です。 (詳細については、:issue: `20438` を参照してください。)
inspect getfullargspec()、 getcallargs()、および formatargspec()関数は非推奨になり、 inspectが優先されます。署名() API。 (:issue: `20438` でYurySelivanovによって寄稿されました。)
getargvalues()および formatargvalues()関数は、Python3.5.0のリリースで非推奨として誤ってマークされました。
strパターンでの re.LOCALE フラグまたは re.ASCII の使用は非推奨になりました。 (:issue: `22407` のSerhiyStorchakaによる寄稿。)
'\'
とASCII文字で構成される認識されない特殊なシーケンスを正規表現パターンと置換パターンで使用すると、非推奨の警告が表示されるようになり、Python3.6では禁止されます。 (:issue: `23622` のSerhiyStorchakaによる寄稿。)
unittest.TestLoader.loadTestsFromModule()メソッドの文書化されていない非公式の use_load_tests デフォルト引数は非推奨になり、無視されるようになりました。 (RobertCollinsとBarryAによる寄稿。 のワルシャウ:issue: `16662` 。)
NS
APIと機能の削除
次の廃止され、以前は廃止されたAPIと機能が削除されました。
__version__
属性は電子メールパッケージから削除されました。 電子メールコードは長い間stdlibとは別に出荷されておらず、__version__
文字列は過去数回のリリースで更新されていません。- ftplib モジュールの内部
Netrc
クラスは、3.4で非推奨になり、現在は削除されています。 (:issue: `6623` のMattChaputによる寄稿。) .pyo
ファイルの概念は削除されました。- 暫定 asyncio モジュールのJoinableQueueクラスは、3.4.4で非推奨になり、現在は削除されています。 (Aによる寄稿。 のJesseJiryu Davis:issue: `23464` 。)
Python3.5への移植
このセクションでは、コードの変更が必要になる可能性のある、前述の変更とその他のバグ修正を示します。
Pythonの動作の変更
見落としのため、以前のPythonバージョンは誤って次の構文を受け入れていました。
f(1 for x in [1], *args) f(1 for x in [1], **kwargs)
Python 3.5では、 SyntaxError が正しく発生するようになりました。これは、関数の唯一の引数ではない場合、ジェネレーター式を括弧で囲む必要があるためです。
PythonAPIの変更
- PEP 475 :Pythonシグナルハンドラーが例外を発生させない場合、 InterruptedError を発生させる代わりに、シグナルによって中断されたときにシステムコールが再試行されるようになりました。
- Python 3.5より前は、 datetime.time オブジェクトは、UTCで深夜を表す場合はfalseと見なされていました。 この動作はあいまいでエラーが発生しやすいと見なされ、Python3.5で削除されました。 詳細については、:issue: `13936` を参照してください。
ssl.SSLSocket.send()
メソッドは、操作がブロックされる場合、非ブロックソケットで ssl.SSLWantReadError または ssl.SSLWantWriteError のいずれかを発生させるようになりました。 以前は、0
を返していました。 (:issue: `20951` のNikolausRathによる寄稿。)- ジェネレーターの
__name__
属性は、コード名からではなく、関数名から設定されるようになりました。gen.gi_code.co_name
を使用してコード名を取得します。 ジェネレーターには、新しい__qualname__
属性、修飾名もあります。これは、ジェネレーターの表現に使用されるようになりました(repr(gen)
)。 (:issue: `21205` でVictorStinnerによって寄稿されました。) - 非推奨の「strict」モードと HTMLParser 、
HTMLParser.error()
、およびHTMLParserError
例外の引数が削除されました。 (:issue: `15114` のEzioMelottiによる寄稿。) HTMLParser の convert_charrefs 引数はデフォルトでTrue
になりました。 (:issue: `21047` のBerkerPeksagによる寄稿。) - 正式にはAPIの一部ではありませんが、移植の目的(つまり、テストの修正)で、以前は「 'sometype'はバッファプロトコルをサポートしていません」という形式であったエラーメッセージが「a バイトのようなオブジェクトが必要です。「sometype」ではありません。 (:issue: `16518` のEzioMelottiによる寄稿。)
- 現在のディレクトリが存在しないディレクトリに設定されている場合、 FileNotFoundError は発生せず、代わりに find_spec()は
None
without [ X192X] sys.path_importer_cache にNone
をキャッシュします。これは通常の場合(:issue: `22834` )とは異なります。 - http.client および http.server からのHTTPステータスコードとメッセージは、共通の HTTPStatus 列挙型にリファクタリングされました。 http.client および http.server の値は、下位互換性のために引き続き使用できます。 (:issue: `21793` のDemianBrechtによる寄稿。)
- インポートローダーが
importlib.machinery.Loader.exec_module()
を定義すると、create_module()
も定義されるようになります( DeprecationWarning が発生すると、Python 3.6ではエラーになります)。 ローダーが importlib.abc.Loader を継承している場合は、何もする必要はありません。それ以外の場合は、create_module()
を定義してNone
を返します。 (:issue: `23014` のBrettCannonによる寄稿。) - re.split()関数は常に空のパターン一致を無視したため、
"x*"
パターンは"x+"
と同じように機能し、"\b"
パターンは機能しませんでした。 re.split()は、パターンが空の文字列と一致する可能性がある場合に警告を発するようになりました。 互換性のために、空の文字列と一致しないパターンを使用してください(例:"x*"
の代わりに"x+"
)。 空の文字列にしか一致しなかったパターン("\b"
など)でエラーが発生するようになりました。 (:issue: `22818` のSerhiyStorchakaによる寄稿。) - http.cookies.Morsel dictのようなインターフェースは、自己整合性があります。morselの比較では、キーと値が考慮されるようになりました。 copy( )は、 dict ではなく Morsel インスタンスになり、 update()は、更新内のいずれかのキーの場合に例外を発生させるようになりました。辞書が無効です。 さらに、 set()の文書化されていない LegalChars パラメーターは非推奨になり、無視されるようになりました。 (:issue: `2211` のDemianBrechtによる寄稿。)
- PEP 488 は、Pythonから
.pyo
ファイルを削除し、.pyc
ファイル名にオプションのopt-
タグを導入しました。 importlib.util.cache_from_source()は、opt-
タグの制御に役立つ optimization パラメーターを取得しました。 このため、関数の debug_override パラメーターは非推奨になりました。 .pyo ファイルもPythonインタープリターへのファイル引数としてサポートされなくなったため、単独で配布した場合(つまり、 ソースレスコード配布)。 Python 3.5ではバイトコードのマジックナンバーが変更されているため、このPEPに関係なく、以前のバージョンのPythonの古い .pyo ファイルはすべて無効です。 - socket モジュールは、Linux3.6以降で CAN_RAW_FD_FRAMES 定数をエクスポートするようになりました。
- ssl.cert_time_to_seconds()関数は、 RFC 5280 に従って、入力時刻を現地時間ではなくUTCとして解釈するようになりました。 また、戻り値は常に int です。 (:issue: `19940` のAkiraLiによる寄稿。)
pygettext.py
ツールは、POT-Creation-Dateヘッダーのタイムゾーンに標準の+ NNNN形式を使用するようになりました。- smtplib モジュールは、デバッグ出力に以前のモジュールレベルの
stderr
変数の代わりに、 sys.stderr を使用するようになりました。 (テスト)プログラムがデバッグ出力をキャプチャするためにモジュールレベルの変数にパッチを適用することに依存している場合は、代わりにsys.stderrをキャプチャするようにプログラムを更新する必要があります。 - str.startswith()および str.endswith()メソッドは、空の文字列を検索し、インデックスが完全に範囲外の場合に
True
を返さなくなりました。 (:issue: `24284` でSerhiyStorchakaによって寄稿されました。) - inspect.getdoc()関数は、基本クラスから継承されたドキュメント文字列を返すようになりました。 継承されたドキュメントが適切である場合、ドキュメント文字列を複製する必要がなくなりました。 継承された文字列を抑制するには、空の文字列を指定する必要があります(または、ドキュメントに入力する必要があります)。 この変更は、 pydoc モジュールと help()関数の出力に影響します。 (:issue: `15582` のSerhiyStorchakaによる寄稿。)
- ネストされた functools.partial()呼び出しがフラット化されるようになりました。 以前の動作に依存していた場合は、 functools.partial()オブジェクトに属性を追加するか、 functools.partial()のサブクラスを作成できます。 (:issue: `7830` でAlexanderBelopolskyによって寄稿されました。)
CAPIの変更
- (非公開)
PyMemoryViewObject
構造の文書化されていないformat
メンバーが削除されました。memoryobject.h
の関連パーツに依存するすべての拡張機能を再構築する必要があります。 PyMemAllocator
構造の名前が PyMemAllocatorEx に変更され、新しいcalloc
フィールドが追加されました。- 参照をリークした文書化されていないマクロ
PyObject_REPR
を削除しました。 PyUnicode_FromFormat()のような関数でフォーマット文字%R
を使用して、オブジェクトの repr()をフォーマットします。 (:issue: `22453` のSerhiyStorchakaによる寄稿。) __module__
属性がないと、pickle化とイントロスペクションが中断されるため、__module__
属性のない組み込み型に対して非推奨の警告が発生するようになりました。 これは将来的にAttributeErrorになるでしょう。 (:issue: `20204` でSerhiyStorchakaによって寄稿されました。)- PEP 492 実装の一部として、 PyTypeObject の
tp_reserved
スロットがtp_as_async
スロットに置き換えられました。 新しいタイプ、構造、および機能については、コルーチンオブジェクトを参照してください。
Python3.5.4での注目すべき変更
新しいmake regen-allビルドターゲット
クロスコンパイルを簡素化し、既存のバージョンのPythonがすでに利用可能でなくても、CPythonを確実にコンパイルできるようにするために、autotoolsベースのビルドシステムは、ファイルの変更時間に基づいて生成されたファイルを暗黙的に再コンパイルしようとしなくなりました。
代わりに、新しいmake regen-all
コマンドが追加され、必要に応じてこれらのファイルを強制的に再生成します(例: Pythonの初期バージョンが、事前に生成されたバージョンに基づいてすでに構築された後)。
より選択的な再生ターゲットも定義されています。詳細については、:source: `Makefile.pre.in` を参照してください。
(:issue: `23404` でVictorStinnerによって寄稿されました。)
バージョン3.5.4の新機能。
make touchビルドターゲットの削除
以前は、変更時刻を更新して生成されたファイルの暗黙的な再生成を要求するために使用されていたmake touch
ビルドターゲットが削除されました。
新しいmake regen-all
ターゲットに置き換えられました。
(:issue: `23404` でVictorStinnerによって寄稿されました。)
バージョン3.5.4で変更されました。