What's New In Python 3.6

エディタ:

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

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

参考

PEP 494 - Python 3.6 リリーススケジュール

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

新たな文法機能:

  • PEP 498、フォーマット済み文字列リテラル。

  • PEP 515、数値リテラル内のアンダースコア。

  • PEP 526、変数アノテーションの文法。

  • PEP 525、非同期ジェネレータ。

  • PEP 530: 非同期内包表記

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

CPython の実装の改善:

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

  • asyncio モジュールに新機能が追加され、使いやすさと性能が大幅に改善されました。 多数のバグも修正されています。 Python 3.6 から asyncio モジュールは暫定版ではなくなり、API は安定版とみなされます。

  • パス類オブジェクト をサポートする新しい ファイルシステムパスのプロトコル が実装されました。 パスを扱う標準ライブラリのすべての関数が、このプロトコルに対応するよう更新されました。

  • datetime モジュールで 地域時間の曖昧さ回避 がサポートされました。

  • typing モジュールに数多くの 改善 がなされました。

  • tracemalloc モジュールが大幅に書き直され、改善されたメモリ割り当てエラーの診断プログラムの提供だけでなく、 ResourceWarning の出力メッセージも改善されています。 より詳しいことは PYTHONMALLOC 節 を参照してください。

セキュリティの改善:

  • The new secrets module has been added to simplify the generation of cryptographically strong pseudo-random numbers suitable for managing secrets such as account authentication, tokens, and similar.

  • Linux ではセキュリティを高めるため、システムの urandom エントロピープールが初期化されるまで os.urandom() がブロックするようになりました。 理由については PEP 524 を参照してください。

  • hashlib および ssl モジュールは OpenSSL 1.1.0 をサポートしました。

  • ssl モジュールのデフォルトの設定と機能群が改善されました。

  • hashlib モジュールで BLAKE2, SHA-3, SHAKE ハッシュアルゴリズムと scrypt() キー導出関数がサポートされるようになりました。

Windows の改善:

  • PEP 528 および PEP 529、 Windows のファイルシステムとコンソールのエンコーディングを UTF-8 に変更しました。

  • py.exe ランチャーを対話的に使うときに、 (コマンドライン引数や設定ファイルで) バージョンを指定しないと Python 3 よりも Python 2 を選択するということはなくなりました。 シェバン行の扱いは以前のままで、 "python" とあった場合は Python 2 を指しています。

  • python.exe と pythonw.exe に長いパスに対応するフラグが設定され、パスの 260 文字制限が適用されない場合があるようになりました。 詳しくは MAX_PATH 制限の解除 を参照してください。

  • ._pth ファイルを追加すると、隔離モードを強制し、検索パスをすべて明示的に指定してレジストリと環境変数の参照を避けられます。 詳しくは ドキュメント を参照してください。

  • python36.zip ファイルが PYTHONHOME を推定するための目印として機能するようになりました。 詳しくは ドキュメント を参照してください。

新しい機能

PEP 498: フォーマット済み文字列リテラル

PEP 498 は新たな種類の文字列リテラル、すなわち f-strings、 フォーマット済み文字列リテラル を導入しました。

フォーマット済み文字列リテラルはプレフィックスに 'f' をとり str.format() による書式文字列に似ています。これらには中括弧で囲まれた置換フィールドがあります。置換フィールドは実行時に評価される式で、 format() プロトコルによってフォーマットされます:

>>> name = "Fred"
>>> f"He said his name is {name}."
'He said his name is Fred.'
>>> width = 10
>>> precision = 4
>>> value = decimal.Decimal("12.34567")
>>> f"result: {value:{width}.{precision}}"  # 入れ子のフィールド
'result:      12.35'

参考

PEP 498 -- 文字列リテラルへの値の埋め込み。

PEP の執筆と実装は Eric V. Smith。

機能のドキュメント。

PEP 526: 変数アノテーションの文法

PEP 484 は関数の仮引数の型アノテーションの標準(別名型ヒント)を導入しました。この PEP は Python に、クラス変数およびインスタンス変数を含む変数の型アノテーションの構文を追加しました:

primes: List[int] = []

captain: str  # 注意: 初期値はありません!

class Starship:
    stats: Dict[str, int] = {}

関数アノテーションと同様に、Python インタープリタは変数アノテーションに特定の意味を付加せず、クラスやモジュールの __annotations__ 属性に保存するだけです。

静的型付け言語の変数定義とは対照的に、アノテーションシンタックスの目的は抽象構文木および __annotations__ 属性を通じて、サードパーティツールやライブラリーに型の構造化されたメタデータを指定する簡単な方法を提供することです。

参考

PEP 526 -- Syntax for variable annotations

PEP の執筆は Ryan Gonzalez、Philip House、Ivan Levkivskyi、Lisa Roach、Guido van Rossum。 実装は Ivan Levkivskyi。

新構文を使用あるいは使用予定のツール: mypy, pytype, PyCharm などなど。

PEP 515: 数値リテラル内のアンダースコア

PEP 515 により、可読性向上のために数値リテラル内でアンダースコアを使えるようになりました。例えば:

>>> 1_000_000_000_000_000
1000000000000000
>>> 0x_FF_FF_FF_FF
4294967295

単一のアンダースコアは数字の間と基数指定子の後で許されます。先頭、末尾、あるいは複数のアンダースコアを列内で使用することはできません。

文字列の書式指定 にも '_' オプションが追加されました。 浮動小数点の表示型と整数の表示型 'd' では、アンダースコアを 3 桁区切りに使います。 整数の表示型 'b'、'o'、'x'、'X' では、4 桁ごとにアンダースコアを挿入します。

>>> '{:_}'.format(1000000)
'1_000_000'
>>> '{:_x}'.format(0xFFFFFFFF)
'ffff_ffff'

参考

PEP 515 -- 数値リテラル内のアンダースコア

PEP の執筆は Georg Brandl と Serhiy Storchaka。

PEP 525: 非同期ジェネレータ

PEP 492 で Python 3.5 はネイティブなコルーチンならびに async / await 構文をサポートしました。Python 3.5 実装における大きな制約は同一の関数実体内で await と yield を使えないことでした。Python 3.6 ではこの制約はなくなり、 非同期ジェネレータ を定義できるようになりました:

async def ticker(delay, to):
    """*delay* 秒ごとに 0 から *to* までの数値を yield する。"""
    for i in range(to):
        yield i
        await asyncio.sleep(delay)

新たな構文のおかげでより速く、より簡潔にコードを書くことができます。

参考

PEP 525 -- 非同期ジェネレータ

PEP written and implemented by Yury Selivanov.

PEP 530: 非同期内包表記

PEP 530 によりリスト、セット、辞書内包表記ならびにジェネレータ式内での async for の使用がサポートされました:

result = [i async for i in aiter() if i % 2]

加えて、 await 式が全ての内包表記でサポートされました:

result = [await fun() for fun in funcs if await condition()]

参考

PEP 530 -- 非同期内包表記

PEP written and implemented by Yury Selivanov.

PEP 487: クラス作成のカスタマイズを簡単に

メタクラスを使わずにサブクラスの作成をカスタマイズできるようになりました。 新しいクラスメソッド __init_subclass__ は、新しいサブクラスが作成されるたびに基底クラスで呼び出されます。

class PluginBase:
    subclasses = []

    def __init_subclass__(cls, **kwargs):
        super().__init_subclass__(**kwargs)
        cls.subclasses.append(cls)

class Plugin1(PluginBase):
    pass

class Plugin2(PluginBase):
    pass

__init_subclass__() の実装内で引数なしの super() が正しく動作するように、独自のメタクラスは名前空間の新しいエントリー __classcell__ を type.__new__ に渡す必要があります (クラスオブジェクトの作成 を参照)。

参考

PEP 487 -- クラス作成のカスタマイズを簡単に

PEP 著と実装 Martin Teichmann.

機能のドキュメント

PEP 487: 記述子プロトコルの改善

PEP 487 はデスクリプタプロトコルを拡張し、省略可能な __set_name__() メソッドを追加します。 新しいクラスが定義されるたびに、その定義に含まれるすべてのデスクリプタでこのメソッドが呼び出され、定義中のクラスへの参照とクラス名前空間内でのデスクリプタの名前が渡されます。 つまり、デスクリプタのインスタンスは所有するクラスでの属性名を把握できるようになりました。

class IntField:
    def __get__(self, instance, owner):
        return instance.__dict__[self.name]

    def __set__(self, instance, value):
        if not isinstance(value, int):
            raise ValueError(f'expecting integer in {self.name}')
        instance.__dict__[self.name] = value

    # これが新しい初期化メソッド:
    def __set_name__(self, owner, name):
        self.name = name

class Model:
    int_field = IntField()

参考

PEP 487 -- クラス作成のカスタマイズを簡単に

PEP 著と実装 Martin Teichmann.

機能のドキュメント

PEP 519: ファイルシステムパスプロトコルの追加

従来、ファイルシステムのパスは str または bytes オブジェクトで表されていました。 そのため、パスを操作するコードの作成者は、パスのオブジェクトがそのいずれかの型であると想定してきました (ファイル記述子を表す int はファイルパスではないため除きます)。 しかし、この想定のために pathlib などの別のオブジェクトで表現されたパスを、Python の標準ライブラリを含む既存のコードで扱えませんでした。

この問題を解決するため、os.PathLike で表される新しいインターフェースを定義しました。 __fspath__() メソッドを実装すると、オブジェクトがパスを表すことを示せます。 このメソッドでファイルシステムパスの低水準な表現を str または bytes オブジェクトとして提供できます。 つまり、os.PathLike を実装するオブジェクト、またはファイルシステムのパスを表す str や bytes オブジェクトが パス類オブジェクト とみなされます。 コードでは os.fspath()、os.fsdecode()、os.fsencode() を使い、パス類オブジェクトの str や bytes 表現を明示的に取得できます。

