What's New In Python 3.5

エディタ:

Elvis Pranskevichus <elvis@magic.io>, Yury Selivanov <yury@magic.io>

この記事では 3.4 と比較した Python 3.5 の新機能を解説します。 Python 3.5 は2015年9月13日にリリースされました。 全詳細については 変更履歴 をご覧ください。

参考

PEP 478 - Python 3.5 リリーススケジュール

概要 -- リリースハイライト

新たな文法機能:

  • PEP 492、コルーチン、async 構文と await 構文。

  • PEP 465、新たな行列乗算演算子 a @ b。

  • PEP 448、追加可能なアンパックへの一般化。

新たなライブラリモジュール:

新たな組み込み機能:

  • bytes % args, bytearray % args: PEP 461 -- bytes と bytearray に % 書式化を追加。

  • 新たな bytes.hex(), bytearray.hex() memoryview.hex() メソッド。 (Contributed by Arnon Yaari in bpo-9951.)

  • memoryview クラスが、(複数次元の場合を含んだ) タプルの添字をサポートするようになりました。 (bpo-23632 におけるAntoine Pitrouによる貢献です。)

  • ジェネレータに gi_yieldfrom 属性が新しく追加され、これは yield from 式で反復処理されるオブジェクトを返します。 (Contributed by Benno Leslie and Yury Selivanov in bpo-24450.)

  • 新たな例外 RecursionError が最長再帰深度に到達した際に送出されるようになりました。 (Contributed by Georg Brandl in bpo-19235.)

CPython の実装の改善:

  • LC_TYPE ロケールが POSIX ロケール (C ロケール) のとき、 sys.stdin および sys.stdout は strict エラーハンドラではなく surrogateescape を使うようになりました。 (Contributed by Victor Stinner in bpo-19977.)

  • .pyo ファイルは使われなくなり、.pyc ファイル名に最適化レベルが明示される、より柔軟な仕組みに置き換えられました。(PEP 488 の概要 を参照してください。)

  • 組み込みおよび拡張モジュールが多段階で初期化されるようになりました。これは Python モジュールのロード方法と同じです。 (PEP 489 の概要 を参照してください。)

標準ライブラリーの顕著な改善

セキュリティの改善:

  • SSLv3 が標準ライブラリ全体を通じて無効化されました。ただし ssl.SSLContext を手動でインスタンス化することによってなら今でも有効には出来ます。 (詳細に関しては bpo-22638 を参照してください。この変更は CPython 3.4 と 2.7 にもバックポートされました。)

  • 潜在的なインジェクション攻撃からの防御のために、HTTP クッキーの解析がより厳密に行われるようになりました。 (Contributed by Antoine Pitrou in bpo-22796.)

Windows の改善:

  • Windows のインストーラが新しくなり古い MSI を置き換えました。さらに詳しい情報は Windows で Python を使う をご覧ください。

  • Windows のビルドに Microsoft Visual C++ 14.0 を使うようになっています。拡張モジュールも同じものを使うべきです。

以降は、たくさんのほかの小さな改善、CPython での最適化、非推奨リスト、潜在的な移植性問題を含む、ユーザ向けの変更の包括的なリストになっています。

新しい機能

PEP 492 - コルーチン、 async と await 構文

PEP 492 で 待機可能オブジェクト、コルーチン関数、非同期イテレーション、非同期コンテキストマネージャ が追加され、Python における非同期プログラミングを大幅に向上しました。

コルーチン関数は新たな構文 async def を用いて定義されます:

>>> async def coro():
...     return 'spam'

コルーチン関数内では、新しい await 式を使って、結果が得られるまでコルーチンの実行を中断できます。 __await__() メソッドを定義して awaitable プロトコルを実装していれば、どのようなオブジェクトでも await できます。

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 loop のような適したイベントループ内で実行させるためのものです。

注釈

バージョン 3.5.2 で変更: CPython 3.5.2 以降では、 __aiter__ は 非同期イテレータ を直接返せます。 awaitable オブジェクトを返すと PendingDeprecationWarning が送出されます。

より詳細なことはドキュメントの 非同期イテレータ (Asynchronous Iterator) 節を参照してください。

参考

PEP 492 -- コルーチン、 async 構文と await 構文

PEP written and implemented by Yury Selivanov.

PEP 465 - 行列の乗算専用の中置演算子

PEP 465 により、行列乗算の中置演算子 @ が追加されました。 現時点では Python の組み込み型にこの演算子の実装はありませんが、通常の行列乗算、反射行列乗算、その場での行列乗算をそれぞれ __matmul__()、__rmatmul__()、__imatmul__() で実装できます。 これらのメソッドの意味は、ほかの中置算術演算子を定義するメソッドと同様です。

行列の乗算は数学、科学、工学の多くの分野では非常に一般的です。 @ の追加によりコードをより綺麗に書くことが出来ます:

S = (H @ beta - r).T @ inv(H @ V @ H.T) @ (H @ beta - r)

これはたとえば NumPy を使っても、以下のように書く必要がありました:

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.])

参考

PEP 465 -- 行列乗算専用の中置演算子

PEP written by Nathaniel J. Smith; implemented by Benjamin Peterson.

PEP 448 - 追加可能なアンパックへの一般化

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 -- 追加可能なアンパックへの一般化

PEP written by Joshua Landau; implemented by Neil Girdhar, Thomas Wouters, and Joshua Landau.

PEP 461 - bytes および bytearray のパーセント書式化サポート

PEP 461 によって、 bytes と bytearray に % 補間演算子 のサポートが追加されます。

補間は通常は文字列演算だと考えられていますが、 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 変換型はサポートはされますが、 Python 2 との互換性を持たせる必要のあるコードベースでのみ使われるべきだということに注意してください。

参考

PEP 461 -- bytes と bytearray への % 書式化の追加

PEP written by Ethan Furman; implemented by Neil Schemenauer and Ethan Furman.

PEP 484 - 型ヒント

関数アノテーション構文はバージョン 3.0 (PEP 3107) から Python の仕様になりましたが、アノテーションのセマンティクスは未定義のままでした。

経験的に、関数アノテーションの使用の大半は関数の引数と返り値の型ヒントを提供するためのものです。 標準ライブラリーが型アノテーションの基本的な定義とツールを持てば、Python ユーザに有益であることは明白となりました。

PEP 484 は、標準的な定義とツールを提供する 暫定モジュール と、アノテーションを使えない状況での記述方法を導入します。

例えば、こちらは引数と返り値の型がアノテーションで定義されている簡単な関数です:

def greeting(name: str) -> str:
    return 'Hello ' + name

これらのアノテーションは通常の __annotations__ 属性を通じて実行時にも取得できますが、実行時に自動的な型検査が行われることはありません。 代わりに、独立したオフラインの型検査ツール (例えば mypy) を使い、必要に応じてソースコードを解析することを想定しています。

型システムはユニオン、一般型、そして Any という全ての型と互換な (すなわち代入可能) 特殊型をサポートしています。

参考

  • typing モジュールのドキュメント

  • PEP 484 -- 型ヒント

    PEP 著 Guido van Rossum, Jukka Lehtosalo, Łukasz Langa; 実装 Guido van Rossum。

  • PEP 483 -- 型ヒントの理論

    PEP written by Guido van Rossum

PEP 471 - os.scandir() 関数 -- より良く、速いディレクトリイテレータ

PEP 471 により新しいディレクトリ反復関数 os.scandir() が標準ライブラリへ追加されました。 さらに、 scandir を使い os.walk() が実装され、 POSIX システムで3倍から5倍、 Windows システムで7倍から20倍高速になりました。 これは主に、ディレクトリツリーを走査するのに必要な os.stat() の呼び出し回数をかなり減らしたことによるものです。

これの他にも、 scandir ファイル名のリストではなくイテレータを返すようになり、非常に大きなディレクトリ群の走査をするときのメモリ効率が改善されました。

次の例では、 os.scandir() を使用して、与えられた path 内の先頭が '.' でないすべてのファイル (ディレクトリを除く) を表示します。 entry.is_file() を呼び出しても、通常は追加のシステムコールは行われません:

for entry in os.scandir(path):
    if not entry.name.startswith('.') and entry.is_file():
        print(entry.name)

参考

PEP 471 -- os.scandir() 関数 -- より良く、速いディレクトリイテレータ

PEP 著・実装 Ben Hoyt 補佐 Victor Stinner。

PEP 475: EINTR で失敗したシステムコールの再試行

I/O を待機しているシステムコールがシグナルで中断されると、エラーコード errno.EINTR が返されます。 以前の Python はこのような場合に InterruptedError を送出していました。 そのため Python アプリケーションの開発者には、次の二つの選択肢がありました:

  1. InterruptedError を無視する。

  2. 呼び出し箇所の全てで InterruptedError を処理し、中断されたシステムコールの再開を試みる。

最初の選択肢では、アプリケーションは断続的に失敗します。 二つ目の選択肢では、定型処理を大量に追加せねばならず、コードの可読性が著しく下がります。 次の2つを比べてみてください:

print("Hello World")

および:

while True:
    try:
        print("Hello World")
        break
    except InterruptedError:
        continue

PEP 475 は EINTR を受けた場合のシステムコールの自動再試行を実装しています。 これはほとんどの場合ユーザコードでの EINTR や InterruptedError を扱う負担をなくし、標準ライブラリを含む Python プログラムをより堅牢にします。 シグナルハンドラが例外を投げない場合にのみシステムコールを再試行することに注意してください。

下記は、シグナルで中断された際に再試行をするようになった関数のリストです:

参考

PEP 475 -- EINTR で失敗したシステムコールの再試行

Antoine Pitrou の協力のもと、 PEP および実装は Charles-François Natali と Victor Stinner によって書かれました (『フレンチ・コネクション』)。

PEP 479: ジェネレータ内の StopIteration の処理の変更

Python 3.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 written by Chris Angelico and Guido van Rossum. Implemented by Chris Angelico, Yury Selivanov and Nick Coghlan.

PEP 485: 近似的に等しいことを調べる関数

PEP 485 により、2値が互いに近似的に等しいか "近い" ことを調べる関数 math.isclose() 及び cmath.isclose() が追加されました。 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 485 -- A function for testing approximate equality

PEP written by Christopher Barker; implemented by Chris Barker and Tal Einat.

PEP 486: Python ランチャーが仮想環境を認識する

PEP 486 により、 Windows ランチャー (PEP 397 を参照してください) が有効になっている仮想環境を認識するようになりました。 デフォルトのインタプリタを使っていて、 VIRTUAL_ENV 環境変数が設定されているときは、仮想環境のインタプリタが使われます。

参考

PEP 486 -- Python ランチャーが仮想環境を認識する

PEP written and implemented by Paul Moore.

PEP 488: PYO ファイルの廃止

PEP 488 は .pyo ファイルという概念を廃止しました。 つまり、.pyc ファイルは最適化されていないバイトコードと最適化されたバイトコードの両方を指すということです。 バイトコードファイルを何度も再生成する必要がないよう、バイトコードが最適化されたときは .pyc ファイルは任意の opt- タグを名前に持つようになりました。 この副作用で、-O と -OO のいずれかで実行した場合でも、バイトコードのファイル名が衝突しないようになりました。 それにより、-O および -OO で生成したバイトコードは同時に存在できるようになりました。 importlib.util.cache_from_source() にの API は更新され、この変更に役立ちます。

参考

PEP 488 -- PYO ファイルの廃止

PEP written and implemented by Brett Cannon.

PEP 489: 拡張モジュールの多段階初期化

PEP 489 により拡張モジュールの初期化方式が更新され、 Python 3.4 で PEP 451 によって導入された2段階でモジュールを読み込む仕組みが活用できるようになりました。

この変更によって、新しい仕組みを使うことを選択した拡張モジュールのインポートの動作が、 Python のソースコードやバイトコードでできたモジュールにかなり近くなり、これまで ASCII に制限されていたモジュール名に任意の識別子が使えるようになりました。

参考

PEP 489 -- 拡張モジュールの多段階初期化

PEP 著 Petr Viktorin, Stefan Behnel, Nick Coghlan; 実装 Petr Viktorin.

その他の言語変更

Python 言語コアに小さな変更がいくつか行われました:

  • "namereplace" エラーハンドラが追加されました。"backslashreplace" エラーハンドラはデコードと変換で動くようになりました。 (Contributed by Serhiy Storchaka in bpo-19676 and bpo-22286.)

  • -b オプションが bytes と int の比較に影響するようになりました。 (Contributed by Serhiy Storchaka in bpo-23681.)

  • 新たなカザフ語 kz1048 及びタジク語 koi8_t コーデックス。 (Contributed by Serhiy Storchaka in bpo-22682 and bpo-22681.)

  • プロパティのドキュメンテーション文字列が書き込み可能になりました。これは特に collections.namedtuple() のドキュメンテーション文字列で有用です。 (Contributed by Berker Peksag in bpo-24064.)

  • 相対インポートに関する循環インポートがサポートされました。(Contributed by Brett Cannon and Antoine Pitrou in bpo-17636.)

新たなモジュール

typing

新しい 暫定 モジュール typing は、関数の型アノテーションのための標準的な定義とツールを提供します。 詳しくは 型ヒント を参照してください。

zipapp

新たな zipapp モジュール (PEP 441 で仕様定義) は実行可能な Python Zip アプリケーションを作成するための API とコマンドラインツールを提供します。 Python Zip アプリケーションは Python 2.6 の bpo-1739468 で導入されましたが、それ以降もあまり知られていませんでした。

この新しいモジュールを使ったアプリケーションのバンドル方法は単純で、 __main__.py ファイルを含む全てのファイルをディレクトリ myapp に置き、次のように実行します:

$ python -m zipapp myapp
$ python myapp.pyz

モジュールの実装は bpo-23491 の Paul Moore による貢献です。

参考