組み込み関数 open() と、os、os.path モジュールの関連するすべての関数、および標準ライブラリのほとんどの関数やクラスが os.PathLike オブジェクトを受け付けるように更新されました。 os.DirEntry クラスと pathlib の関連クラスも、os.PathLike を実装するように更新されました。

ファイルシステムのパスを操作する基本的な関数の更新により、サードパーティーのコードも、変更なしで暗黙に、あるいは最小限の変更で、すべての パス類オブジェクト をサポートすることが期待されます。 最小限の変更とは、例えばパス類オブジェクトを操作するコードの先頭で os.fspath() を呼ぶことです。

新しいインターフェースによって、既存のコードでも pathlib.Path をより簡単に、意識せず使える例を示します。

>>> import pathlib
>>> with open(pathlib.Path("README")) as f:
...     contents = f.read()
...
>>> import os.path
>>> os.path.splitext(pathlib.Path("some_file.txt"))
('some_file', '.txt')
>>> os.path.join("/a/b", pathlib.Path("c"))
'/a/b/c'
>>> import os
>>> os.fspath(pathlib.Path("some_file.txt"))
'some_file.txt'

(Brett Cannon、Ethan Furman、Dusty Phillips、Jelle Zijlstra による実装。)

参考

PEP 519 -- ファイルシステムパスプロトコルの追加

PEP の執筆は Brett Cannon と Koos Zevenhoven。

PEP 495: 地域時間の曖昧さ回避

世界の大抵の場所で、地域時計が1日繰り下げられることがこれまでありましたし、これからもあるでしょう。そういった時に、同じ日に同じ時間を指す区間があります。そういった状況では地域時計が表示する (あるいは Python の datetime インスタンスが格納する) 情報では、時間内の特定の瞬間を識別することはできません。

PEP 495 は時間内の地域時間が同じ二つの瞬間を区別するために、新たな fold 属性を datetime.datetime インスタンスならびに datetime.time クラスに追加しました。

>>> u0 = datetime(2016, 11, 6, 4, tzinfo=timezone.utc)
>>> for i in range(4):
...     u = u0 + i*HOUR
...     t = u.astimezone(Eastern)
...     print(u.time(), 'UTC =', t.time(), t.tzname(), t.fold)
...
04:00:00 UTC = 00:00:00 EDT 0
05:00:00 UTC = 01:00:00 EDT 0
06:00:00 UTC = 01:00:00 EST 1
07:00:00 UTC = 02:00:00 EST 0

fold 属性の値は、曖昧な場合に時間内の二番目の (年代的) 瞬間を表しているものを除く全てのインスタンスで 0 です。

参考

PEP 495 -- 地域時間の曖昧さ回避

PEP の執筆は Alexander Belopolsky と Tim Peters、実装は Alexander Belopolsky。

PEP 529: Windows ファイルシステムのエンコーディングを UTF-8 に変更

ファイルシステムのパスは bytes よりも str (Unicode) で表すのが適切です。 ただし bytes で十分であり、適切でもある場面もあります。

Python 3.6 より前では、Windows で bytes のパスを使うと情報が失われる場合がありました。 この変更により Windows でも bytes によるパス表現をサポートします。 ただし sys.getfilesystemencoding() が返すエンコーディングでエンコードする必要があり、そのデフォルトは 'utf-8' になりました。

パスを str で表さないアプリケーションでは、os.fsencode() と os.fsdecode() を使って bytes を正しくエンコードしてください。 以前の動作に戻すには PYTHONLEGACYWINDOWSFSENCODING を設定するか、sys._enablelegacywindowsfsencoding() を呼び出します。

詳細や必要になる可能性があるコードの修正については PEP 529 を参照してください。

PEP 528: Windows コンソールのエンコーディングを UTF-8 に変更

Windows のデフォルトのコンソールがすべての Unicode 文字を受け付け、正しく読み取った str オブジェクトを Python コードに渡すようになりました。 sys.stdin、sys.stdout、sys.stderr のデフォルトのエンコーディングは utf-8 になりました。

この変更は対話型コンソールを使う場合にのみ適用され、ファイルやパイプへのリダイレクトには適用されません。 対話型コンソールで以前の動作に戻すには PYTHONLEGACYWINDOWSSTDIO を設定してください。

参考

PEP 528 -- Windows コンソールのエンコーディングを UTF-8 に変更

PEP の執筆と実装は Steve Dower。

PEP 520: クラス属性の定義の順番を保持

クラス定義の本体にある属性には、名前がソースに現れる順序という自然な順序があります。 この順序が新しいクラスの __dict__ 属性に保持されるようになりました。

また、クラスの 実行 名前空間の実質的なデフォルト (type.__prepare__() が返すもの) が、挿入順を保持するマッピングになりました。

参考

PEP 520 -- クラス属性の定義の順番を保持

PEP written and implemented by Eric Snow.

PEP 468: キーワード引数の順番の保持

関数シグニチャにおける **kwargs は挿入順序を保存するマッピングであることが保証されるようになりました。

参考

PEP 468 -- キーワード引数の順番の保持

PEP written and implemented by Eric Snow.

新たな dict 実装

dict 型が、Raymond Hettinger の提案 に基づき、PyPy が初めて実装した 「コンパクト」な表現を使うようになりました。 新しい dict() のメモリ使用量は Python 3.5 より 20〜25% 少なくなっています。

この実装が順序を保持する点は実装詳細とみなされ、依存すべきではありません。 将来は変わる可能性がありますが、現在および将来のすべての Python 実装で順序の保持を必須にするよう言語仕様を変更する前に、この新しい dict 実装を数回のリリースにわたって使うことが望まれています。 これは Python 3.5 など、反復処理の順序がまだ不定な古い言語バージョンとの後方互換性を保つことにも役立ちます。

(INADA Naoki による貢献、bpo-27350。アイデアは Raymond Hettinger の当初の提案。)

PEP 523: CPython にフレーム評価 API を追加

Python にはコードの実行方法をカスタマイズする幅広い仕組みがありますが、フレームオブジェクトの評価にはありませんでした。 フレームの評価に介入したい場合、定義済みの関数の関数ポインタを直接操作する以外に方法がありませんでした。

PEP 523 は C レベルでフレームの評価処理を差し替える API を提供し、この状況を変えます。 デバッガーや JIT などのツールが、Python コードの実行開始前にフレームの評価に介入できるようになります。 これにより Python コードの別の評価実装を使ったり、フレームの評価を追跡したりできます。

この API は制限付き C API の一部ではなく、非公開とされています。 利用が限られ、ごく特定の低水準な用途にのみ適することを示すためです。 API の意味は必要に応じて Python とともに変わります。

参考

PEP 523 -- CPython へのフレーム評価 API の追加

PEP の執筆は Brett Cannon と Dino Viehland。

PYTHONMALLOC 環境変数

新たな環境変数 PYTHONMALLOC により Python メモリアロケータの設定とデバッグフックの導入ができます。

PYTHONMALLOC=debug を使用してリリースモードでコンパイルされた Python で、Python メモリアロケータにデバッグフックを導入できるようになりました。デバッグフックの効果は:

  • 新たに割り当てられたメモリを 0xCB バイトで埋めます

  • 解放されたメモリを 0xDB バイトで埋めます

  • Python メモリアロケータ API の違反を検知します。例えば PyMem_Malloc() で割り当てられたメモリブロックに PyObject_Free() を呼ぶこと。

  • バッファ開始前の書き込み (バッファアンダーフロー) を検知します

  • バッファ終端後の書き込み (バッファオーバーフロー) を検知します

  • PYMEM_DOMAIN_OBJ (例: PyObject_Malloc()) と PYMEM_DOMAIN_MEM (例: PyMem_Malloc()) の各ドメインのアロケータ関数を呼ぶときに、GIL を保持しているか確認します。

GIL を保持しているかどうかの検査も Python 3.6 の新機能です。

Python のメモリアロケータのデバッグフックについては PyMem_SetupDebugHooks() を参照してください。

PYTHONMALLOC=malloc によって、Python のすべてのメモリ割り当てに C ライブラリの malloc() アロケータを強制的に使うことも可能になりました。 リリースモードでコンパイルした Python に対して Valgrind などの外部メモリデバッガーを使う場合に役立ちます。

エラー発生時に Python のメモリアロケータのデバッグフックが tracemalloc モジュールを使い、メモリブロックを割り当てた場所のトレースバックを取得するようになりました。

python3.6 -X tracemalloc=5 (トレースに 5 フレームを保存) を使った場合の、バッファオーバーフローによる致命的なエラーの例です。

Debug memory block at address p=0x7fbcd41666f8: API 'o'
    4 bytes originally requested
    The 7 pad bytes at p-7 are FORBIDDENBYTE, as expected.
    The 8 pad bytes at tail=0x7fbcd41666fc are not all FORBIDDENBYTE (0xfb):
        at tail+0: 0x02 *** OUCH
        at tail+1: 0xfb
        at tail+2: 0xfb
        at tail+3: 0xfb
        at tail+4: 0xfb
        at tail+5: 0xfb
        at tail+6: 0xfb
        at tail+7: 0xfb
    The block was made by call #1233329 to debug malloc/realloc.
    Data at p: 1a 2b 30 00

Memory block allocated at (most recent call first):
  File "test/test_bytes.py", line 323
  File "unittest/case.py", line 600
  File "unittest/case.py", line 648
  File "unittest/suite.py", line 122
  File "unittest/suite.py", line 84

Fatal Python error: bad trailing pad byte

Current thread 0x00007fbcdbd32700 (most recent call first):
  File "test/test_bytes.py", line 323 in test_hex
  File "unittest/case.py", line 600 in run
  File "unittest/case.py", line 648 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  File "unittest/suite.py", line 122 in run
  File "unittest/suite.py", line 84 in __call__
  ...

(Victor Stinner による貢献、bpo-26516 and bpo-26564。)

DTrace と SystemTap のプローブのサポート

--with-dtrace を指定して Python をビルドできるようになりました。 これにより、インタープリタの次のイベントに静的マーカーが有効になります:

  • 関数の呼び出し/復帰

  • ガベージコレクションの開始/終了

  • 実行されたコードの行。

専用の デバッグビルド を再コンパイルしたり、アプリケーション固有のプロファイリングやデバッグ用コードを用意したりせずに、本番環境で実行中のインタープリタを計測できます。

詳細については DTrace と SystemTap で CPython を測定する を参照してください。

現在の実装は Linux と macOS でテストされています。 将来マーカーが追加される可能性があります。

(Jesús Cea Avión、David Malcolm、Nikhil Benesch のパッチを基にした Łukasz Langa による貢献、bpo-21590。)

その他の言語変更

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

  • global 文と nonlocal 文は、同じスコープ内で対象の名前を最初に使う場所よりも前に記述する必要があります。 以前は違反すると SyntaxWarning になっていました。

  • 特殊メソッド を None に設定し、対応する操作が利用できないことを示せるようになりました。 例えば、クラスの __iter__() を None に設定すると、そのクラスは反復可能ではなくなります。 (Contributed by Andrew Barnert and Ivan Levkivskyi in bpo-25958.)

  • トレースバックで同じ行が長く繰り返される場合、"[Previous line repeated {count} more times]" と省略されるようになりました (例は traceback を参照)。 (Contributed by Emanuel Barry in bpo-26823.)

  • インポート時にモジュールが見つからない場合、新しい ModuleNotFoundError (ImportError のサブクラス) を送出するようになりました。 現在 try-except で ImportError を検査しているコードは引き続き動作します。 (Contributed by Eric Snow in bpo-15767.)

  • 引数なしの super() に依存するクラスメソッドが、クラス作成中にメタクラスのメソッドから呼び出された場合も正しく動作するようになりました。 (Contributed by Martin Teichmann in bpo-23722.)

新たなモジュール

secrets

新しい secrets モジュールの主な目的は、アカウント認証やトークンなどの秘密情報の管理に適した、暗号学的に強い疑似乱数値を確実に生成する分かりやすい方法を提供することです。

警告

random モジュールの疑似乱数生成器をセキュリティ目的に使っては いけません。 Python 3.6 以降では secrets を、Python 3.5 以前では os.urandom() を使ってください。

参考

PEP 506 -- 標準ライブラリへの secrets モジュールの追加

PEP の執筆と実装は Steven D'Aprano。

改良されたモジュール

array

array.array のイテレータが要素を取り尽くした後は、対象の配列が拡張されても取り尽くした状態を維持するようになりました。 これはほかのミュータブルなシーケンスの動作と一致します。

Serhiy Storchaka による貢献、bpo-26492。

ast

新しい AST ノード ast.Constant が追加されました。 外部の AST 最適化ツールで定数畳み込みに利用できます。

Victor Stinner による貢献、bpo-26146。

asyncio

Python 3.6 から asyncio モジュールは暫定版ではなくなり、API は安定版とみなされます。

Python 3.5.0 以降の asyncio モジュールの注目すべき変更です (暫定版だったため、すべて 3.5.x にバックポートされています):

  • get_event_loop() 関数は、コルーチンやコールバックから呼ばれた場合、常に現在実行中のループを返すようになりました。 (Contributed by Yury Selivanov in bpo-28613.)

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

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

  • 現在の例外ハンドラーを取得する loop.get_exception_handler() メソッドが追加されました。 (Contributed by Yury Selivanov in bpo-27040.)

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

  • StreamReader.readexactly() の性能が改善されました。 (Contributed by Mark Korenberg in bpo-28370.)

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

  • The loop.stop() method has been changed to stop the loop immediately after the current iteration. Any new callbacks scheduled as a result of the last iteration will be discarded. (Contributed by Guido van Rossum in bpo-25593.)

  • Future.set_exception に StopIteration 例外のインスタンスを渡すと TypeError を送出するようになりました。 (Contributed by Chris Angelico in bpo-26221.)

  • asyncio の外で接続を受け付け、asyncio でその接続を処理するサーバー向けに loop.connect_accepted_socket() メソッドが追加されました。 (Contributed by Jim Fulton in bpo-27392.)

  • すべての TCP トランスポートで TCP_NODELAY フラグがデフォルトで設定されるようになりました。 (Contributed by Yury Selivanov in bpo-27456.)

  • ループを閉じる前に残っている非同期ジェネレータを適切に閉じる loop.shutdown_asyncgens() が追加されました。 (Contributed by Yury Selivanov in bpo-28003.)

  • Future と Task に最適化された C 実装が追加され、asyncio のコードが最大 30% 高速になりました。 (Contributed by Yury Selivanov and INADA Naoki in bpo-26081 and bpo-28544.)

binascii

b2a_base64() 関数に省略可能なキーワード引数 newline が追加され、戻り値の末尾に改行文字を付けるかどうかを制御できます。 (Contributed by Victor Stinner in bpo-25357.)

cmath

定数 cmath.tau (τ) が追加されました。 (Contributed by Lisa Roach in bpo-12345, see PEP 628 for details.)

新たに定数が追加されました。 math.inf と math.nan に対応する cmath.inf と cmath.nan。複素数の repr が使用する書式に対応する cmath.infj と cmath.nanj。 (Contributed by Mark Dickinson in bpo-23229.)

collections

サイズを持つ反復可能なコンテナクラスを表す抽象基底クラス Collection が追加されました。 (Contributed by Ivan Levkivskyi, docs by Neil Girdhar in bpo-27598.)

新しい抽象基底クラス Reversible は、__reversed__() メソッドも提供する反復可能なクラスを表します。 (Contributed by Ivan Levkivskyi in bpo-25987.)

新しい抽象基底クラス AsyncGenerator は非同期ジェネレータを表します。 (Contributed by Yury Selivanov in bpo-28720.)

namedtuple() 関数に省略可能なキーワード引数 module が追加されました。 指定すると、返される名前付きタプルのクラスの __module__ 属性に使われます。 (Contributed by Raymond Hettinger in bpo-17941.)

namedtuple() の verbose と rename 引数がキーワード専用になりました。 (Contributed by Raymond Hettinger in bpo-25628.)

再帰的な collections.deque インスタンスを pickle 化できるようになりました。 (Contributed by Serhiy Storchaka in bpo-26482.)

concurrent.futures

ThreadPoolExecutor クラスのコンストラクタに省略可能な thread_name_prefix 引数が追加され、プールが作成するスレッドの名前をカスタマイズできるようになりました。 (Contributed by Gregory P. Smith in bpo-27664.)

contextlib

コンテキストマネージャーの抽象基底クラス contextlib.AbstractContextManager が追加されました。 __enter__() には self を返す妥当なデフォルト実装があり、__exit__() は抽象メソッドのままです。 typing モジュールにも対応する typing.ContextManager クラスが追加されました。 (Contributed by Brett Cannon in bpo-25609.)

datetime

datetime と time クラスに fold 属性が追加され、必要に応じてローカル時刻の曖昧さを解消できます。 datetime の多くの関数も、ローカル時刻の曖昧さの解消に対応するよう更新されました。 詳しくは ローカル時刻の曖昧さの解消 を参照してください。 (Contributed by Alexander Belopolsky in bpo-24773.)

datetime.strftime() と date.strftime() メソッドが、ISO 8601 の日付書式指定 %G、%u、%V に対応しました。 (Contributed by Ashley Anderson in bpo-12006.)

datetime.isoformat() 関数に省略可能な引数 timespec が追加され、時刻の構成要素をどこまで含めるか指定できるようになりました。 (Contributed by Alessandro Cucci and Alexander Belopolsky in bpo-19475.)

datetime.combine() に省略可能な tzinfo 引数が追加されました。 (Contributed by Alexander Belopolsky in bpo-27661.)

decimal

新しい Decimal.as_integer_ratio() メソッドは、Decimal インスタンスを分母が正の既約分数で表す整数のペア (n, d) を返します。

>>> Decimal('-3.14').as_integer_ratio()
(-157, 50)

(Stefan Krah と Mark Dickinson による貢献、bpo-25928。)

distutils

distutils.command.sdist.sdist の default_format 属性が削除され、formats 属性のデフォルトは ['gztar'] になりました。 そのようなコードは想定していませんが、default_format の存在に依存するコードは修正が必要になる可能性があります。 詳しくは bpo-27819 を参照してください。

email

各種コンストラクタの policy キーワードで有効にする新しい email API が、暫定版ではなくなりました。 email のドキュメントは、新しい API を中心に構成を見直して書き直され、従来の API の古いドキュメントも残されています。 (Contributed by R. David Murray in bpo-24277.)

email.mime のすべてのクラスに、省略可能な policy キーワードが追加されました。 (Contributed by Berker Peksag in bpo-27331.)

DecodedGenerator が policy キーワードに対応しました。

policy に message_factory 属性が追加され、パーサーが新しいメッセージオブジェクトを作成するときのデフォルトのクラスを制御できます。 email.policy.compat32 ポリシーでは Message、新しいポリシーでは EmailMessage です。 (Contributed by R. David Murray in bpo-20476.)

エンコーディング

Windows で CP_OEMCP を使う 'oem' エンコーディングが追加されました。 また CP_ACP コードページを使う既存の 'mbcs' エンコーディングに 'ansi' という別名が追加されました。 (Contributed by Steve Dower in bpo-27959.)

enum

enum モジュールに列挙型の基底クラス Flag と IntFlag が追加されました。 どちらもビット単位の演算子で組み合わせられる定数の定義に使います。 (Contributed by Ethan Furman in bpo-23591.)

標準ライブラリの多くのモジュールが、定数に IntFlag クラスを使うよう更新されました。

新しい enum.auto 値を使うと、列挙型のメンバーに値を自動的に割り当てられます。