PEP 441 -- Python ZIP アプリケーションのサポートの改善 <whatsnew-zipapp>`

改良されたモジュール

argparse

ArgumentParser クラスは、allow_abbrev を False に設定することでロングオプションの 短縮使用 を無効化できるようになりました。 (Contributed by Jonathan Paugh, Steven Bethard, paul j3 and Daniel Eriksson in bpo-14910.)

asyncio

asyncio モジュールは 暫定的 なため、Python 3.5 で導入されたすべての変更は Python 3.4.x にもバックポートされました。

Python 3.4.0 以後の asyncio モジュールの重要な変更点:

  • 新たなデバッグ API: loop.set_debug() と loop.get_debug() メソッド。 (Contributed by Victor Stinner.)

  • proactor イベントループが SSL をサポートしました。 (Contributed by Antoine Pitrou and Victor Stinner in bpo-22560.)

  • イベントループが閉じているかどうか調べる新たな loop.is_closed() メソッド。 (Contributed by Victor Stinner in bpo-21326.)

  • コルーチンの新しい Task を便利に作成しスケジュールするための新たな loop.create_task()。 create_task メソッドは コルーチンをタスクにラップする全ての asyncio 関数、たとえば asyncio.wait(), asyncio.gather()、にも使われます。 (Contributed by Victor Stinner.)

  • 新しい transport.get_write_buffer_limits() メソッドで、フロー制御の 上限 と 下限 のしきい値を調べられます。 (Contributed by Victor Stinner.)

  • async() 関数は非推奨になりました。 代わりに ensure_future() を使ってください。 (Contributed by Yury Selivanov.)

  • loop.create_task() メソッドが使うタスクファクトリーをカスタマイズするための新たな loop.set_task_factory() メソッドと loop.get_task_factory() メソッド。 (Yury Selivanovによる貢献。)

  • 新たな Queue.join() および Queue.task_done() キューメソッド。(Contributed by Victor Stinner.)

  • JoinableQueue クラスは asyncio.Queue クラスにより削除されました。 (Contributed by Victor Stinner.)

3.5.1 での変更:

  • ensure_future() 関数と、 loop.run_until_complete() のようなそれを使っている全ての関数であらゆる awaitable オブジェクト を受け取れるようになりました。 (Contributed by Yury Selivanov.)

  • 他のスレッドからコルーチンをイベントループに送信するための新たな run_coroutine_threadsafe() 関数。 (Contributed by Vincent Michel.)

  • 新しい Transport.is_closing() メソッドで、トランスポートが終了処理中または終了済みか確認できます。 (Contributed by Yury Selivanov.)

  • loop.create_server() メソッドはホストのリストを受け取れるようになりました。 (Contributed by Yann Sionneau.)

3.5.2 での変更:

  • Future オブジェクトを作成する loop.create_future() メソッドが追加されました。 これにより uvloop などの別のイベントループ実装が、より高速な asyncio.Future 実装を提供できます。 (Contributed by Yury Selivanov.)

  • 新しい loop.get_exception_handler() メソッドで、現在の例外ハンドラが取得できるようになりました。 (Contributed by Yury Selivanov.)

  • 新しい StreamReader.readuntil() メソッドで、区切りとなるバイトの並びが出てくるまでストリームからデータを読み取れるようになりました。 (Contributed by Mark Korenberg.)

  • loop.create_connection() メソッドおよび loop.create_server() メソッドが、アドレスが解決済みの場合に、システムの getaddrinfo 関数を呼び出さないように最適化されました。 (Contributed by A. Jesse Jiryu Davis.)

  • loop.sock_connect(sock, address) を呼び出す前に address を解決しておく必要がなくなりました。 (Contributed by A. Jesse Jiryu Davis.)

bz2

BZ2Decompressor.decompress メソッドがオプション引数 max_length を取れるようになり、展開されたデータの最大サイズが制限できるようになりました。 (Contributed by Nikolaus Rath in bpo-15955.)

cgi

FieldStorage クラスが context manager プロトコルに対応しました。 (Contributed by Berker Peksag in bpo-20289.)

cmath

新たな関数 isclose() は近似的に等しいかどうかを判断する方法を提供します。 (Contributed by Chris Barker and Tal Einat in bpo-24270.)

コード

InteractiveInterpreter.showtraceback() メソッドが、対話的インタープリタのように連なったスタックトレース全体を表示するようになりました。 (Contributed by Claudiu Popa in bpo-17442.)

collections

collections.OrderedDict が C で実装されました。 これにより 4倍 から 100 倍高速になりました。 (Contributed by Eric Snow in bpo-16991.)

OrderedDict.items()、OrderedDict.keys()、OrderedDict.values() のビューが reversed() による逆順の反復処理に対応しました。 (Contributed by Serhiy Storchaka in bpo-19505.)

deque クラスが index()、 insert()、 copy() を定義し、+ と * 演算をサポートしました。 これにより deque インスタンスは MutableSequence と認識され、list との代替性が向上しました。 (Contributed by Raymond Hettinger in bpo-23704.)

namedtuple() で生成されたドキュメンテーション文字列が更新可能となりました:

Point = namedtuple('Point', ['x', 'y'])
Point.__doc__ += ': Cartesian coordinate'
Point.x.__doc__ = 'abscissa'
Point.y.__doc__ = 'ordinate'

(Contributed by Berker Peksag in bpo-24064.)

UserString クラスに __getnewargs__()、__rmod__()、casefold()、format_map()、isprintable()、maketrans() メソッドが実装され、str の対応するメソッドと揃いました。 (Contributed by Joe Jevnik in bpo-22189.)

collections.abc

Sequence.index() メソッドが tuple や list などの対応するメソッドと同様に、start と stop 引数を受け付けるようになりました。 (Contributed by Devin Jeanpierre in bpo-23086.)

新たに Generator 抽象基底クラスが追加されました。 (Contributed by Stefan Behnel in bpo-24018.)

新たに Awaitable, Coroutine, AsyncIterator, AsyncIterable 抽象基底クラスが追加されました。 (Contributed by Yury Selivanov in bpo-24184.)

以前の Python バージョン向けには、新しい ABC のバックポートが外部の PyPI パッケージ として提供されています。

compileall

compileall の新しいオプション -j N を使うと、N 個のワーカーを同時に動かしてバイトコードを並列にコンパイルできます。 compile_dir() 関数には対応する workers パラメータがあります。 (Contributed by Claudiu Popa in bpo-16104.)

もう一つの新しいオプション -r は、サブディレクトリを再帰的に処理する深さの上限を制御します。 (Contributed by Claudiu Popa in bpo-19628.)

コマンドラインオプション -q を複数回指定できるようになりました。 この場合、エラーも含めたすべての出力を抑制します。 compile_dir()、compile_file()、compile_path() の対応する quiet パラメータにも、出力抑制のレベルを示す整数値を指定できます。 (Contributed by Thomas Kluyver in bpo-21338.)

concurrent.futures

Executor.map() メソッドに chunksize 引数が追加されました。 タスクをまとめて処理することで、ProcessPoolExecutor() 使用時の性能を向上できます。 (Contributed by Dan O'Reilly in bpo-11271.)

ThreadPoolExecutor のコンストラクタでワーカー数を省略できるようになりました。 デフォルト値は CPU 数の 5 倍です。 (Contributed by Claudiu Popa in bpo-21527.)

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']

(Contributed by Łukasz Langa in bpo-18159.)

contextlib

新規 context manager の contextlib.redirect_stderr() は、ユーティリティスクリプトにて、その出力を sys.stderr に書き出す一方でその向き先を変えれない頑固な API の扱いを簡単にしてくれます (redirect_stdout() と対となるものです)。:

>>> import contextlib, io, logging
>>> f = io.StringIO()
>>> with contextlib.redirect_stderr(f):
...     logging.warning('warning')
...
>>> f.getvalue()
'WARNING:root:warning\n'

(Contributed by Berker Peksag in bpo-22389.)

csv

writerow() メソッドは、シーケンスだけでなく、 任意のイテラブルをサポートしました。(Contributed by Serhiy Storchaka in bpo-23171.)

curses

新しい update_lines_cols() 関数は、モジュール変数 LINES と COLS を更新します。 画面サイズが手動で変更されたことを検出するのに役立ちます。 (Contributed by Arnon Yaari in bpo-4254.)

dbm

dumb.open は、フラグの値が "n" の場合に常に新しいデータベースを作成するようになりました。 (Contributed by Claudiu Popa in bpo-18039.)

difflib

HtmlDiff.make_file() が生成する HTML 文書の文字集合を、新しいキーワード専用引数 charset で変更できるようになりました。 HTML 文書のデフォルトの文字集合も "ISO-8859-1" から "utf-8" に変更されました。 (Contributed by Berker Peksag in bpo-2052.)

diff_bytes() 関数でバイト文字列のリストを比較できるようになりました。 これは Python 2 からのリグレッションの修正です。 (Contributed by Terry J. Reedy and Greg Ward in bpo-17445.)

distutils

build と build_ext の両コマンドに -j オプションが追加され、拡張モジュールを並列にビルドできるようになりました。 (Contributed by Antoine Pitrou in bpo-5309.)

distutils モジュールが xz 圧縮に対応しました。 bdist --format の引数に xztar を渡すと有効になります。 (Contributed by Serhiy Storchaka in bpo-16314.)

doctest

DocTestSuite() 関数が、 module がドキュメンテーション文字列(docstrings)を含まない場合に ValueError を送出するのではなく空の unittest.TestSuite を返すようになりました。 (Contributed by Glenn Jones in bpo-15916.)

email

新しいポリシーオプション Policy.mangle_from_ は、メール本文で "From " から始まる行の先頭にジェネレータが ">" を付けるかどうかを制御します。 デフォルトは compat32 では True、それ以外のすべてのポリシーでは False です。 (Contributed by Milan Oberkirch in bpo-20098.)

新しい Message.get_content_disposition() メソッドで、Content-Disposition ヘッダーの正規化された値を簡単に取得できます。 (Contributed by Abhilash Raj in bpo-21083.)

新しいポリシーオプション EmailPolicy.utf8 を True に設定すると、メールヘッダーを encoded-word ではなく UTF-8 文字集合でエンコードできます。 これにより Messages を RFC 6532 に従って書式化し、RFC 6531 の SMTPUTF8 拡張をサポートする SMTP サーバーで使えます。 (Contributed by R. David Murray in bpo-24211.)

mime.text.MIMEText のコンストラクタが charset.Charset インスタンスを受け付けるようになりました。 (Contributed by Claude Paroz and Berker Peksag in bpo-16324.)

enum

Enum 呼び出し可能オブジェクトは、names のみが与えられた場合に enum 値の初期値を指定する新たな引数 start を持ちます:

>>> Animal = enum.Enum('Animal', 'cat dog', start=10)
>>> Animal.cat
<Animal.cat: 10>
>>> Animal.dog
<Animal.dog: 11>

(Contributed by Ethan Furman in bpo-21706.)

faulthandler

関数 enable(), register(), dump_traceback(), dump_traceback_later() が、ファイル様オブジェクトだけでなくファイル記述子を受け取るようになりました。 (Contributed by Wei Wu in bpo-23566.)

functools

@lru_cache 機構の多くが C で実装されました。 これにより速度が大幅に向上しました。 (Contributed by Matt Joiner, Alexey Kachayev, and Serhiy Storchaka in bpo-14373.)

glob

iglob() 関数と glob() 関数は、 "**" パターンを使ったサブディレクトリの再帰的な検索をサポートしました。(Contributed by Serhiy Storchaka in bpo-13968.)

gzip

GzipFile コンストラクタの mode 引数が排他的作成を要求する "x" を受け取るようになりました。 (Contributed by Tim Heaney in bpo-19222.)

heapq

merge() で、省略可能な新しいキーワード引数 key に キー関数 を渡すと要素の比較をカスタマイズできるようになりました。 また、省略可能な新しいキーワード引数 reverse を使うと比較の順序を逆にできます。

>>> 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']

(Contributed by Raymond Hettinger in bpo-13742.)

http

新しい HTTPStatus のenum は、HTTPステータスコードのセットで、その理由句と詳細な説明は、英語で記載されています。(Contributed by Demian Brecht in bpo-21793.)

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

(Contributed by Martin Panter in bpo-3566.)

idlelib と IDLE

idlelib は IDLE シェルとエディタを実装するものであってほかのプログラムからインポートされることを意図してはいないので、改善は毎度のリリースごとに行われます。3.4.0 から始まり、また将来の 3.5.x リリースになされる累積的な変更リストは Lib/idlelib/NEWS.txt で読むことが出来ます。このファイルは IDLE で Help ‣ About IDLE からも辿り着けます。

imaplib

IMAP4 クラスが context manager プロトコルをサポートするようになりました。 with 文とともに使うと、 IMAP4 LOGOUT コマンドがブロックの終了時に自動的に呼び出されます。 (Contributed by Tarek Ziadé and Serhiy Storchaka in bpo-4972.)

imaplib モジュールが IMAP4.enable() メソッドを通じて RFC 5161 (ENABLE 拡張) と RFC 6855 (UTF-8 サポート) に対応しました。 新しい IMAP4.utf8_enabled 属性は RFC 6855 のサポートが有効かどうかを示します。 (Contributed by Milan Oberkirch, R. David Murray, and Maciej Szulik in bpo-21800.)

imaplib モジュールは RFC の推奨に従い、非 ASCII 文字を含むユーザー名とパスワードを自動的に UTF-8 でエンコードするようになりました。 (Contributed by Milan Oberkirch in bpo-21800.)

imghdr

what() 関数が OpenEXR 形式 (Martin Vignali と Claudiu Popa による貢献、bpo-20295) と WebP 形式 (Fabrice Aneche と Claudiu Popa による貢献、bpo-20197) を認識するようになりました。

importlib

util.LazyLoader クラスは、起動時間が重要なアプリケーションでモジュールの遅延読み込みを可能にします。 (Contributed by Brett Cannon in bpo-17621.)

abc.InspectLoader.source_to_code() メソッドが静的メソッドになりました。 これにより exec(code, module.__dict__) を実行し、文字列からコンパイルしたコードでモジュールオブジェクトを簡単に初期化できます。 (Contributed by Brett Cannon in bpo-21156.)

新しいモジュールを作成するには、新しい util.module_from_spec() 関数を使うことが推奨されます。 types.ModuleType インスタンスを直接作成する場合と異なり、渡された spec オブジェクトに基づいてインポート機構が管理する各属性を設定します。 (Contributed by Brett Cannon in bpo-20383.)

inspect

Signature と Parameter の両クラスが pickle 化可能かつハッシュ可能になりました。 (Contributed by Yury Selivanov in bpo-20726 and bpo-20334.)

新しい 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', ())])

(Contributed by Yury Selivanov in bpo-24190.)

新しいクラスメソッド Signature.from_callable() により、Signature のサブクラスを作成しやすくなりました。 (Contributed by Yury Selivanov and Eric Snow in bpo-17373.)

signature() 関数に省略可能なキーワード引数 follow_wrapped が追加されました。 False にすると __wrapped__ リンクを自動的にたどらなくなります。 (Contributed by Yury Selivanov in bpo-20691.)

コルーチン関数 と コルーチンオブジェクト を調べる新しい関数 iscoroutine()、iscoroutinefunction()、isawaitable()、getcoroutinelocals()、getcoroutinestate() が追加されました。 (Contributed by Yury Selivanov in bpo-24017 and bpo-24400.)

stack()、trace()、getouterframes()、getinnerframes() 関数が名前付きタプルのリストを返すようになりました。 (Contributed by Daniel Shahaf in bpo-16808.)

io

新しい BufferedIOBase.readinto1() メソッドは、下位の raw ストリームの RawIOBase.read() または RawIOBase.readinto() メソッドを最大 1 回呼び出します。 (Contributed by Nikolaus Rath in bpo-20578.)

ipaddress

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')

(Contributed by Peter Moody and Antoine Pitrou in bpo-16531.)

IPv4Address と IPv6Address クラスの新しい reverse_pointer 属性は、DNS 逆引きの PTR レコード名を返します。

>>> 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'

(Contributed by Leon Weber in bpo-20480.)

json

json.tool のコマンドラインインターフェースが、入力された JSON オブジェクトのキーの順序を保持するようになりました。 新しい --sort-keys オプションでキーをアルファベット順に並べ替えられます。 (Contributed by Berker Peksag in bpo-21650.)

JSON デコーダーが ValueError の代わりに JSONDecodeError を送出し、エラーの発生箇所について詳しい情報を提供するようになりました。 (Contributed by Serhiy Storchaka in bpo-19361.)

linecache

新しい lazycache() 関数は、ファイルに基づかないモジュールの情報を保存し、後で getline() を使って行を取得できるようにします。 モジュールのグローバル変数をいつまでも保持することなく、実際に行が必要になるまで I/O を行わずに済みます。 (Contributed by Robert Collins in bpo-17911.)

locale

新しい 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'

(Contributed by Cédric Krier in bpo-13918.)

logging

すべてのログ記録メソッド (Logger の log()、exception()、critical()、debug() など) が、exc_info 引数にブール値や例外のタプルだけでなく、例外インスタンスも受け付けるようになりました。

>>> import logging
>>> try:
...     1/0
... except ZeroDivisionError as ex:
...     logging.error('exception', exc_info=ex)
ERROR:root:exception

(Contributed by Yury Selivanov in bpo-20537.)

handlers.HTTPHandler クラスに、省略可能な ssl.SSLContext インスタンスを渡して HTTP 接続の SSL 設定を指定できるようになりました。 (Contributed by Alex Gaynor in bpo-22788.)

handlers.QueueListener クラスに respect_handler_level キーワード引数が追加されました。 True にするとハンドラーのレベルを考慮してメッセージを渡します。 (Contributed by Vinay Sajip.)

lzma

LZMADecompressor.decompress() メソッドに、省略可能な引数 max_length で展開データの最大サイズを指定できるようになりました。 (Contributed by Martin Panter in bpo-15955.)

math

math モジュールに定数 inf および nan が追加されました。 (Contributed by Mark Dickinson in bpo-23185.)

新たな関数 isclose() は近似的に等しいことを調べる方法を提供します。 (Contributed by Chris Barker and Tal Einat in bpo-24270.)

新たに関数 gcd() が追加されました。 関数 fractions.gcd() は非推奨です。 (Contributed by Mark Dickinson and Serhiy Storchaka in bpo-22486.)

multiprocessing

sharedctypes.synchronized() オブジェクトが コンテキストマネージャ プロトコルをサポートするようになりました。 (Contributed by Charles-François Natali in bpo-21565.)

operator

attrgetter()、itemgetter()、methodcaller() オブジェクトが pickle 化に対応しました。 (Contributed by Josh Rosenberg and Serhiy Storchaka in bpo-22955.)

行列乗算を行う matmul() 関数と imatmul() 関数が新しく追加されました。 (Contributed by Benjamin Peterson in bpo-21176.)

os

DirEntry オブジェクトのイテレータを返す scandir() 関数が追加されました。 scandir() は、可能であればディレクトリの走査時にファイル属性を取得します。 その後でファイルの種類や属性を調べるシステムコールが不要になるため、性能が大幅に向上する可能性があります。 (Contributed by Ben Hoyt with the help of Victor Stinner in bpo-22524.)

Windows において、新たに stat_result.st_file_attributes 属性が利用可能です。これは Windows API の GetFileInformationByHandle() から返る BY_HANDLE_FILE_INFORMATION 構造体のメンバ dwFileAttributes に対応します。 (Contributed by Ben Hoyt in bpo-21719.)

urandom() 関数が、Linux 3.17 以降ではシステムコール getrandom() を、OpenBSD 5.6 以降ではシステムコール getentropy() を使うようになりました。これは /dev/urandom を使う必要性をなくし、潜在的には起こり得たファイル記述子を使い果たすことによる失敗を避けることに繋がります。 (Contributed by Victor Stinner in bpo-22181.)

新たな関数 get_blocking() および set_blocking() により、ファイル記述子のブロッキングモード (O_NONBLOCK) の取得と設定が出来るようになりました。 (Contributed by Victor Stinner in bpo-22054.)

truncate() と ftruncate() が Windows でサポートされるようになりました。 (Contributed by Steve Dower in bpo-23668.)

渡された各パス名に共通する最長のサブパスを返す 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'

(Contributed by Rafik Draoui and Serhiy Storchaka in bpo-10395.)

pathlib

新しい Path.samefile() メソッドを使うと、パスが別のパスと同じファイルを指すか確認できます。 比較対象のパスには別の Path オブジェクトまたは文字列を指定できます。

>>> import pathlib
>>> p1 = pathlib.Path('/etc/hosts')
>>> p2 = pathlib.Path('/etc/../etc/hosts')
>>> p1.samefile(p2)
True

(Contributed by Vajrasky Kok and Antoine Pitrou in bpo-19775.)

Path.mkdir() メソッドに、省略可能な引数 exist_ok が追加され、mkdir -p や os.makedirs() と同様の機能を使えるようになりました。 (Contributed by Berker Peksag in bpo-21539.)

~ と ~user のプレフィックスを展開する Path.expanduser() メソッドが追加されました。 (Contributed by Serhiy Storchaka and Claudiu Popa in bpo-19776.)

新しいクラスメソッド Path.home() を使うと、ユーザーのホームディレクトリを表す Path インスタンスを取得できます。 (Contributed by Victor Salgado and Mayank Tripathi in bpo-19777.)

ファイルの読み書きを簡単にする 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

(Contributed by Christopher Welborn in bpo-20218.)

pickle

非束縛メソッドや入れ子のクラスなど、入れ子のオブジェクトをバージョン 4 より古い pickle プロトコル でも pickle 化できるようになりました。 プロトコルのバージョン 4 は、これらにすでに対応しています。 (Contributed by Serhiy Storchaka in bpo-23611.)

poplib

新しい POP3.utf8() コマンドは、POP サーバーが対応していれば RFC 6856 (電子メールの国際化) のサポートを有効にします。 (Contributed by Milan OberKirch in bpo-21804.)

re

後読みアサーションで、固定長のグループへの参照や条件付き参照を使えるようになりました。

>>> 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'>

(Contributed by Serhiy Storchaka in bpo-9179.)

正規表現のキャプチャグループ数の上限が 100 個ではなくなりました。 (Contributed by Serhiy Storchaka in bpo-22437.)

sub() と subn() 関数は、マッチしなかったグループについて例外を送出せず、空文字列で置き換えるようになりました。 (Contributed by Serhiy Storchaka in bpo-1519638.)

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)

(Contributed by Serhiy Storchaka in bpo-22578.)

readline

新しい append_history_file() 関数で、履歴の末尾から指定個数の要素を指定のファイルに追記できます。 (Contributed by Bruno Cauet in bpo-22940.)

selectors

新しい DevpollSelector は、Solaris で /dev/poll による効率的なポーリングをサポートします。 (Contributed by Giampaolo Rodola' in bpo-18931.)

shutil

move() 関数に copy_function 引数が追加されました。 例えば移動時にファイルのメタデータを無視する必要がある場合、デフォルトの copy2() の代わりに copy() を使えます。 (Contributed by Claudiu Popa in bpo-19840.)

make_archive() 関数が xztar 形式に対応しました。 (Contributed by Serhiy Storchaka in bpo-5411.)

signal

Windows において、 set_wakeup_fd() 関数がソケットハンドルもサポートするようになりました。 (Contributed by Victor Stinner in bpo-22018.)

signal モジュールの各種 SIG* 定数が 列挙型 に変換されました。 これにより、デバッグ時に整数の「マジックナンバー」ではなく、意味のある名前を表示できます。 (Contributed by Giampaolo Rodola' in bpo-21076.)

smtpd

SMTPServer と SMTPChannel の両クラスに decode_data キーワード引数が追加されました。 SMTP トランザクションの DATA 部分を "utf-8" コーデックでデコードするか、それともバイト文字列のまま SMTPServer.process_message() メソッドに渡すかを指定します。 後方互換性のためデフォルトは True ですが、Python 3.6 では False に変更されます。 decode_data が False の場合、process_message メソッドはキーワード引数を受け付ける必要があります。 (Contributed by Maciej Szulik in bpo-19662.)

The SMTPServer class now advertises the 8BITMIME extension (RFC 6152) if decode_data has been set True. If the client specifies BODY=8BITMIME on the MAIL command, it is passed to SMTPServer.process_message() via the mail_options keyword. (Contributed by Milan Oberkirch and R. David Murray in bpo-21795.)

SMTPServer クラスが SMTPUTF8 拡張 (RFC 6531: 電子メールの国際化) にも対応しました。 クライアントが MAIL コマンドに SMTPUTF8 BODY=8BITMIME を指定すると、mail_options キーワードを通じて SMTPServer.process_message() に渡されます。 SMTPUTF8 データを適切に処理するのは process_message メソッドの責任です。 (Contributed by Milan Oberkirch in bpo-21725.)

SMTPServer のコンストラクタに、直接または名前解決によって IPv6 アドレスを指定し、正しく接続できるようになりました。 (Contributed by Milan Oberkirch in bpo-14758.)

smtplib

新しい SMTP.auth() メソッドを使うと、独自の認証機構を簡単に実装できます。 (Contributed by Milan Oberkirch in bpo-15014.)

SMTP.set_debuglevel() メソッドに新しいデバッグレベル 2 が追加され、デバッグメッセージにタイムスタンプを付けられるようになりました。 (Contributed by Gavin Chappell and Maciej Szulik in bpo-16914.)

SMTP.sendmail() と SMTP.send_message() の両メソッドが RFC 6531 (SMTPUTF8) に対応しました。 (Contributed by Milan Oberkirch and R. David Murray in bpo-22027.)

sndhdr

what() と whathdr() 関数が namedtuple() を返すようになりました。 (Contributed by Claudiu Popa in bpo-18615.)

socket

タイムアウトを持つ関数がシステムクロックではなく単調増加クロックを使うようになりました。 (Contributed by Victor Stinner in bpo-22043.)

新しい socket.sendfile() メソッドを使うと、UNIX では高速な os.sendfile() 関数を使ってソケット経由でファイルを送信できます。 単に socket.send() を使う場合に比べ、アップロードが 2〜3 倍高速になります。 (Contributed by Giampaolo Rodola' in bpo-17552.)

socket.sendall() メソッドは、バイトの送受信のたびにソケットのタイムアウトをリセットしなくなりました。 ソケットのタイムアウトは、すべてのデータを送信するのにかかる合計時間の上限になります。 (Contributed by Victor Stinner in bpo-23853.)

socket.listen() メソッドの backlog 引数が省略可能になりました。 デフォルトは SOMAXCONN と 128 の小さい方です。 (Contributed by Charles-François Natali in bpo-21455.)

ssl

メモリ BIO サポート

(Contributed by Geert Jansen in bpo-21965.)

SSLSocket のネットワーク I/O 機能が不要または最適でない場合に SSL プロトコルを扱うため、SSLObject クラスが追加されました。 SSLObject は SSL プロトコルのインスタンスを表しますが、ネットワーク I/O メソッドは実装せず、代わりにメモリバッファのインターフェースを提供します。 新しい MemoryBIO クラスを使うと、Python と SSL プロトコルのインスタンスの間でデータを受け渡せます。

メモリ BIO による SSL サポートは、主に非同期 I/O を実装するフレームワーク向けです。 そのような場面では SSLSocket の準備完了通知モデル ("select/poll") は効率がよくありません。

新しい SSLContext.wrap_bio() メソッドで SSLObject インスタンスを作成できます。

Application-Layer Protocol Negotiation のサポート

(Contributed by Benjamin Peterson in bpo-20188.)

OpenSSL が対応している環境では、ssl モジュールが RFC 7301 の Application-Layer Protocol Negotiation TLS 拡張を実装するようになりました。

新しい SSLContext.set_alpn_protocols() を使うと、TLS ハンドシェイク時にソケットが通知するプロトコルを指定できます。

新しい SSLSocket.selected_alpn_protocol() は、TLS ハンドシェイク時に選択されたプロトコルを返します。 HAS_ALPN フラグは ALPN をサポートしているかどうかを示します。

その他の変更

実際に使用中のプロトコルのバージョンを調べる SSLSocket.version() メソッドが追加されました。 (Contributed by Antoine Pitrou in bpo-20421.)

SSLSocket クラスに SSLSocket.sendfile() メソッドが実装されました。 (Contributed by Giampaolo Rodola' in bpo-17552.)

SSLSocket.send() メソッドは、非ブロッキングソケットで操作がブロックする場合に ssl.SSLWantReadError または ssl.SSLWantWriteError を送出するようになりました。 以前は 0 を返していました。 (Contributed by Nikolaus Rath in bpo-20951.)

RFC 5280 に基づき、 cert_time_to_seconds() 関数が入力の時刻をローカル時刻ではなく UTC として解釈するようになりました。 また、戻り値は常に int となります。 (Contributed by Akira Li in bpo-19940.)

新しい SSLObject.shared_ciphers() と SSLSocket.shared_ciphers() メソッドは、ハンドシェイク時にクライアントが送信した暗号方式のリストを返します。 (Contributed by Benjamin Peterson in bpo-23186.)

SSLSocket クラスの SSLSocket.do_handshake()、SSLSocket.read()、SSLSocket.shutdown()、SSLSocket.write() メソッドは、バイトの送受信のたびにソケットのタイムアウトをリセットしなくなりました。 ソケットのタイムアウトはメソッド全体にかかる時間の上限になります。 (Contributed by Victor Stinner in bpo-23853.)

match_hostname() 関数が IP アドレスの照合に対応しました。 (Contributed by Antoine Pitrou in bpo-23239.)

sqlite3

Row クラスがシーケンスプロトコルに完全に対応し、特に reversed() による逆順の反復処理やスライスによるインデックス指定が可能になりました。 (Contributed by Claudiu Popa in bpo-10203; by Lucas Sinclair, Jessica McKellar, and Serhiy Storchaka in bpo-13583.)

subprocess

新たに run() 関数が追加されました。 これは指定されたコマンドを実行し CompletedProcess オブジェクトを返します。 オブジェクトは終了したプロセスを記述します。 新たな API はより一貫的で、古いバージョンとの互換性を必要としない Python コードでサブプロセスを起動するのに推奨される方法です。 (Contributed by Thomas Kluyver in bpo-23342.)

例:

>>> subprocess.run(["ls", "-l"])  # 出力をキャプチャしない
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() で、現在設定されているラッパーを取得できます。 両関数は 暫定的 で、デバッグ目的専用です。 (Contributed by Yury Selivanov in bpo-24017.)

新しい is_finalizing() 関数で、Python インタープリタが 終了処理中 かどうかを確認できます。 (Contributed by Antoine Pitrou in bpo-22696.)

sysconfig

Windows のユーザースクリプト用ディレクトリの名前に、Python バージョンの先頭 2 要素が含まれるようになりました。 (Contributed by Paul Moore in bpo-23437.)

tarfile

open() 関数の mode 引数が排他的作成を要求する "x" を受け取るようになりました。 (Contributed by Berker Peksag in bpo-21717.)

TarFile.extractall() と TarFile.extract() メソッドに numeric_owner キーワード引数が追加されました。 True の場合、展開したファイルやディレクトリの所有者は tar ファイルの数値の uid と gid に設定されます。 False の場合 (デフォルトであり、3.5 より前のバージョンの動作)、tar ファイルのユーザー名とグループ名に基づいて設定されます。 (Contributed by Michael Vogt and Eric Smith in bpo-23193.)

TarFile.list() に省略可能な members キーワード引数が追加され、TarFile.getmembers() が返すリストの一部を指定できるようになりました。 (Contributed by Serhiy Storchaka in bpo-21549.)

threading

Lock.acquire() と RLock.acquire() の両メソッドがタイムアウトの管理に単調時計を使用するようになりました。 (Contributed by Victor Stinner in bpo-22043.)

time

monotonic() 関数が常に利用出来るようになりました。 (Contributed by Victor Stinner in bpo-22043.)

timeit

新たなコマンドラインオプション -u 又は --unit=U を使用してタイマーの出力の単位を指定できます。 サポートされたオプションは usec, msec, sec です。 (Contributed by Julian Gindi in bpo-18983.)

timeit() 関数に引数 globals が追加されました。 これによりコードが実行される名前空間を指定します。 (Contributed by Ben Roberts in bpo-2527.)

tkinter

Windows の Tcl/Tk 環境を設定する tkinter._fix モジュールが、_tkinter モジュールの非公開関数に置き換えられました。 この関数は環境変数を永続的には変更しません。 (Contributed by Zachary Ware in bpo-20035.)

traceback

フレームと トレースバックオブジェクト を簡単にたどる walk_stack() と walk_tb() 関数が追加されました。 (Contributed by Robert Collins in bpo-17911.)

軽量なクラス TracebackException、StackSummary、FrameSummary が追加されました。 (Contributed by Robert Collins in bpo-17911.)

print_tb() と print_stack() の両関数で、limit 引数に負の値を指定できるようになりました。 (Contributed by Dmitry Kazakov in bpo-22619.)

types

新たに coroutine() 関数が追加されました。 ジェネレータ と ジェネレータ様 オブジェクトを awaitable に変換します。 (Contributed by Yury Selivanov in bpo-24017.)

新たに型 CoroutineType が追加されました。 async def 関数で作られた coroutine オブジェクトに使われます。 (Contributed by Yury Selivanov in bpo-24400.)

unicodedata

unicodedata モジュールが Unicode 8.0.0 のデータを使うようになりました。

unittest

TestLoader.loadTestsFromModule() メソッドにキーワード専用引数 pattern が追加され、load_tests の第 3 引数に渡されるようになりました。 パッケージ名はデフォルトのパターンにマッチしないため、見つかったパッケージではパスが pattern にマッチするかどうかにかかわらず load_tests を確認するようになりました。 (Contributed by Robert Collins and Barry A. Warsaw in bpo-16662.)

unittest のテスト探索時のエラーが TestLoader インスタンスの TestLoader.errors 属性に公開されるようになりました。 (Contributed by Robert Collins in bpo-19746.)

新しいコマンドラインオプション --locals で、トレースバックにローカル変数を表示できます。 (Contributed by Robert Collins in bpo-22936.)

unittest.mock

Mock クラスは、次の改善が行われました。

  • クラスのコンストラクタに unsafe パラメータが追加されました。 これにより、モックオブジェクトは "assert" で始まる属性名に対して AttributeError を送出します。 (Contributed by Kushal Das in bpo-21238.)

  • 新しい Mock.assert_not_called() メソッドで、モックオブジェクトが呼び出されていないことを確認できます。 (Contributed by Kushal Das in bpo-21262.)

MagicMock クラスが __truediv__()、__divmod__()、__matmul__() 演算子に対応しました。 (Contributed by Johannes Baiter in bpo-20968, and Håkan Lövdahl in bpo-23581 and bpo-23568.)

組み込み名にパッチを当てる場合、patch() 関数に create=True を明示的に渡す必要がなくなりました。 (Contributed by Kushal Das in bpo-17660.)

urllib

新しい request.HTTPPasswordMgrWithPriorAuth クラスを使うと、HTTP Basic 認証の認証情報を管理して不要な 401 応答の処理を省けます。 また Authorization ヘッダーを送らないと 401 ではなく 404 を返すサーバーと通信するために、最初のリクエストで無条件に認証情報を送信することもできます。 (Contributed by Matej Cepl in bpo-19494 and Akshit Khurana in bpo-7159.)

parse.urlencode() 関数の新しい quote_via 引数で、必要に応じてクエリ部分のエンコード方法を制御できます。 (Contributed by Samwyse and Arnon Yaari in bpo-13866.)

request.urlopen() 関数の context 引数に ssl.SSLContext オブジェクトを指定できるようになり、HTTPS 接続で使われます。 (Contributed by Alex Gaynor in bpo-22366.)

parse.urljoin() は、相対 URL の解決に RFC 1808 や RFC 2396 ではなく RFC 3986 の規則を使うように更新されました。 (Contributed by Demian Brecht and Senthil Kumaran in bpo-22118.)

wsgiref

headers.Headers クラスのコンストラクタの headers 引数が省略可能になりました。 (Contributed by Pablo Torres Navarrete and SilentGhost in bpo-5800.)

xmlrpc

client.ServerProxy クラスが コンテキストマネージャ プロトコルをサポートするようになりました。 (Contributed by Claudiu Popa in bpo-20627.)

client.ServerProxy コンストラクタは任意の ssl.SSLContext インスタンスを受け取るようになりました。 (Contributed by Alex Gaynor in bpo-22960.)

xml.sax

SAX パーサは xmlreader.InputSource オブジェクトの文字ストリームをサポートしました。 (Contributed by Serhiy Storchaka in bpo-2175.)

parseString() が str インスタンスを受け取るようになりました。 (Contributed by Serhiy Storchaka in bpo-10590.)

zipfile

シークできないストリームにも ZIP を書き出せるようになりました。 (Contributed by Serhiy Storchaka in bpo-23252.)

ZipFile.open() メソッドの mode 引数が排他的作成を要求する "x" を受け取るようになりました。 (Contributed by Serhiy Storchaka in bpo-21717.)

その他のモジュールレベルの変更

モジュール mmap, ossaudiodev, socket, ssl, codecs 内の多くの関数が、書き込み可能な bytes 様オブジェクト を受け付けるようになりました。 (Contributed by Serhiy Storchaka in bpo-23001.)

最適化

os.walk() 関数が POSIX システムで 3〜5 倍、Windows で 7〜20 倍高速になりました。 これは新しい os.scandir() 関数を使うことで実現しました。 この関数は、下位の readdir または FindFirstFile/FindNextFile システムコールから得られるファイル情報を公開します。 (Contributed by Ben Hoyt with help from Victor Stinner in bpo-23605.)

ゼロバイトで埋められる bytes(int) の作成が高速になり、大きなオブジェクトではメモリ使用量も減りました。 これらのオブジェクトのメモリ割り当てに malloc() ではなく calloc() を使うようになりました。 (Contributed by Victor Stinner in bpo-21233.)

ipaddress の IPv4Network と IPv6Network に対する一部の操作が大幅に高速化されました。 例えば subnets()、supernet()、summarize_address_range()、collapse_addresses() です。 速度の向上は 3〜15 倍に及びます。 (Contributed by Antoine Pitrou, Michel Albert, and Markus in bpo-21486, bpo-21487, bpo-20826, bpo-23266.)

ipaddress オブジェクトの pickle 化が最適化され、出力が大幅に小さくなりました。 (Contributed by Serhiy Storchaka in bpo-23133.)

io.BytesIO の多くの操作が 50% から 100% 速くなりました。 (Contributed by Serhiy Storchaka in bpo-15381 and David Wilson in bpo-22003.)

marshal.dumps() 関数が高速化されました。 典型的なデータではバージョン 3 と 4 で 65〜85%、バージョン 0〜2 で 20〜25% 高速になり、最も効果的な場合は最大 5 倍になります。 (Contributed by Serhiy Storchaka in bpo-20416 and bpo-23344.)

UTF-32 エンコーダが 3 から 7 倍速くなりました。 (Contributed by Serhiy Storchaka in bpo-15027.)

正規表現のパースが最高で 10% 速くなりました。 (Contributed by Serhiy Storchaka in bpo-19380.)

json.dumps() 関数が最適化され、ensure_ascii=False の場合も ensure_ascii=True と同じ速さで実行できるようになりました。 (Contributed by Naoki Inada in bpo-23206.)

PyObject_IsInstance() と PyObject_IsSubclass() 関数が、第 2 引数のメタクラスが type である一般的な場合に高速化されました。 (Georg Brandl による貢献、bpo-22540。)

メソッドのキャッシュが少し改良されました。ベンチマークによっては性能が最高で 5% 向上しました。 (Contributed by Antoine Pitrou in bpo-22847.)

random モジュールのオブジェクトのメモリ使用量が 64-bit ビルドで 50% 減少しました。 (Contributed by Serhiy Storchaka in bpo-23488.)

@property ゲッタの呼び出しが最高で 25% 速くなりました。 (Contributed by Joe Jevnik in bpo-23910.)

fractions.Fraction のインスタンス化が最高で 30% 速くなりました。 (Contributed by Stefan Behnel in bpo-22464.)

文字列メソッド find()、rfind()、split()、partition() と文字列の in 演算子が、1 文字の部分文字列の検索で大幅に高速化されました。 (Contributed by Serhiy Storchaka in bpo-23573.)

ビルドならびに C API の変更

新たな calloc 関数が追加されました:

(Contributed by Victor Stinner in bpo-21233.)

新たなエンコーディング/デコーディングヘルパ関数:

(Contributed by Victor Stinner in bpo-18395.)

Unicode のエンコードエラーを \N{...} エスケープに置き換える PyCodec_NameReplaceErrors() 関数が追加されました。 (Contributed by Serhiy Storchaka in bpo-19676.)

PyErr_Format() と同様の機能を持ち、va_list 引数を受け付ける PyErr_FormatV() 関数が追加されました。 (Contributed by Antoine Pitrou in bpo-18711.)

PyExc_RecursionError 例外が追加されました。 (Contributed by Georg Brandl in bpo-19235.)

PEP 489 の拡張モジュールの複数フェーズ初期化により、PyModule_FromDefAndSpec()、PyModule_FromDefAndSpec2()、PyModule_ExecDef() 関数が追加されました。 (Contributed by Petr Viktorin in bpo-24268.)

行列乗算を行う PyNumber_MatrixMultiply() と PyNumber_InPlaceMatrixMultiply() 関数が追加されました。 (Benjamin Peterson による貢献、bpo-21176。詳しくは PEP 465 も参照してください。)

PyTypeObject.tp_finalize スロットが安定 ABI の一部になりました。

Windows のビルドには Microsoft Visual C++ 14.0 が必要になりました。 これは Visual Studio 2015 の一部として入手できます。

いくつかのプラットフォームにおいて、拡張モジュールのファイル名にプラットフォームについての情報をタグとして含むようになりました (タグはオプショナルであり、CPython は、タグが含まれていて実行しようとしているプラットフォームとミスマッチな場合にその拡張をロードしようとしない一方で、拡張をそれが含まれていなくてもインポートします):

  • Linux では拡張モジュールのファイル名は .cpython-<major><minor>m-<architecture>-<os>.pyd で終わります:

    • <major> は Python バージョンのメジャー番号です。Python 3.5 では 3 です。

    • <minor> は Python バージョンのマイナー番号です。Python 3.5 では 5 です。

    • <architecture> は拡張モジュールがどのハードウェアアーキテクチャ向けに動作するようビルドされたのかを表します。32-bit Intel プラットフォーム向けの i386 か 64-bit Intel (及び AMD) プラットフォーム向けの x86_64 がもっとも一般的です。

    • <os> は原則として linux-gnu ですが、64-bit プラットフォームにおいて 32-bit ABI で動作するようビルドされた拡張モジュールの場合は linux-gnu32 になります (この場合 <architecture> は 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 Itanium 64 用の win_ia64 , Windows on ARM 用の win_arm のいずれかです。

    • デバッグモードでビルドされた場合は <debug> は _d となり、それ以外の場合はブランクです。

  • OS X プラットフォームでは拡張モジュールのファイル名は -darwin.so で終わります。

  • 他のすべてのプラットフォームでは、拡張モジュールのファイル名は Python 3.4 でのものと同じです。

非推奨

新たなキーワード

async および await を変数、クラス、関数、ならびにモジュールの名前に使用することは推奨されません。 それらは Python 3.5 で PEP 492 により導入され、Python 3.7 で正式にキーワードになります。

非推奨の Python の挙動

ジェネレータ内で StopIteration 例外を送出すると現在は静かな PendingDeprecationWarning が発生します。 これは、Python 3.6 では静かでない非推奨の警告となり、Python 3.7 では RuntimeError を起こします。 詳細は PEP 479: Change StopIteration handling inside generators を参照してください。

サポートされないオペレーティングシステム

Windows XP は Microsoft によって既にサポートされていません。このため PEP 11 により、CPython 3.5 ではこの OS をもはや公式にはサポートしません。

非推奨の Python モジュール、関数、メソッド

formatter モジュールは完全に非推奨になり、Python 3.6 で削除される予定です。

asyncio.async() 関数は ensure_future() により非推奨になりました。

smtpd モジュールは従来、メールメッセージの DATA 部分を常に utf-8 コーデックでデコードしていました。 この動作を SMTPServer の新しい decode_data キーワードで制御できるようになりました。 デフォルト値は True ですが、このデフォルト値は非推奨です。 非推奨の警告を避けるには、decode_data キーワードに適切な値を指定してください。

http.cookies.Morsel オブジェクトの key, value, coded_value に対して直接代入することは非推奨です。 set() メソッドを使うようにしてください。また、 set() のドキュメントされていなかった LegalChars パラメータは非推奨となり、無視されます。

string.Formatter クラスの format() メソッドに対し、キーワード引数 format_string としてフォーマット文字列を渡すことは非推奨となりました。 (Contributed by Serhiy Storchaka in bpo-23671.)

関数 platform.dist() と platform.linux_distribution() が非推奨となりました。 Linux ディストリビューションが自分自身を記述する方法があまりにも多様なため、この機能は外部パッケージに任せることとなりました(訳注: ここでは distro のことを指している)。 (Contributed by Vajrasky Kok and Berker Peksag in bpo-1322.)

inspect.Signature の、以前からドキュメントされていなかったメソッド from_function と from_builtin は非推奨です。新しい Signature.from_callable() を代わりに使ってください。 (Contributed by Yury Selivanov in bpo-24248.)

inspect.getargspec() 関数は非推奨となり、Python 3.6 で削除されることが予定されています。 (See bpo-20438 for details.)

inspect の getfullargspec()、getcallargs()、formatargspec() 関数は非推奨になりました。 代わりに inspect.signature() API を使ってください。 (Contributed by Yury Selivanov in bpo-20438.)

getargvalues() と formatargvalues() 関数は、Python 3.5.0 のリリース時に誤って非推奨と記載されました。

str のパターンとともに re.LOCALE や re.ASCII フラグを使用することは非推奨となりました。 (Contributed by Serhiy Storchaka in bpo-22407.)

'\' と ASCII 文字からなる認識出来ない特殊シーケンスが正規表現内と置き換えパターン内で使われた場合に、非推奨警告を出すようになりました。Python 3.6 では禁止されるようになります。 (Contributed by Serhiy Storchaka in bpo-23622.)

unittest.TestLoader.loadTestsFromModule() メソッドのドキュメントされておらず非公式の use_load_tests デフォルト引数は非推奨となり、無視されます。 (Contributed by Robert Collins and Barry A. Warsaw in bpo-16662.)

削除

API と機能の削除

時代遅れとなり、以前に既に非推奨となった以下の API と機能が削除されました:

  • email パッケージの __version__ 属性は削除されました。email パッケージが標準ライブラリとは別々にリリースされていたのは遥か昔の話であり、ここのところ何回かのリリースにいたっては __version__ 文字列が更新されていませんでした。

  • 3.4 で非推奨となっていた ftplib モジュール内の内部クラス Netrc が削除されました。 (Contributed by Matt Chaput in bpo-6623.)

  • .pyo ファイルのコンセプトは削除されました。

  • 暫定 asyncio モジュールで 3.4.4 で非推奨となった JoinableQueue は削除されました。 (Contributed by A. Jesse Jiryu Davis in bpo-23464.)

Python 3.5 への移植

このセクションでは前述の変更とバグフィックスにより必要となるかもしれないコードの変更を列挙します:

Python の挙動の変更

  • 以前のバージョンの Python で、誤って以下の構文を許容してしまっていました:

    f(1 for x in [1], *args)
    f(1 for x in [1], **kwargs)
    

    Python 3.5 は正しく SyntaxError を投げます。ジェネレータ式は関数への唯一の引数でない場合には、括弧で囲まなければならないのです。(---訳注: 一応。3.5 以前も ff(str(i) for i in range(5), "5") は SyntaxError です。上の例の通り gg(str(i) for i in range(5), *["1", "2"]) や hh(str(i) for i in range(5), **{"k1": "1", "k2": "2"}) が SytaxError ではなかった、という話です。---)

Python API の変更

  • PEP 475: Python シグナルハンドラが例外を送出しなければ、システムコールがシグナルに中断された場合に、 InterruptedError を送出せずにシステムコールを再試行するようになりました。

  • Python 3.5 以前は、 time オブジェクトは UTC で深夜を表すときに偽とみなされていました。 この挙動は分かりにくく、エラーの元となると考えられ、Python 3.5 で削除されました。 全詳細については bpo-13936 を参照してください。

  • ssl.SSLSocket.send() メソッドは、非ブロッキングソケットで操作がブロックする場合に ssl.SSLWantReadError または ssl.SSLWantWriteError を送出するようになりました。 以前は 0 を返していました。 (Contributed by Nikolaus Rath in bpo-20951.)

  • ジェネレータの __name__ 属性の値として、以前は code オブジェクトの名前から取っていましたが、関数名からセットされるようになりました。code の方が所望の場合は gen.gi_code.co_name から取得してください。ジェネレータは新たに __qualname__ 属性も持つようになりました。これはジェネレータの正規名であり、ジェネレータの表現をする際 (repr(gen)) にこれを用いるようになりました。 (Contributed by Victor Stinner in bpo-21205.)

  • 非推奨だった HTMLParser の "strict" モードと引数、HTMLParser.error()、HTMLParserError 例外が削除されました。 (Ezio Melotti による貢献、bpo-15114。) HTMLParser の convert_charrefs 引数のデフォルト値が True になりました。 (Berker Peksag による貢献、bpo-21047。)

  • API の公式な部分とは言えないものの、移植性への考慮のために (つまりテストの修正) に、エラーメッセージの変更に注意を払っておいてください。かつて "'sometype' does not support the buffer protocol" の形だったものが、いまでは "a bytes-like object is required, not 'sometype'" の形になっています。 (Contributed by Ezio Melotti in bpo-16518.)

  • 既に存在していないディレクトリをカレントディレクトリとして指していた場合に、 find_spec() は以前は FileNotFoundError 例外を送出していましたが、そうではなく None を返却するようになりました。この際 sys.path_importer_cache に None を キャッシュはしません 。これは典型的なケースとは違います(訳注: msg231477)。 (bpo-22834)

  • http.client モジュールと http.server モジュールに散らばっていた HTTP ステータスコードと対応するメッセージを、共通の HTTPStatus enum としてまとめ直しました。http.client 、 http.server にあったもとの値も後方互換性のために残してあります。 (Contributed by Demian Brecht in bpo-21793.)

  • インポートローダーが exec_module() を定義する場合は、create_module() も定義する必要があります (現時点では DeprecationWarning が送出され、Python 3.6 ではエラーになります)。 ローダーが importlib.abc.Loader を継承していれば対応は不要です。 そうでなければ、単に None を返す create_module() を定義してください。 (Contributed by Brett Cannon in bpo-23014.)

  • re.split() 関数は常に空のパターンマッチを無視してきました。ですからパターン "x*" はパターン "x+" と同じように動作し、パターン "\b" は決して動作しませんでした。今後は re.split() はパターンが空文字列に合致しうる場合に警告を出します。互換性のためには空文字列とはマッチしえないパターンを使ってください(たとえば "x*" ではなく "x+" を使ってください)。空文字列としかマッチしえないパターン(例えば "\b")はエラーとなります。 (Contributed by Serhiy Storchaka in bpo-22818.)

  • http.cookies.Morsel 辞書風インターフェイスのそれ自身での一貫性を持たせるようにしました: morsel の比較に key と value を考慮するようにし、 copy() は dict を返さずに Morsel インスタンスを返すようにし、 update() は更新する辞書内のいずれかのキーが不正(訳注: RFC 2109 として不正なキーのことで、update 以外のインターフェイスでは変更前も拒絶される)であれば例外を投げるようにしています。加えて、ドキュメントされていない set() の LegalChars パラメータは非推奨となり、また指定しても無視されます。 (Contributed by Demian Brecht in bpo-2211.)

  • PEP 488 により .pyo ファイルが廃止され、.pyc ファイル名に省略可能な opt- タグが導入されました。 importlib.util.cache_from_source() に opt- タグを制御する optimization パラメータが追加され、debug_override パラメータは非推奨になりました。 .pyo ファイルを Python インタープリタのファイル引数に指定することもできなくなったため、単独で配布しても意味がありません (ソースコードなしの配布など)。 なお Python 3.5 ではバイトコードのマジックナンバーが変更されたため、この PEP にかかわらず以前の Python バージョンの .pyo ファイルはすべて無効です。

  • socket モジュールが、linux 3.6 以降で CAN_RAW_FD_FRAMES 定数をエクスポートするようになりました。

  • RFC 5280 に基づき、 ssl.cert_time_to_seconds() 関数が入力の時刻をローカル時刻ではなく UTC として解釈するようになりました。また、戻り値は常に int となります。 (Contributed by Akira Li in bpo-19940.)

  • pygettext.py ツールが POT-Creation-Date ヘッダ内のタイムゾーン形式として、標準の +NNNN 形式を使うようになりました。

  • smtplib モジュールは以前はデバッグ出力のためにモジュールレベルの stderr 変数を使っていましたが、 sys.stderr を使うようになりました。 もしもあなたの(テスト)プログラムが、そのデバッグ出力をキャプチャするためにこのモジュールレベル変数に依存してたのであれば、今後は sys.stderr をキャプチャするようにする必要があります。

  • str.startswith() と str.endswith() メソッドは空文字列を見つけた場合と完全に範囲外のインデクスが渡された場合に True を返すことはしなくなりました。 (Contributed by Serhiy Storchaka in bpo-24284.)

  • inspect.getdoc() 関数が基底クラスから継承したドキュメンテーション文字列を返すようになりました。その継承したドキュメンテーション文字列が相応しいのであれば、もはやそれを繰り返して記述する必要はありません。継承されたそれを抑制するには、空の文字列を記述しなければなりません(もしくは然るべきドキュメンテーションを埋めれば良いです)。この変更は pydoc モジュールと help() 関数の出力に影響します。 (Contributed by Serhiy Storchaka in bpo-15582.)

  • ネストされた functools.partial() 呼び出しは平坦化されるようになりました。以前の振る舞いに依存していたのであれば functools.partial() オブジェクトに属性を追加するか、または functools.partial() をサブクラス化することで出来ます。 (--訳注: 後半が意味がある内容を言ってるようには思えません。「以前の振る舞い」とはおそらく partial オブジェクトの func 属性が functools.partial そのものになることを指していて、「似たことをしたければ partial オブジェクトに別の属性を付ければりゃいんじゃね?」程度の無責任な代替案を言ってるだけのような気がします。そもそも後者の「サブクラス化」は出来ないと思いますし。 --) (Contributed by Alexander Belopolsky in bpo-7830.)

C API の変更

  • 非公開の PyMemoryViewObject 構造体から、文書化されていなかった format メンバーが削除されました。 memoryobject.h の該当部分に依存する拡張はすべて再ビルドが必要です。

  • PyMemAllocator 構造体を PyMemAllocatorEx に改名し、新しい calloc フィールドを追加しました。

  • 参照をリークしていた、文書化されていないマクロ PyObject_REPR() が削除されました。 オブジェクトの repr() を書式化するには、PyUnicode_FromFormat() などの関数で書式指定 %R を使ってください。 (Contributed by Serhiy Storchaka in bpo-22453.)

  • __module__ 属性がないと pickle 化やイントロスペクションが正しく動作しないため、__module__ 属性を持たない組み込み型に対して非推奨の警告が出るようになりました。 将来は AttributeError になります。 (Contributed by Serhiy Storchaka in bpo-20204.)

  • PEP 492 の実装の一環として、PyTypeObject の tp_reserved スロットが tp_as_async スロットに置き換えられました。 新しい型、構造体、関数については コルーチンオブジェクト を参照してください。

Python 3.5.4 の注目すべき変更

新しいビルドターゲット make regen-all

クロスコンパイルを簡単にし、既存の Python がなくても CPython を確実にコンパイルできるようにするため、autotools ベースのビルドシステムは、更新日時に基づいて生成ファイルを暗黙に再コンパイルしなくなりました。

代わりに、必要なときにこれらのファイルを強制的に再生成する make regen-all コマンドが追加されました (例えば、あらかじめ生成されたファイルを使って最初の Python をビルドした後など)。

対象を絞った再生成用ターゲットも定義されています。 詳しくは Makefile.pre.in を参照してください。

(Victor Stinner の貢献による bpo-23404)

Added in version 3.5.4.

ビルドターゲット make touch の削除

生成ファイルの更新日時を変更して暗黙の再生成を要求するために使われていた make touch ビルドターゲットが削除されました。

代わりに新しい make regen-all ターゲットを使ってください。

(Victor Stinner の貢献による bpo-23404)

バージョン 3.5.4 で変更.