>>> from enum import Enum, auto
>>> class Color(Enum):
...     red = auto()
...     blue = auto()
...     green = auto()
...
>>> list(Color)
[<Color.red: 1>, <Color.blue: 2>, <Color.green: 3>]

faulthandler

Windows では faulthandler モジュールが Windows 例外のハンドラーをインストールするようになりました。 faulthandler.enable() を参照してください。 (Contributed by Victor Stinner in bpo-23848.)

fileinput

hook_encoded() が errors 引数に対応しました。 (Contributed by Joseph Hackman in bpo-25788.)

hashlib

hashlib が OpenSSL 1.1.0 に対応しました。 推奨される最小バージョンは 1.0.2 です。 (Contributed by Christian Heimes in bpo-26470.)

BLAKE2 ハッシュ関数がモジュールに追加されました。 blake2b() と blake2s() は常に利用可能で、BLAKE2 のすべての機能をサポートします。 (Contributed by Christian Heimes in bpo-26798 based on code by Dmitry Chestnykh and Samuel Neves. Documentation written by Dmitry Chestnykh.)

SHA-3 ハッシュ関数 sha3_224()、sha3_256()、sha3_384()、sha3_512() と、SHAKE ハッシュ関数 shake_128()、shake_256() が追加されました。 (Contributed by Christian Heimes in bpo-16113. Keccak Code Package by Guido Bertoni, Joan Daemen, Michaël Peeters, Gilles Van Assche, and Ronny Van Keer.)

パスワードに基づく鍵導出関数 scrypt() が OpenSSL 1.1.0 以降で利用可能になりました。 (Contributed by Christian Heimes in bpo-27928.)

http.client

HTTPConnection.request() と endheaders() が、リクエスト本文のチャンクエンコーディングに対応しました。 (Contributed by Demian Brecht and Rolf Krahl in bpo-12319.)

idlelib と IDLE

idlelib パッケージは、IDLE の見た目と動作を改善し、コードを理解、テスト、改善しやすくするため、刷新とリファクタリングが進められています。 特に Linux と Mac での見た目を改善する取り組みの一環として、主にダイアログで ttk ウィジェットを使うようになりました。 その結果、IDLE は tcl/tk 8.4 では動作せず、tcl/tk 8.5 または 8.6 が必要になりました。 どちらも最新リリースの使用を推奨します。

この刷新には idlelib モジュールの改名と統合も含まれます。 名前に一部大文字を含むファイルの改名は、例えば 3.0 で Tkinter と TkFont を tkinter と tkinter.font に改名したことと同様です。 そのため、3.5 で動作した idlelib ファイルのインポートは、通常 3.6 では動作しません。 少なくともモジュール名の変更が必要で (idlelib/README.txt を参照)、さらに変更が必要な場合もあります。 (改名は Al Swiegart と Terry Reedy による貢献、bpo-24225。以降の idlelib のパッチの多くは、この取り組みの一部であり、今後もそうなる予定です。)

一方、最終的には idlelib の一部のクラスの API が改善され、その説明の docstring も整い、使いやすくなる予定です。 役立つ追加情報も、用意でき次第 idlelib に追加されます。

3.6.2 の新機能:

自動補完におけるいくつもの修正。 (Contributed by Louie Lu in bpo-15786.)

3.6.3 の新機能:

File メニューの Module Browser (以前の Class Browser) が、トップレベルだけでなく入れ子の関数やクラスも表示するようになりました。 (Contributed by Guilherme Polo, Cheryl Sabella, and Terry Jan Reedy in bpo-1612262.)

従来は拡張として実装されていた IDLE の機能が通常の機能として再実装されました。 その設定は Extensions タブからほかのダイアログのタブへ移されました。 (Contributed by Charles Wohlganger and Terry Jan Reedy in bpo-27099.)

設定ダイアログ (Options の Configure IDLE) の一部が、見た目と機能を改善するために書き直されました。 (Contributed by Cheryl Sabella and Terry Jan Reedy in multiple issues.)

3.6.4 の新機能:

フォントのサンプルにラテン文字以外の文字も含まれるようになり、フォントを選んだ結果をよりよく確認できます。 (Terry Jan Reedy による貢献、bpo-13802。) サンプルを編集してほかの文字を追加することもできます。 (Serhiy Storchaka による貢献、bpo-31860。)

3.6.6 の新機能:

エディターのコードコンテキストオプションが改訂されました。 ボックスに maxlines までのすべてのコンテキスト行を表示します。 コンテキスト行をクリックすると、エディターがその行へ移動します。 設定ダイアログの Highlights タブに、カスタムテーマのコンテキストの色が追加されました。 (Contributed by Cheryl Sabella and Terry Jan Reedy in bpo-33642, bpo-33768, and bpo-33679.)

Windows で新しい API 呼び出しを使い、tk が DPI に合わせて拡大縮小することを Windows に通知するようになりました。 Windows 8.1 以降または 10 で、Python バイナリの DPI 互換性プロパティを変更しておらず、モニターの解像度が 96 DPI を超える場合、文字や線がより鮮明になるはずです。 それ以外の場合には影響しないはずです。 (Contributed by Terry Jan Reedy in bpo-33656.)

3.6.7 の新機能:

N 行 (デフォルトは 50 行) を超える出力は、一つのボタンに折り畳まれます。 N は設定ダイアログの General ページにある PyShell セクションで変更できます。 行数が少なくても各行が非常に長い場合などは、出力を右クリックして折り畳めます。 折り畳んだ出力は、ボタンのダブルクリックでその場に展開でき、右クリックでクリップボードや別のウィンドウに展開できます。 (Contributed by Tal Einat in bpo-1529353.)

importlib

インポート時にモジュールが見つからない場合、新しい ModuleNotFoundError (ImportError のサブクラス) を送出するようになりました。 現在 try-except で ImportError を検査しているコードは引き続き動作します。 (Contributed by Eric Snow in bpo-15767.)

importlib.util.LazyLoader は、ラップしたローダーの create_module() を呼び出すようになりました。 これにより、importlib.machinery.BuiltinImporter と importlib.machinery.ExtensionFileLoader を importlib.util.LazyLoader で使えないという制限がなくなりました。

importlib.util.cache_from_source()、importlib.util.source_from_cache()、importlib.util.spec_from_file_location() が path-like object を受け付けるようになりました。

inspect

inspect.signature() 関数は、内包表記やジェネレータ式のスコープ用にコンパイラが生成する暗黙の .0 パラメータを、implicit0 という名前の位置専用パラメータとして報告するようになりました。 (Contributed by Jelle Zijlstra in bpo-19611.)

Python 2.7 と従来の inspect.getargspec() API から移行する際のコード変更を減らすため、以前に文書化された inspect.getfullargspec() の非推奨化は撤回されました。 この関数は単一ソースで Python 2/3 に対応するコードベースには便利ですが、新しいコードには、より機能の豊富な inspect.signature() インターフェースを引き続き推奨します。 (Contributed by Nick Coghlan in bpo-27172)

json

json.load() と json.loads() は、バイナリ入力をサポートしました。エンコード済みのJSON は、 UTF-8, UTF-16, UTF-32のいずれかを返すべきです。 (Contributed by Serhiy Storchaka in bpo-17909.)

logging

新しく WatchedFileHandler.reopenIfNeeded() メソッドが追加され、ログファイルを再オープンする必要があるかどうかをチェックする機能が追加れました。(Contributed by Marian Horban in bpo-24884.)

math

math と cmath モジュールに定数 tau (τ) が追加されました。 (Contributed by Lisa Roach in bpo-12345, see PEP 628 for details.)

multiprocessing

multiprocessing.Manager() が返す プロキシオブジェクト を入れ子にできるようになりました。 (Contributed by Davin Potts in bpo-6766.)

os

os と os.path モジュールの パス類オブジェクト 対応については、PEP 519 の概要 を参照してください。

Windows でも scandir() が bytes のパスに対応しました。

新しい close() メソッドで scandir() のイテレータを明示的に閉じられるようになりました。 scandir() のイテレータは context manager プロトコルにも対応しました。 scandir() のイテレータを最後まで取り出さず、明示的にも閉じなかった場合、デストラクタが ResourceWarning を出します。 (Contributed by Serhiy Storchaka in bpo-25994.)

Linux ではセキュリティを高めるため、システムの urandom エントロピープールが初期化されるまで os.urandom() がブロックするようになりました。 理由については PEP 524 を参照してください。

Linux の getrandom() システムコール (ランダムなバイト列の取得) が、新しい os.getrandom() 関数として公開されました。 (Contributed by Victor Stinner, part of the PEP 524)

pathlib

pathlib は path-like objects をサポートしました。 (Contributed by Brett Cannon in bpo-27186.)

詳細は、 PEP 519 の要約を参照してください。

pdb

Pdb クラスのコンストラクタに、新しくオプション引数 readrc が増えました。この引数は、 .pdbrc ファイルを読み込むかどうかを指定します。

pickle

__new__ をキーワード引数付きで呼ぶ必要があるオブジェクトを、バージョン 4 より古い pickle プロトコル でも pickle 化できるようになりました。 プロトコルのバージョン 4 は、この場合にすでに対応しています。 (Contributed by Serhiy Storchaka in bpo-24164.)

pickletools

pickletools.dis() が MEMOIZE オペコードの暗黙のメモインデックスを出力するようになりました。 (Contributed by Serhiy Storchaka in bpo-25382.)

pydoc

pydoc モジュールが環境変数 MANPAGER を参照するようになりました。 (Contributed by Matthias Klose in bpo-8637.)

help() と pydoc が、名前付きタプルのフィールドをアルファベット順ではなく定義順に表示できるようになりました。 (Contributed by Raymond Hettinger in bpo-24879.)

random

新しい choices() 関数は、指定された母集団から指定サイズの要素のリストを返します。 重みも指定できます。 (Contributed by Raymond Hettinger in bpo-18844.)

re

正規表現の一部分に修飾子を適用できるようになりました。 例えば '(?i:p)ython' は 'python' と 'Python' にマッチしますが、'PYTHON' にはマッチしません。 '(?i)g(?-i:v)r' は 'GvR' と 'gvr' にマッチしますが、'GVR' にはマッチしません。 (Contributed by Serhiy Storchaka in bpo-433028.)

マッチオブジェクトのグループに、group() と同等の __getitem__ でアクセスできるようになりました。 つまり mo['name'] は mo.group('name') と同じになります。 (Contributed by Eric Smith in bpo-24454.)

Match オブジェクトが、グループのインデックスに インデックスとして使えるオブジェクト を受け付けるようになりました。 (Contributed by Jeroen Demeyer and Xiang Zhang in bpo-27177.)

readline

set_auto_history() が追加され、入力を履歴リストに自動追加するかどうかを切り替えられます。 (Contributed by Tyler Crompton in bpo-26870.)

rlcompleter

接頭辞がアンダースコアで始まらない限り、非公開の属性名や特殊な属性名は省かれるようになりました。 一部のキーワードでは補完後に空白やコロンが追加されます。 (Contributed by Serhiy Storchaka in bpo-25011 and bpo-25209.)

shlex

shlex に、どの文字を区切り文字とみなすか制御する punctuation_chars 引数が追加され、シェルとの互換性が大幅に改善されました。 (Contributed by Vinay Sajip in bpo-1521950.)

site

.pth ファイルで sys.path に追加するパスを指定するとき、ディレクトリだけでなくファイル (例えば ZIP ファイル) のパスも指定できるようになりました。 (Contributed by Wolfgang Langner in bpo-26587)

sqlite3

sqlite3.Cursor.lastrowid は、 REPLACE 文をサポートしました。 (Contributed by Alex LordThorsen in bpo-16864.)

socket

ioctl() 関数が SIO_LOOPBACK_FAST_PATH 制御コードに対応しました。 (Contributed by Daniel Stokes in bpo-26536.)

getsockopt() の定数 SO_DOMAIN、SO_PROTOCOL、SO_PEERSEC、SO_PASSSEC に対応しました。 (Contributed by Christian Heimes in bpo-26907.)

setsockopt() が setsockopt(level, optname, None, optlen: int) という形式に対応しました。 (Contributed by Christian Heimes in bpo-27744.)

socket モジュールがアドレスファミリー AF_ALG に対応し、Linux カーネルの暗号 API を利用できるようになりました。 ALG_*、SOL_ALG、sendmsg_afalg() が追加されました。 (Contributed by Christian Heimes in bpo-27744 with support from Victor Stinner.)

Linux の定数 TCP_USER_TIMEOUT と TCP_CONGESTION が追加されました。 (Contributed by Omar Sandoval, bpo-26273)

socketserver

socketserver モジュールに基づくサーバーが context manager プロトコルに対応しました。 http.server、xmlrpc.server、wsgiref.simple_server で定義されるものも含まれます。 (Contributed by Aviv Palivoda in bpo-26404.)

StreamRequestHandler クラスの wfile 属性が io.BufferedIOBase の書き込み用インターフェースを実装するようになりました。 特に write() の呼び出しで、データ全体を送信することが保証されます。 (Contributed by Martin Panter in bpo-26721.)

ssl

ssl が OpenSSL 1.1.0 に対応しました。 推奨される最小バージョンは 1.0.2 です。 (Contributed by Christian Heimes in bpo-26470.)

デフォルトの暗号スイートから 3DES が削除され、ChaCha20 Poly1305 暗号スイートが追加されました。 (Contributed by Christian Heimes in bpo-27850 and bpo-27766.)

SSLContext のオプションと暗号方式のデフォルト設定が改善されました。 (Contributed by Christian Heimes in bpo-28043.)

新しい SSLSession クラスを使って、SSL セッションをクライアント側の接続から別の接続へコピーできるようになりました。 TLS セッションの再開によって、最初のハンドシェイクを高速化し、待ち時間を減らして性能を改善できます。 (Contributed by Christian Heimes in bpo-19500 based on a draft by Alex Warhawk.)

新しい get_ciphers() メソッドで、有効な暗号方式のリストを優先順位順に取得できます。

すべての定数とフラグが IntEnum と IntFlag に変換されました。 (Contributed by Christian Heimes in bpo-28025.)

SSLContext にサーバー側専用とクライアント側専用の TLS プロトコルが追加されました。 (Contributed by Christian Heimes in bpo-28085.)

TLS 1.3 のハンドシェイク後認証を有効にする ssl.SSLContext.post_handshake_auth と、それを開始する ssl.SSLSocket.verify_client_post_handshake() が追加されました。 (Contributed by Christian Heimes in gh-78851.)

statistics

harmonic_mean() 関数が追加されました。 (Contributed by Steven D'Aprano in bpo-27181.)

struct

struct が書式指定子 'e' を通じて IEEE 754 の半精度浮動小数点数に対応しました。 (Contributed by Eli Stevens, Mark Dickinson in bpo-11734.)

subprocess

subprocess.Popen のデストラクタは、子プロセスがまだ実行中であれば ResourceWarning を出すようになりました。 コンテキスト管理プロトコル (with proc: ...) を使うか、wait() メソッドを明示的に呼び出し、子プロセスの終了状態を読み取ってください。 (Contributed by Victor Stinner in bpo-26741.)

subprocess.Popen のコンストラクタと、そこに引数を渡すすべての関数が encoding と errors 引数を受け付けるようになりました。 いずれかを指定すると、stdin、stdout、stderr ストリームでテキストモードが有効になります。 (Contributed by Steve Dower in bpo-6135.)

sys

新しい getfilesystemencodeerrors() 関数は、Unicode のファイル名と bytes のファイル名の間の変換に使われるエラーモードの名前を返します。 (Contributed by Steve Dower in bpo-27781.)

Windows で getwindowsversion() 関数の戻り値に platform_version フィールドが追加されました。 プロセス向けにエミュレートされるバージョンではなく、現在の OS の正確なメジャーバージョン、マイナーバージョン、ビルド番号が含まれます。 (Contributed by Steve Dower in bpo-27932.)

telnetlib

telnetlib.Telnet がコンテキストマネージャーになりました。 (Stéphane Wirtel による貢献、bpo-25485。)

time

struct_time の属性 tm_gmtoff および tm_zone が全てのプラットフォームで利用できるようになりました。

timeit

便利な Timer.autorange() メソッドが追加されました。 合計実行時間が 200 ミリ秒以上になるように Timer.timeit() を繰り返し呼び出します。 (Contributed by Steven D'Aprano in bpo-6422.)

timeit は、最良と最悪の時間に大きな差 (4 倍) があると警告するようになりました。 (Contributed by Serhiy Storchaka in bpo-23552.)

tkinter

tkinter.Variable クラスに Variable.trace_add()、Variable.trace_remove()、trace_info() メソッドが追加されました。 これらは、廃止予定の Tcl コマンドを使うため将来の Tcl では動作しない可能性がある、従来の trace_variable()、trace()、trace_vdelete()、trace_vinfo() メソッドを置き換えるものです。 (Contributed by Serhiy Storchaka in bpo-22115)

traceback

traceback モジュールとインタープリタの組み込みの例外表示は、トレースバックで同じ行が長く繰り返される場合、次の例のように省略するようになりました。

>>> def f(): f()
...
>>> f()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  File "<stdin>", line 1, in f
  [Previous line repeated 995 more times]
RecursionError: maximum recursion depth exceeded

(Emanuel Barry による貢献、bpo-26823。)

tracemalloc

tracemalloc モジュールが、複数の異なるアドレス空間でのメモリ割り当ての追跡に対応しました。

新しいフィルタークラス DomainFilter を使うと、アドレス空間 (ドメイン) によってブロックのトレースを絞り込めます。

(Victor Stinner による貢献、bpo-26588。)

typing

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

typing モジュールのジェネリック型の別名に対するサポートが大幅に改善されました。 例えば Dict[str, Tuple[S, T]] が有効な型アノテーションになりました。 (Contributed by Guido van Rossum in Github #195.)

contextlib.AbstractContextManager を表す typing.ContextManager クラスが追加されました。 (Contributed by Brett Cannon in bpo-25609.)

collections.abc.Collection を表す typing.Collection クラスが追加されました。 (Contributed by Ivan Levkivskyi in bpo-27598.)

クラス変数を示す型構成子 typing.ClassVar が追加されました。 PEP 526 で導入されたとおり、ClassVar で囲んだ変数アノテーションは、その属性をクラス変数として使う意図を示し、クラスのインスタンスには設定すべきでないことを表します。 (Contributed by Ivan Levkivskyi in Github #280.)

静的型検査ツールでは True とみなされ、実行時には False になる定数 TYPE_CHECKING が追加されました。 (Contributed by Guido van Rossum in Github #230.)

アノテーション用に軽量で区別される型を作成する補助関数 NewType() が追加されました。

from typing import NewType

UserId = NewType('UserId', int)
some_id = UserId(524313)

静的型検査ツールは、この新しい型を元の型のサブクラスであるかのように扱います。 (Contributed by Ivan Levkivskyi in Github #189.)

unicodedata

unicodedata モジュールが Unicode 9.0.0 のデータを使うようになりました。 (Contributed by Benjamin Peterson.)

unittest.mock

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

urllib.request

HTTP リクエストの本文が bytes オブジェクト以外のファイルやイテラブルであり、Content-Length ヘッダーがない場合、AbstractHTTPHandler はエラーを送出せず、チャンク転送エンコーディングを使うようになりました。 (Contributed by Demian Brecht and Rolf Krahl in bpo-12319.)

urllib.robotparser

RobotFileParser が Crawl-delay と Request-rate 拡張に対応しました。 (Contributed by Nikolay Bogoychev in bpo-16099.)

venv

venv は、新しいパラメータ `--prompt`` を受け入れました。このパラメータは、 仮想環境を表すプリフィックスを指定します。 (Proposed by Łukasz Balcerzak and ported to 3.6 by Stéphane Wirtel in bpo-22829.)

warnings

warnings.warn_explicit() 関数に省略可能な source パラメータが追加され、ResourceWarning を発生させた破棄済みオブジェクトを渡せるようになりました。 warnings.WarningMessage にも source 属性が追加されました。 (Victor Stinner による貢献、bpo-26568、bpo-26567。)

ResourceWarning の記録時に、tracemalloc モジュールを使って、破棄されたオブジェクトが割り当てられた場所のトレースバックの取得を試みるようになりました。

スクリプト example.py での例:

import warnings

def func():
    return open(__file__)

f = func()
f = None

python3.6 -Wd -X tracemalloc=5 example.py コマンドの出力です。

example.py:7: ResourceWarning: unclosed file <_io.TextIOWrapper name='example.py' mode='r' encoding='UTF-8'>
  f = None
Object allocated at (most recent call first):
  File "example.py", lineno 4
    return open(__file__)
  File "example.py", lineno 6
    f = func()

"Object allocated at" のトレースバックは新しく追加されたもので、tracemalloc が Python のメモリ割り当てを追跡しており、warnings モジュールがインポート済みの場合にのみ表示されます。

winreg

64 ビット整数型 REG_QWORD が追加されました。 (Contributed by Clement Rouault in bpo-23026.)

winsound

Beep、MessageBeep、PlaySound にキーワード引数を渡せるようになりました (bpo-27982)。

xmlrpc.client

xmlrpc.client モジュールは、Apache XML-RPC 実装が数値や None に使う追加のデータ型のアンマーシャリングに対応しました。 (Contributed by Serhiy Storchaka in bpo-26885.)

zipfile

新しいクラスメソッド ZipInfo.from_file() を使うと、ファイルシステム上のファイルから ZipInfo インスタンスを作成できます。 新しい ZipInfo.is_dir() メソッドでは、ZipInfo インスタンスがディレクトリを表すかどうかを確認できます。 (Contributed by Thomas Kluyver in bpo-26039.)

ZipFile.open() メソッドを、ZIP ファイルからのデータの取り出しだけでなく、データの書き込みにも使えるようになりました。 (Contributed by Thomas Kluyver in bpo-26039.)

zlib

compress() と decompress() 関数がキーワード引数を受け付けるようになりました。 (Contributed by Aviv Palivoda in bpo-26243 and Xiang Zhang in bpo-16764 respectively.)

最適化

  • Python インタープリタがバイトコードの代わりに 16 ビットのワードコードを使うようになり、オペコードのさまざまな最適化が可能になりました。 (Contributed by Demur Rumed with input and reviews from Serhiy Storchaka and Victor Stinner in bpo-26647 and bpo-28050.)

  • asyncio.Future クラスに最適化された C 実装が追加されました。 (Contributed by Yury Selivanov and INADA Naoki in bpo-26081.)

  • asyncio.Task クラスに最適化された C 実装が追加されました。 (Contributed by Yury Selivanov in bpo-28544.)

  • typing モジュールの実装がさまざまな点で改善され (ジェネリック型のキャッシュなど)、最大 30 倍の性能向上とメモリ使用量の削減を実現しました。

  • ASCII デコーダーは、エラーハンドラーが surrogateescape、ignore、replace の場合に最大 60 倍高速になりました。 (Contributed by Victor Stinner in bpo-24870)

  • ASCII と Latin1 のエンコーダーは、エラーハンドラーが surrogateescape の場合に最大 3 倍高速になりました。 (Contributed by Victor Stinner in bpo-25227)

  • UTF-8 エンコーダーは、エラーハンドラーが ignore、replace、surrogateescape、surrogatepass の場合に最大 75 倍高速になりました。 (Contributed by Victor Stinner in bpo-25267)

  • UTF-8 デコーダーは、エラーハンドラーが ignore、replace、surrogateescape の場合に最大 15 倍高速になりました。 (Contributed by Victor Stinner in bpo-25301)

  • bytes % args が最大 2 倍高速になりました。 (Contributed by Victor Stinner in bpo-25349)

  • bytearray % args が 2.5〜5 倍高速になりました。 (Contributed by Victor Stinner in bpo-25399)

  • bytes.fromhex() と bytearray.fromhex() が最適化され、2〜3.5 倍高速になりました。 (Contributed by Victor Stinner in bpo-25401)

  • bytes.replace(b'', b'.') と bytearray.replace(b'', b'.') が最適化され、最大 80% 高速になりました。 (Contributed by Josh Snider in bpo-26574)

  • PyMem_Malloc() ドメイン (PYMEM_DOMAIN_MEM) のアロケータ関数が、C ライブラリの malloc() 関数の代わりに pymalloc メモリアロケータ を使うようになりました。 pymalloc は寿命の短い 512 バイト以下のオブジェクト向けに最適化され、より大きなメモリブロックには malloc() を使います。 (Contributed by Victor Stinner in bpo-26249)

  • pickle.load() と pickle.loads() が、多数の小さなオブジェクトのデシリアライズで最大 10% 高速になりました。 (Contributed by Victor Stinner in bpo-27056)

  • 関数への キーワード引数 の受け渡しには、位置引数 に比べてオーバーヘッドがあります。 Argument Clinic を使って実装された拡張関数では、このオーバーヘッドが大幅に減りました。 (Contributed by Serhiy Storchaka in bpo-27574)

  • glob モジュールの glob() と iglob() 関数が最適化され、約 3〜6 倍高速になりました。 (Contributed by Serhiy Storchaka in bpo-25596)

  • pathlib の glob 処理が os.scandir() によって最適化され、約 1.5〜4 倍高速になりました。 (Contributed by Serhiy Storchaka in bpo-26032)

  • xml.etree.ElementTree の解析、反復処理、深いコピーの性能が大幅に改善されました。 (Contributed by Serhiy Storchaka in bpo-25638, bpo-25873, and bpo-25869.)

  • float や Decimal からの fractions.Fraction インスタンスの作成が 2〜3 倍高速になりました。 (Contributed by Serhiy Storchaka in bpo-25971.)

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

  • Python のビルドには、ツールチェーンが C99 の一部をサポートする必要があります。 特に PY_LONG_LONG などの独自マクロに代わり、標準の整数型とマクロを使うようになりました。 詳しくは PEP 7 と bpo-17884 を参照してください。

  • Android NDK を使い、Android API レベルを 21 (Android 5.0 Lollipop) 以降に設定した CPython のクロスコンパイルが成功するようになりました。 Android はまだサポート対象のプラットフォームではありませんが、Python のテストスイートを Android エミュレーターで実行すると、失敗するのは約 16 テストだけです。 Android の関連課題をまとめた bpo-26865 を参照してください。

  • configure フラグ --enable-optimizations が追加されました。 有効にすると PGO などのコストが高い最適化が有効になります。 (Intel の Alecsandru Patrascu による元のパッチ、bpo-26359。)

  • PYMEM_DOMAIN_OBJ (例: PyObject_Malloc()) と PYMEM_DOMAIN_MEM (例: PyMem_Malloc()) の各ドメインのアロケータ関数を呼ぶときは、GIL を保持する必要があります。

  • バッファリングされたデータのフラッシュが失敗したかどうかを示す Py_FinalizeEx() API が追加されました。 (Contributed by Martin Panter in bpo-5319.)

  • PyArg_ParseTupleAndKeywords() が 位置専用パラメータ に対応しました。 位置専用パラメータは空の名前で定義します。 (Contributed by Serhiy Storchaka in bpo-26282)

  • PyTraceback_Print メソッドは、同じ行が長く繰り返される場合に "[Previous line repeated {count} more times]" と省略するようになりました。 (Contributed by Emanuel Barry in bpo-26823.)

  • 新しい PyErr_SetImportErrorSubclass() 関数で、送出する ImportError のサブクラスを指定できます。 (Contributed by Eric Snow in bpo-15767.)

  • 新しい PyErr_ResourceWarning() 関数を使うと、リソースの割り当て元を示す ResourceWarning を発生させられます。 (Contributed by Victor Stinner in bpo-26567.)

  • 新しい PyOS_FSPath() 関数は、path-like object のファイルシステム表現を返します。 (Contributed by Brett Cannon in bpo-27186.)

  • PyUnicode_FSConverter() と PyUnicode_FSDecoder() 関数が パス類オブジェクト を受け付けるようになりました。

その他の改善

  • --version (短縮系: -V) が2回与えられた場合、Python は sys.version で詳細な情報を出力します。

    $ ./python -VV
    Python 3.6.0b4+ (3.6:223967b49e49+, Nov 21 2016, 20:55:04)
    [GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)]
    

非推奨

新たなキーワード

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

非推奨の Python 挙動

ジェネレータ内で StopIteration を送出すると DeprecationWarning が発生するようになりました。 Python 3.7 では RuntimeError になります。 詳しくは PEP 479: ジェネレータ内の StopIteration の処理の変更 を参照してください。

The __aiter__() method is now expected to return an asynchronous iterator directly instead of returning an awaitable as previously. Doing the former will trigger a DeprecationWarning. Backward compatibility will be removed in Python 3.7. (Contributed by Yury Selivanov in bpo-27243.)

バックスラッシュと文字の組み合わせが有効なエスケープシーケンスでない場合、DeprecationWarning が発生するようになりました。 最終的には SyntaxError になりますが、それは今後数回の Python リリースの間には行われません。 (Contributed by Emanuel Barry in bpo-27364.)

相対インポートで __spec__ や __package__ が定義されておらず、呼び出し元モジュールの __name__ と __path__ に頼る場合、ImportWarning が発生するようになりました。 (Contributed by Rose Ames in bpo-25791.)

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

asynchat

asynchat は asyncio により非推奨になりました。 (Contributed by Mariatta in bpo-25002.)

asyncore

asyncore は asyncio により非推奨になりました。 (Contributed by Mariatta in bpo-25002.)

dbm

Unlike other dbm implementations, the dbm.dumb module creates databases with the 'rw' mode and allows modifying the database opened with the 'r' mode. This behavior is now deprecated and will be removed in 3.8. (Contributed by Serhiy Storchaka in bpo-21708.)

distutils

distutils.Distribution コンストラクタの文書化されていない extra_path 引数が非推奨となり、設定すると警告が発生します。 将来の Python リリースでサポートを削除する予定です。 詳しくは bpo-27919 を参照してください。

grp

getgrgid() の非整数の引数のサポートは非推奨になりました。 (Contributed by Serhiy Storchaka in bpo-26129.)

importlib

The importlib.machinery.SourceFileLoader.load_module() and importlib.machinery.SourcelessFileLoader.load_module() methods are now deprecated. They were the only remaining implementations of importlib.abc.Loader.load_module() in importlib that had not been deprecated in previous versions of Python in favour of importlib.abc.Loader.exec_module().

importlib.machinery.WindowsRegistryFinder クラスが非推奨になりました。 3.6.0 の時点では Windows でデフォルトで sys.meta_path に追加されますが、将来のリリースでは変わる可能性があります。

os

os の関数や compile() などで、一般の バイト列類オブジェクト をパスとして使う、文書化されていない機能は非推奨になりました。 (Contributed by Serhiy Storchaka in bpo-25791 and bpo-26754.)

re

正規表現の途中にインラインフラグ (?letters) を置くことは非推奨になり、将来の Python バージョンで削除されます。 正規表現の先頭にフラグを置くことは引き続き可能です。 (Contributed by Serhiy Storchaka in bpo-22493.)

ssl

OpenSSLの0.9.8, 1.0.0 ,1.0.1 は非推奨となっており、長い間サポートされていません。将来的に ssl モジュールは、OpenSSLの1.0.2 もしくは1.1.0が必須になります。

ftplib、http.client、imaplib、poplib、smtplib の certfile、keyfile、check_hostname などの SSL 関連引数が非推奨になりました。 代わりに context を使ってください。 (Contributed by Christian Heimes in bpo-28022.)

ssl モジュールの一部のプロトコルと関数が非推奨になりました。 一部の機能は将来の OpenSSL で利用できなくなります。 ほかの機能は別の API の使用が推奨されるため非推奨になりました。 (Contributed by Christian Heimes in bpo-28022 and bpo-26470.)

tkinter

tkinter.tix モジュールが非推奨になりました。 tkinter のユーザーは代わりに tkinter.ttk を使ってください。

venv

pyvenv スクリプトが非推奨になり、代わりに python3 -m venv を使うことが推奨されます。 これにより、pyvenv がどの Python インタープリタに対応し、仮想環境でどのインタープリタが使われるかという混乱を防げます。 (Contributed by Brett Cannon in bpo-25154.)

xml

  • DTD や外部実体の取得による問題を軽減するため、xml.dom.minidom と xml.sax モジュールはデフォルトでは外部実体を処理しなくなりました。 (Contributed by Christian Heimes in gh-61441.)

C API の非推奨の関数ならびに型

文書化されていない PyUnicode_AsEncodedObject()、PyUnicode_AsDecodedObject()、PyUnicode_AsEncodedUnicode()、PyUnicode_AsDecodedUnicode() 関数が非推奨になりました。 代わりに 汎用のコーデックベースの API を使ってください。

非推奨のビルドオプション

macOS 以外の UNIX プラットフォームでは、configure フラグ --with-system-ffi がデフォルトで有効になりました。 --without-system-ffi で無効にできますが、このフラグの使用は非推奨で、Python 3.7 では使えなくなります。 macOS はこの変更の影響を受けません。 なお、多くの OS ディストリビューターはシステムの Python をビルドする際、すでに --with-system-ffi を使っています。

削除

API と機能の削除

  • 正規表現で '\' と ASCII 文字からなる未知のエスケープを使うとエラーになります。 re.sub() の置換テンプレートではまだ使えますが、非推奨です。 re.LOCALE フラグはバイナリパターンでのみ使えるようになりました。

  • inspect.getmoduleinfo() が削除されました (CPython 3.3 から非推奨でした)。 指定パスのモジュール名を取得するには inspect.getmodulename() を使ってください。 (Contributed by Yury Selivanov in bpo-13248.)

  • traceback.Ignore class and traceback.usage, traceback.modname, traceback.fullmodname, traceback.find_lines_from_code, traceback.find_lines, traceback.find_strings, traceback.find_executable_lines methods were removed from the traceback module. They were undocumented methods deprecated since Python 3.2 and equivalent functionality is available from private methods.

  • tkinter のウィジェットクラスから tk_menuBar() と tk_bindForTraversal() のダミーメソッドが削除されました (対応する Tk コマンドは Tk 4.0 から廃止されていました)。

  • zipfile.ZipFile クラスの open() メソッドが 'U' モードをサポートしなくなりました (Python 3.4 から非推奨でした)。 圧縮されたテキストファイルを universal newlines モードで読むには io.TextIOWrapper を使ってください。

  • 文書化されていない IN、CDROM、DLFCN、TYPES、CDIO、STROPTS モジュールが削除されました。 これらはプラットフォーム固有の Lib/plat-*/ ディレクトリにありましたが、古い状態のまま保守されず、プラットフォームごとの利用可否も一貫していませんでした。 生成に使うスクリプトは引き続きソース配布物の Tools/scripts/h2py.py にあります。

  • 非推奨の asynchat.fifo クラスは削除されました。

Python 3.6 への移植

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

'python' コマンドの挙動の変更

  • COUNT_ALLOCS、SHOW_ALLOC_COUNT、SHOW_TRACK_COUNT マクロを定義した特別な Python ビルドの出力が、デフォルトでは無効になりました。 -X showalloccount オプションで再び有効にできます。 出力先は stdout から stderr に変わりました。 (Contributed by Serhiy Storchaka in bpo-23034.)

Python API の変更

  • open() で 'U' モードフラグと '+' を組み合わせられなくなりました。 (Contributed by Jeff Balogh and John O'Connor in bpo-2091.)

  • sqlite3 は DDL 文の前に、開いているトランザクションを暗黙にコミットしなくなりました。

  • Linux ではセキュリティを高めるため、システムの urandom エントロピープールが初期化されるまで os.urandom() がブロックするようになりました。

  • importlib.abc.Loader.exec_module() を定義する場合は、importlib.abc.Loader.create_module() も定義する必要があります。

  • PyErr_SetImportError() は msg 引数が設定されていない場合、TypeError を設定するようになりました。 以前は NULL を返すだけでした。

  • The format of the co_lnotab attribute of code objects changed to support a negative line number delta. By default, Python does not emit bytecode with a negative line number delta. Functions using frame.f_lineno, PyFrame_GetLineNumber() or PyCode_Addr2Line() are not affected. Functions directly decoding co_lnotab should be updated to use a signed 8-bit integer type for the line number delta, but this is only required to support applications using a negative line number delta. See Objects/lnotab_notes.txt for the co_lnotab format and how to decode it, and see the PEP 511 for the rationale.

  • compileall モジュールの関数は、成功と失敗をそれぞれ 1 と 0 ではなくブール値で返すようになりました。 ブール型は整数のサブクラスなので、1 や 0 との同一性を検査していた場合にのみ問題になるはずです。 bpo-25768 を参照してください。

  • urllib.parse.urlsplit() と urlparse() の結果の port 属性を読む際、値が範囲外の場合は None を返さず ValueError を送出するようになりました。 bpo-20059 を参照してください。

  • imp モジュールは PendingDeprecationWarning の代わりに DeprecationWarning を出すようになりました。

  • 次のモジュールでは、文書化された API と一致するように __all__ 属性に不足していた API が追加されました: calendar, cgi, csv, ElementTree, enum, fileinput, ftplib, logging, mailbox, mimetypes, optparse, plistlib, smtpd, subprocess, tarfile, threading, wave。 これにより import * を使うと新しいシンボルがエクスポートされます。 (Contributed by Joel Taddei and Jacek Kołodziej in bpo-23883.)

  • 相対インポート時に __package__ が __spec__.parent と等しくない場合、ImportWarning が発生するようになりました。 (Contributed by Brett Cannon in bpo-25791.)

  • 親パッケージが分からない状態で相対インポートを行うと、ImportError を送出するようになりました。 以前は SystemError を送出することがありました。 (Contributed by Brett Cannon in bpo-18018.)

  • http.server、xmlrpc.server、wsgiref.simple_server を含む socketserver ベースのサーバーは、Exception から派生する例外だけを捕捉するようになりました。 そのためリクエストハンドラーが SystemExit や KeyboardInterrupt などを送出しても handle_error() は呼ばれず、単一スレッドのサーバーは停止します。 (Contributed by Martin Panter in bpo-23430.)

  • ユーザーに権限がない場合、spwd.getspnam() は KeyError の代わりに PermissionError を送出するようになりました。

  • socket.socket.close() メソッドは、下位のシステムコールがエラー (例えば EBADF) を報告した場合、例外を送出するようになりました。 (Contributed by Martin Panter in bpo-26685.)

  • smtpd.SMTPChannel と smtpd.SMTPServer のコンストラクタの decode_data 引数のデフォルト値が False になりました。 つまり、process_message() に渡される引数はデフォルトで bytes オブジェクトになり、process_message() にはキーワード引数も渡されます。 3.5 の非推奨の警告に従って更新済みのコードは影響を受けません。

  • json モジュールの dump()、dumps()、load()、loads() 関数と、JSONEncoder、JSONDecoder クラスのコンストラクタの省略可能な引数が、すべて キーワード専用 になりました。 (Contributed by Serhiy Storchaka in bpo-18726.)

  • type.__new__ をオーバーライドしていない type のサブクラスは、オブジェクトの型を得るのに1引数形式を利用することができません。

  • PEP 487 の一環として、type に渡されるキーワード引数 (メタクラスを指定する metaclass を除く) の処理は、一貫して object.__init_subclass__() に委譲されるようになりました。 type.__new__ と type.__init__ はどちらも任意のキーワード引数を受け付けますが、type.__new__ から呼ばれる object.__init_subclass__() はデフォルトでは拒否します。 追加のキーワード引数を受け付ける独自のメタクラスは、直接または super を通じた type.__new__ の呼び出しを適切に調整する必要があります。

  • distutils.command.sdist.sdist の default_format 属性が削除され、参照されなくなりました。 代わりにすべてのプラットフォームで gzip 圧縮された tar ファイル形式がデフォルトになり、プラットフォーム固有の選択は行われません。 Windows で配布物をビルドし、ZIP 形式の配布物が必要な場合は、プロジェクトの setup.cfg に次の内容を設定してください:

    [sdist]
    formats=zip
    

    この挙動は Setuptools 26.0.0 により以前の Python バージョンにバックポートされました。

  • urllib.request モジュールと http.client.HTTPConnection.request() メソッドでは、Content-Length ヘッダーフィールドが指定されず、リクエスト本文がファイルオブジェクトの場合、HTTP 1.1 のチャンクエンコーディングで送信するようになりました。 HTTP 1.0 サーバーにファイルオブジェクトを送る必要がある場合は、呼び出し側で Content-Length の値を指定する必要があります。 (Contributed by Demian Brecht and Rolf Krahl with tweaks from Martin Panter in bpo-12319.)

  • DictReader は OrderedDict 型の行を返すようになりました。 (Contributed by Steve Holden in bpo-27842.)

  • プラットフォームがサポートしていない場合、crypt.METHOD_CRYPT は crypt.methods に追加されなくなりました。 (Contributed by Victor Stinner in bpo-25287.)

  • namedtuple() の verbose と rename 引数がキーワード専用になりました。 (Contributed by Raymond Hettinger in bpo-25628.)

  • Linux で ctypes.util.find_library() は、共有ライブラリを探す際に LD_LIBRARY_PATH も参照するようになりました。 (Contributed by Vinay Sajip in bpo-9998.)

  • imaplib.IMAP4 クラスは実際の利用環境との互換性を高めるため、サーバーから送られるメッセージで ']' 文字を含むフラグを扱うようになりました。 (Contributed by Lita Cho in bpo-21815.)

  • mmap.mmap.write() 関数は、ほかの書き込みメソッドと同様に書き込んだバイト数を返すようになりました。 (Contributed by Jakub Stasiak in bpo-26335.)

  • pkgutil.iter_modules() と pkgutil.walk_packages() 関数は ModuleInfo 名前付きタプルを返すようになりました。 (Contributed by Ramchandra Apte in bpo-17211.)

  • re.sub() は置換テンプレートに無効な数値のグループ参照がある場合、パターンが文字列に見つからなくてもエラーを送出するようになりました。 無効なグループ参照のエラーメッセージには、グループのインデックスと参照の位置が含まれるようになりました。 (Contributed by SilentGhost, Serhiy Storchaka in bpo-25953.)

  • zipfile.ZipFile は、認識できない圧縮値に対して NotImplementedError を送出するようになりました。 以前は単なる RuntimeError を送出していました。 また、閉じた ZipFile の ZipFile メソッドを呼んだ場合や、'r' モードで作成した ZipFile の write() を呼んだ場合は、ValueError を送出します。 以前はこれらの場合も RuntimeError を送出していました。

  • 独自のメタクラスを、引数なしの super() やメソッドから暗黙のクロージャー変数 __class__ への直接参照と組み合わせる場合、名前空間の暗黙のエントリー __classcell__ を type.__new__ に渡して初期化する必要があります。 渡さない場合は Python 3.6 で DeprecationWarning、Python 3.8 で RuntimeError が発生します。

  • ModuleNotFoundError の導入により、インポートシステムの利用側は、代替のインポートシステムにも、必要に応じて一般的な ImportError ではなく、このより具体的な例外を送出することを期待するようになる可能性があります。 そのような利用側と将来も互換性を保つため、__import__() を完全に置き換えるインポートシステムの実装者は、モジュールがまったく見つからないときにこの新しいサブクラスを送出するよう更新する必要があります。 デフォルトのインポートシステムに準拠するプラグインの実装者は、変更の必要はないはずです。 デフォルトのインポートシステムが適切な場合に新しいサブクラスを送出するためです。

C API の変更

  • PyMem_Malloc() 系のアロケータが、システムの malloc() ではなく pymalloc アロケータ を使うようになりました。 GIL を保持せずに PyMem_Malloc() を呼び出すアプリケーションはクラッシュする可能性があります。 環境変数 PYTHONMALLOC を debug に設定すると、アプリケーションのメモリアロケータの使用を検証できます。 bpo-26249 を参照してください。

  • Py_Exit() (およびメインインタープリタ) は、バッファリングされたデータのフラッシュに失敗した場合、終了ステータスを 120 に変更するようになりました。 bpo-5319 を参照してください。

CPython バイトコードの変更

Python 3.6 では bytecode にいくつかの大きな変更があります。

  • Python インタープリタがバイトコードの代わりに 16 ビットのワードコードを使うようになりました。 (Contributed by Demur Rumed with input and reviews from Serhiy Storchaka and Victor Stinner in bpo-26647 and bpo-28050.)

  • フォーマット済み文字列リテラル の実装の一部として、FORMAT_VALUE と BUILD_STRING オペコードが追加されました。 (Contributed by Eric Smith in bpo-25483 and Serhiy Storchaka in bpo-27078.)

  • 定数のキーを持つ辞書の作成を最適化する BUILD_CONST_KEY_MAP オペコードが追加されました。 (Contributed by Serhiy Storchaka in bpo-27140.)

  • 関数呼び出しのオペコードが、性能向上と実装の簡素化のために大幅に再構成されました。 MAKE_FUNCTION、CALL_FUNCTION、CALL_FUNCTION_KW、BUILD_MAP_UNPACK_WITH_CALL が変更され、CALL_FUNCTION_EX と BUILD_TUPLE_UNPACK_WITH_CALL が追加されました。 CALL_FUNCTION_VAR、CALL_FUNCTION_VAR_KW、MAKE_CLOSURE は削除されました。 (Contributed by Demur Rumed in bpo-27095, and Serhiy Storchaka in bpo-27213, bpo-28257.)

  • 新しい variable annotation 構文をサポートするため、SETUP_ANNOTATIONS と STORE_ANNOTATION オペコードが追加されました。 (Contributed by Ivan Levkivskyi in bpo-27985.)

Python 3.6.2 の注目すべき変更

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

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

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

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

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

Added in version 3.6.2.

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

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

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

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

バージョン 3.6.2 で変更.

Python 3.6.4 の注目すべき変更

公開 API の一部だったシングルトン PyExc_RecursionErrorInst が削除されました。 そのメンバーがクリアされないため、インタープリタの終了処理中にセグメンテーション違反を引き起こす可能性がありました。 (Contributed by Xavier de Gaye in bpo-22898 and bpo-30697.)

Python 3.6.5 の注目すべき変更

locale.localeconv() 関数は、一部の場合に LC_CTYPE ロケールを一時的に LC_NUMERIC ロケールに設定するようになりました。 (Contributed by Victor Stinner in bpo-31900.)

Python 3.6.7 の注目すべき変更

xml.dom.minidom と xml.sax モジュールは、デフォルトでは外部実体を処理しなくなりました。 gh-61441 も参照してください。

3.6.7 では tokenize モジュールが、末尾に改行のない入力に対して暗黙に NEWLINE トークンを出力するようになりました。 これにより C のトークナイザーの内部動作と一致します。 (Contributed by Ammar Askar in bpo-33899.)

Python 3.6.10 の注目すべき変更

セキュリティ上の重大な懸念により、asyncio.loop.create_datagram_endpoint() での reuse_address 引数は無効になりました。これはソケットオプション SO_REUSEADDR のUDP における挙動が原因です。詳しくは、loop.create_datagram_endpoint() のドキュメントを参照してください。(Kyle Stanley, Antoine Pitrou, Yury Selivanov による貢献 bpo-37228)

Python 3.6.13 の注目すべき変更

以前の Python では urllib.parse.parse_qs() と urllib.parse.parse_qsl() のクエリパラメータの区切りに ; と & の両方を使えました。 セキュリティ上の懸念と、新しい W3C 勧告への準拠のため、区切りは 1 種類のみとなり、デフォルトは & に変更されました。 これらの関数を内部で使う cgi.parse() と cgi.parse_multipart() も影響を受けます。 詳しくは各関数のドキュメントを参照してください。 (Contributed by Adam Goldschmidt, Senthil Kumaran and Ken Jin in bpo-42967.)

Python 3.6.14 の注目すべき変更

セキュリティ修正により、ftplib.FTP はパッシブデータチャネルを確立するとき、リモートサーバーから送られた IPv4 アドレスを信頼しなくなりました。 代わりに FTP サーバーの IP アドレスを再利用します。 従来の動作が必要な特殊なコードでは、FTP インスタンスの trust_server_pasv_ipv4_address 属性を True に設定してください (gh-87451 を参照)。

URL の一部に改行やタブ文字が含まれていると、特定の攻撃が可能になります。 RFC 3986 を更新する WHATWG 仕様に従い、パーサー urllib.parse() は ASCII の改行 \n、\r とタブ \t を URL から取り除き、このような攻撃を防ぐようになりました。 削除対象の文字は、新しいモジュール変数 urllib.parse._UNSAFE_URL_BYTES_TO_REMOVE で制御します (gh-88048 を参照)。