# What's New In Python 3.3

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

参考

PEP 398 - Python 3.3 リリーススケジュール

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

新たな文法機能:

- ジェネレータの委譲. のための新しい `yield from` 式

- `str` オブジェクト向けの `u'unicode'` 文法の再適用

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

- `faulthandler` (低水準のクラッシュのデバッグを補助する)

- `ipaddress` (IPアドレスとマスクを表す高水準オブジェクト)

- `lzma` (XZ / LZMA アルゴリズムを使用したデータ圧縮)

- `unittest.mock` (テスト向けにシステムの一部をモックオブジェクトで置き換える)

- `venv` (人気の `virtualenv` パッケージのような、Python virtual environments)

新たな組み込み機能:

- I/O 例外階層 の手直し

実装の改善:

- インポート機構 を、 `importlib` を元に書き換え

- よりコンパクトな ユニコード文字列.

- よりコンパクトな 属性辞書.

ライブラリモジュールの大幅な改善:

- decimal モジュールのCによる高速化

- email モジュールでのより良いユニコード処理 (暫定版)

セキュリティの改善:

- ハッシュのランダム化がデフォルトで有効になりました。

以降はユーザ向けの変更の包括的なリストになっています。

## PEP 405: 仮想環境

仮想環境 (virtual environment) は隔離されたPython環境を作成する手助けをします。 一方で保守を容易にするために、システム全体のインストールを共有します。 仮想環境はそれ自身の site packages (つまりローカルにインストールされたライブラリ) を持ちつつ、任意でシステム全体の site packages と分離できます。 このコンセプトと実装は、人気のサードパーティパッケージである `virtualenv` を元にしていますが、インタプリタコアとの統合による恩恵を受けています。

この PEP はプログラムからのアクセス用の `venv` モジュールと、コマンドラインからのアクセスと管理向けの `pyvenv` スクリプトを追加します。Pythonインタプリタは仮想環境のディレクトリツリーの存在を示す `pyvenv.cfg` をチェックします。

参考

PEP 405 - Python Virtual Environments

  PEP written by Carl Meyer; implementation by Carl Meyer and Vinay Sajip

## PEP 420: 暗黙的な名前空間パッケージ

`__init__.py` マーカーファイルを必要としないパッケージディレクトリと、複数のモジュールパスをネイティブでサポートします(PEP 420 に記載された様々なサードパーティでの名前空間のアプローチに影響されています)

参考

PEP 420 - Implicit Namespace Packages

  PEP written by Eric V. Smith; implementation by Eric V. Smith and Barry Warsaw

## PEP 3118: 新たなメモリビューの実装とバッファプロトコルのドキュメント

PEP 3118 の実装が大幅に改善されました。

新しい memoryview 実装が、Py_buffer 構造体内にフィールドを動的にアロケートする際に多数のクラッシュの報告をもたらしていた全ての所有権問題、ライフタイム問題を包括的に解決しました。加えて、不連続もしくは多次元の入力に対してクラッシュしたり誤った結果を返していた多数の関数が修正されました。

memoryview オブジェクトに、 PEP-3118 準拠の getbufferproc() が追加されています (訳注: バッファオブジェクト構造体 (buffer object structure) 参照)。これはコンシューマの要求型をチェックします。多くの新機能が追加されており、これらのほとんどが不連続配列とサブオフセットを持つ配列に完全な一般化をもたらすものです。

ドキュメント が更新され、エキスポータ(提供側)とコンシューマ(利用側)両方についての責務をより明確に詳細化しています。 バッファ要求のフラグ が、基本フラグと組合せフラグでグループ分けされています。不連続配列と多次元の NumPy スタイル行列のメモリレイアウトについて説明されています。

### フィーチャー

- struct モジュールの構文の全ての native 書式指定文字 をサポートするようになりました ('@' プレフィクスが付いていても良いです)。 (訳注: `format` 参照。)

- いくつかの制限はありますが、 `cast()` メソッドでフォーマット変更と C-contiguous 配列の形状 (shape) の変更を行うことが出来ます。

- 任意の配列型で多次元のリスト表現がサポートされるようになっています。

- 任意の配列型で多次元の比較がサポートされるようになっています。

- 'B', 'b', 'c' いずれかのフォーマットの hashable な (読み出し専用の) 型の1次元メモリビューもまた、 hashable です。 (Contributed by Antoine Pitrou in bpo-13411.)

- 1 次元配列型での任意のスライスがサポートされています。たとえば負の step を与えて memoryview を逆順に並べ替えることが O(1) オーダで出来るようになりました。

### API の変更

- 最大 `次元` は公式に 64 に制限されています。

- 空の `shape`, 空の `strides`, 空の `suboffsets` を表現するのに以前は `None` を用いていましたが今ではこれは空のタプルです。

- フォーマット 'B' (unsigned bytes) での memoryview 要素へのアクセスは整数を返すようになりました (struct モジュールでの構文に従っています)。bytes オブジェクトが欲しければまずビューを 'c' で `cast()` しなければなりません。

- memoryview どうしの比較は被演算対象の論理構造を使って行うようになり、また、全ての配列要素は値で比較されます。struct モジュールの構文の全てのフォーマット文字でサポートされます。認識出来ないフォーマット文字でのビューは今でも許されていますが、ビューの指す中身によらずこれは常に等しくないとされます。

- ほかの変更については、 ビルドならびに C API の変更 と C コードの移植 を参照してください。

(Contributed by Stefan Krah in bpo-10181.)

参考

PEP 3118 - Revising the Buffer Protocol

## PEP 393: 文字列の柔軟な表現

Unicode 文字列型が、複数の内部表現 (1、2 または 4 バイトで表現される Unicode 序数(ordinal) の最大値依存) を、表現される文字列内でサポートするように変更されました (訳注: 以前までは Python のビルド時に固定で決めていました)。このことは全てのシステムにおいて、一般のケースでは空間効率の良い表現をしながらも UCS-4 へのフルアクセスを与えます。既存の API との互換性のために複数の表現が並行で存在することになりますが、徐々にこの互換性はなくされていくはずです。

Python 側にはこの変更による不都合は何もないはずです。

C API 側では PEP 393 は完全に後方互換です。レガシーな API は最低 5 年は残されるはずです。レガシー API を使うアプリケーションはメモリ削減の効能が完全には得られないか、あるいは最悪の場合には少し余計なメモリを使うかもしれません。これは Python がそれぞれの文字列の二つのバージョン (レガシーなフォーマットと新しい効率的な格納方法) を維持する必要があるかもしれないからです

### 機能性

PEP 393 でなされた変更は以下の通りです:

- Python は今や非 BMP 面の文字を含む Unicode コードポイントの完全な範囲 (つまり `U+0000` から `U+10FFFF` まで) を常にサポートします。narrow ビルド / wide ビルドという区別は今では存在していないため、Python は今ではいつでもかつての wide ビルドのように振る舞い、Windows でもこれは例外ではありません。

- narrow ビルドとの決別は、それに付き物だった問題も解決しました。例えば:

  - `len()` は今では非 BMP 面文字について必ず 1 を返します。つまり `len('\U0010FFFF') == 1` です;

  - サロゲートペアが文字列リテラル内で再結合されることはありません。つまり `'\uDBFF\uDFFF' != '\U0010FFFF'` です;

  - 非 BMP 面文字を指すインデクスやスライスは期待通りの値を返します。つまり `'\U0010FFFF'[0]` は今では `'\uDBFF'` ではなく `'\U0010FFFF'` を返します;

  - ほかの全ての標準ライブラリ関数が今では正しく非 BMP コードポイントを処理します。

- `sys.maxunicode` の値は今やいつでも `1114111` (十六進で `0x10FFFF`) です。後方互換性のために C API の `PyUnicode_GetMax()` 関数は今でも `0xFFFF` か `0x10FFFF` のどちらかを返すようになってはいますが、新しい Unicode API とともには使ってはいけません (see bpo-13054)。

- `./configure` スクリプトのフラグ `--with-wide-unicode` は削除されました。

### 性能およびリソース使用量

Unicode 文字列の記憶域サイズが文字列内のコードポイント最大値に依存するようになったということです:

- 純粋な ASCII と Latin1 文字列 (`U+0000-U+00FF`) はコードポイントごとに 1 バイトを占めます;

- BMP 文字列 (`U+0000-U+FFFF`) はコードポイントごとに 2 バイトを占めます;

- 非 BMP 文字列 (`U+10000-U+10FFFF`) はコードポイントごとに 4 バイトを占めます。

結局のところほとんどのアプリケーションにとってのこれの効能は、文字列記憶のためのメモリ使用量が激減することで、これは以前の wide unicode ビルドと比較して顕著です。これは多くの場合、インターナショナルな文脈であってもなお純粋な ASCII が使われるであろうことに関係があります。(というのも多くの文字列が人間向けでない言語として格納されるからです。例えば XML フラグメンツや HTTP ヘッダ、JSON エンコードされたデータ、などなど。)同じ理由から、大きなアプリケーションで CPU キャッシュ活用効率を高めるであろうことも期待出来ます。Python 3.3 のメモリ使用は Python 3.2 の 2 倍から 3 倍小さく、また、Python 2.7 よりも少し良いことが Django ベンチマークでわかっています (詳細は PEP をみてください)。

参考

PEP 393 - 文字列の柔軟な表現 (Flexible String Representation)

  PEP written by Martin von Löwis; implementation by Torsten Becker and Martin von Löwis.

## PEP 397: Windows の Python ランチャ

Python 3.3 の Windows インストーラが、ランチャアプリケーションの `py` をインストールするようになりました。これは Python をバージョンに依存しない方法で起動するのに使われます。

ランチャは `*.py` ファイルをダブルクリックすると暗黙のうちに呼び出されます。システムにインストールされているのが単一の Python バージョンであれば、そのバージョンがファイルの実行に使われます。複数バージョンがインストールされていればデフォルトでは最新バージョンが使われますが、Python スクリプト内で Unix スタイルの「shebang 行 ( `#!` )」を含めることでオーバライド出来ます。

ランチャは明示的にコマンドラインから `py` アプリケーションとして使うことも出来ます。 `py` の実行は暗黙にスクリプトを起動するバージョン選択のルールに従いますが、与えるコマンドライン引数により狙ったバージョンを選択出来ます (たとえば `-3` は Python 2 もインストールされている際に Python 3 を要求し、 `-2.6` はもっと新しいバージョンがインストールされている場合に特定の古いバージョンを要求します)。

ランチャに加え、Windows インストーラには新しくインストールする Python をシステムの PATH に追加するオプションが含まれるようになりました。 (Contributed by Brian Curtin in bpo-3561.)

参考

PEP 397 - Python Launcher for Windows

  PEP written by Mark Hammond and Martin v. Löwis; implementation by Vinay Sajip.

ランチャのドキュメント: Windows の Python ランチャ

インストーラ PATH の調整: Python 実行ファイルを見つける

## PEP 3151: OS および IO 例外階層の手直し

OS エラーが送出する例外の階層が単純化され、粒度が下げられました。

`OSError`、`IOError`、`EnvironmentError`、`WindowsError`、`mmap.error`、`socket.error`、そして `select.error` の中から適切な例外の型を選ぶのに心配する必要はもうありません。 上記の例外の型は全てたった1つ `OSError` になりました。 `OSError` 以外の名前は互換性のためにエイリアスとして残されています。

また、特定のエラー条件を捕捉するのが容易になりました。 `errno` 属性 (または `args[0]`) の特定の定数を `errno` モジュールから調べる代わりに、適切な `OSError` 派生クラスを捕捉することが出来ます。 利用可能な派生クラスは以下の通りです:

- `BlockingIOError`

- `ChildProcessError`

- `ConnectionError`

- `FileExistsError`

- `FileNotFoundError`

- `InterruptedError`

- `IsADirectoryError`

- `NotADirectoryError`

- `PermissionError`

- `ProcessLookupError`

- `TimeoutError`

`ConnectionError` 自身には細かな派生クラスがあります:

- `BrokenPipeError`

- `ConnectionAbortedError`

- `ConnectionRefusedError`

- `ConnectionResetError`

新たな例外のおかげで `errno` の一般的な使い方を避けることが出来ます。 例えば、Python 3.2 向けに書かれた以下のコード:

    from errno import ENOENT, EACCES, EPERM

    try:
        with open("document.txt") as f:
            content = f.read()
    except IOError as err:
        if err.errno == ENOENT:
            print("document.txt file is missing")
        elif err.errno in (EACCES, EPERM):
            print("You are not allowed to read document.txt")
        else:
            raise

は `errno` をインポートしたり手動で例外属性を調べたりせずに書くことが出来ます:

    try:
        with open("document.txt") as f:
            content = f.read()
    except FileNotFoundError:
        print("document.txt file is missing")
    except PermissionError:
        print("You are not allowed to read document.txt")

参考

PEP 3151 - Reworking the OS and IO Exception Hierarchy

  PEP written and implemented by Antoine Pitrou

## PEP 380: サブジェネレータへの委譲構文

PEP 380 は `yield from` 式を追加します。これは ジェネレータ に、その操作の一部をほかのジェネレータに委譲するための式です。これによって `yield` を含んでいるコードのセクションをほかのジェネレータに移動出来るでしょう。加えてサブジェネレータは値を伴って戻ることが出来、その戻り値は委譲した側のジェネレータで使えます。

`yield from` 式がデザインされた主たる動機はサブジェネレータへの委譲として使うことではありますが、実際には任意のサブイテレータに委譲することも出来ます。

単純なイテレータに対して、 `yield from iterable` は本質的には `for item in iterable: yield item` への単なる速記法です:

    >>> def g(x):
    ...     yield from range(x, 0, -1)
    ...     yield from range(x)
    ...
    >>> list(g(5))
    [5, 4, 3, 2, 1, 0, 1, 2, 3, 4]

ですが普通のループとは違って `yield from` ではサブジェネレータは、呼び出し側スコープから `send()` されたり `throw()` された値を直接受け取ることができ、また、外側のジェネレータに最終的な値を返せます:

    >>> def accumulate():
    ...     tally = 0
    ...     while 1:
    ...         next = yield
    ...         if next is None:
    ...             return tally
    ...         tally += next
    ...
    >>> def gather_tallies(tallies):
    ...     while 1:
    ...         tally = yield from accumulate()
    ...         tallies.append(tally)
    ...
    >>> tallies = []
    >>> acc = gather_tallies(tallies)
    >>> next(acc)  # Ensure the accumulator is ready to accept values
    >>> for i in range(4):
    ...     acc.send(i)
    ...
    >>> acc.send(None)  # Finish the first tally
    >>> for i in range(5):
    ...     acc.send(i)
    ...
    >>> acc.send(None)  # Finish the second tally
    >>> tallies
    [6, 10]

この変更を推し進める一番本質にあったものは、たとえ `send` メソッドや `throw` メソッドとともに使われることを前提に設計されたジェネレータであっても、大きな関数を複数のサブ関数に分割するのと同じくらいに、ジェネレータを簡単に複数のサブジェネレータに分割出来るようにすることでした。

参考

PEP 380 - サブジェネレータへの委譲構文

  PEP written by Greg Ewing; implementation by Greg Ewing, integrated into 3.3 by Renaud Blanch, Ryan Kelly and Nick Coghlan; documentation by Zbigniew Jędrzejewski-Szmek and Nick Coghlan

## PEP 409: 例外コンテキストの抑制

PEP 409 は、チェインされた例外コンテキストの表示を無効にするための新構文を導入します。これを使えば例外翻訳して投げ直すようなアプリケーションで、エラーメッセージをわかりやすくすることが出来ます:

    >>> class D:
    ...     def __init__(self, extra):
    ...         self._extra_attributes = extra
    ...     def __getattr__(self, attr):
    ...         try:
    ...             return self._extra_attributes[attr]
    ...         except KeyError:
    ...             raise AttributeError(attr) from None
    ...
    >>> D({}).x
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 8, in __getattr__
    AttributeError: x

元となる要因例外を抑制する `from None` を後置しなければ、もとの例外はデフォルトで表示されます:

    >>> class C:
    ...     def __init__(self, extra):
    ...         self._extra_attributes = extra
    ...     def __getattr__(self, attr):
    ...         try:
    ...             return self._extra_attributes[attr]
    ...         except KeyError:
    ...             raise AttributeError(attr)
    ...
    >>> C({}).x
    Traceback (most recent call last):
      File "<stdin>", line 6, in __getattr__
    KeyError: 'x'

    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 8, in __getattr__
    AttributeError: x

抑制することでデバッグ能力が失われるというわけではなくて、元々の例外コンテキストは利用可能なままです。(例えば介在するライブラリが有益な背後の詳細を不適切に隠してしまっているなど、必要な場合はあるでしょう。)

    >>> try:
    ...     D({}).x
    ... except AttributeError as exc:
    ...     print(repr(exc.__context__))
    ...
    KeyError('x',)

参考

PEP 409 - 例外コンテキストの抑制

  PEP written by Ethan Furman; implemented by Ethan Furman and Nick Coghlan.

## PEP 414: 明示的なユニコードリテラル

Unicode を意識する Python アプリケーションが Python 2 で Unicode リテラルを多用しているとしても Python 3 への移行を容易にするために、Python 3.3 では文字列リテラルへの "`u`" 前置を再びサポートすることにしました。この前置は Python 3 自身では何らの意味も持ちはせず、Python 3 への移行において純粋な機械的変更を要する事項を単に減らすためだけのために提供されます。開発者はもっと重要な意味的変更 (たとえばバイナリとテキストの厳密な区別) に集中すべきなのです。

参考

PEP 414 - 明示的なユニコードリテラル

  PEP written by Armin Ronacher.

## PEP 3155: クラスと関数の正規名

関数オブジェクトとクラスオブジェクトは新たに `__qualname__` 属性を持つようになりました。これはモジュールのトップレベルからその定義までの「道のり (path)」を表現するものです。グローバルな関数とクラスについてはこれは `__name__` と同じです。ほかの場合にはこれは、実際に定義されている場所についてや、グローバルスコープから如何にしてアクセス可能かについて、もっと良い情報を与えてくれます。

(束縛されていない) メソッドでの例:

    >>> class C:
    ...     def meth(self):
    ...         pass
    >>> C.meth.__name__
    'meth'
    >>> C.meth.__qualname__
    'C.meth'

入れ子のクラスでの例:

    >>> class C:
    ...     class D:
    ...         def meth(self):
    ...             pass
    ...
    >>> C.D.__name__
    'D'
    >>> C.D.__qualname__
    'C.D'
    >>> C.D.meth.__name__
    'meth'
    >>> C.D.meth.__qualname__
    'C.D.meth'

入れ子の関数の例:

    >>> def outer():
    ...     def inner():
    ...         pass
    ...     return inner
    ...
    >>> outer().__name__
    'inner'
    >>> outer().__qualname__
    'outer.<locals>.inner'

それらオブジェクトの文字列表現も、この新しくてより正確な情報を含むように変更されています:

    >>> str(C.D)
    "<class '__main__.C.D'>"
    >>> str(C.D.meth)
    '<function C.D.meth at 0x7f46b9fe31e0>'

参考

PEP 3155 - クラスと関数の正規名 (qualified name)

  PEP written and implemented by Antoine Pitrou.

## PEP 412: キー共有辞書

オブジェクト属性を記憶するのに使われる辞書が、内部記憶域の一部 (キーとそれに対応するハッシュ値) を互いに共有出来るようになりました。これにより、組み込みでない型のインスタンスをたくさん作るプログラムのメモリ消費が少なくなります。

参考

PEP 412 - キー共有辞書

  PEP written and implemented by Mark Shannon.

## PEP 362: 関数シグニチャオブジェクト

新たに追加された関数 `inspect.signature()` は、Python 呼び出し可能オブジェクト (callable) を調べることを簡単で直接的なものにしてくれます。幅広い callable をサポートしています:デコレートされているかどうかによらず関数、クラス、 `functools.partial()` オブジェクト。新たに追加されたクラス群 `inspect.Signature`, `inspect.Parameter`, `inspect.BoundArguments` は、アノテーション、デフォルト値、パラメータの種類、束縛されている引数などのような呼び出しシグニチャについての情報を保持し、これによって、デコレータを書いたりあるいは呼び出しシグニチャや引数を検証したり改訂したりするコードを書くことが、非常に単純になります。

参考

PEP 362: - 関数シグニチャオブジェクト

  PEP written by Brett Cannon, Yury Selivanov, Larry Hastings, Jiwon Seo; implemented by Yury Selivanov.

## PEP 421: sys.implementation の追加

`sys` モジュールに新規属性が追加され、これは現在動作中のインタプリタ実装に固有の詳細を公開します。その `sys.implementation` 属性の手始めの集合として、 `name`, `version`, `hexversion`, `cache_tag` が定義されています。

`sys.implementation` の真意は、標準ライブラリによって利用される実装固有の情報を一つの名前空間で一元管理することにあります。このことにより異なる Python 実装が単一の標準ライブラリのコードベースを共有することが、もっとずっと簡単になります。今時点での初期状態では `sys.implementation` は実装固有データのごく一部を保持しているだけです。標準ライブラリの移植性がもっと高くなるように、徐々にこの比率が変わっていくでしょう。

標準ライブラリの移植性を改善した一例が `cache_tag` です。Python 3.3 以降は `sys.implementation.cache_tag` が PEP 3147 をサポートするために `importlib` により使われます。組み込みのインポートシステムのために `importlib` を使う全ての Python 実装が、モジュールのキャッシュの振る舞いを制御するのに `cache_tag` を利用できます。

### SimpleNamespace

`sys.implementation` の実現に伴って Python に新たな型 `types.SimpleNamespace` が導入されることとなりました。 `dict` のようなマッピングベースの名前空間とは対照的に、 `SimpleNamespace` は `object` のような属性ベースです。ですが `object` とは違って `SimpleNamespace` インスタンスは書き込み可能です。つまり普通の属性アクセスを通じて名前空間に追加したり削除したり修正したりできます。

参考

PEP 421 - sys.implementation の追加

  PEP written and implemented by Eric Snow.

## インポート実装としての importlib の使用

bpo-2377 [Replace __import__ w/ importlib.__import__ (__import__ を importlib.__import__ で置き換える)]、 bpo-13959 [Re-implement parts of `imp` in pure Python (`imp` の一部をピュア Python で再実装する)]、 bpo-14605 [Make import machinery explicit (インポート機構を明示的なものにする)]、 bpo-14646 [Require loaders set __loader__ and __package__ (ローダーが __loader__ と __package__ をセットするのを必須とする)]。

`__import__()` 関数を `importlib.__import__()` によって実現するようにしました。これは PEP 302 の「第二段階」を完了させるものです。この変更には複数の恩恵があります。まず最初にこれはインポートの機構を、C コードの奥深くで暗黙に秘密裏に行うのではなく、より透明化します。このことで、Python 3.3 をサポートする全ての Python VM で単一の実装を用いることが出来るようになり、インポートのセマンティクスにおける VM 固有の逸脱と決別する助けともなります。そしてこれはインポート機構の保守をより容易とし、将来起こりうる進化を促します。

一般のユーザにとっては、セマンティクスにおいて目に見える変化はないはずです。今時点でインポートを操作したりインポート呼び出しをプログラム的に行っている場合は、このドキュメントの Python コードの移植 でカバーしているコードの修正が必要になるかもしれません。

### 新たな API

この変更による一番大きな恩恵の一つは、インポート文の動作に何が介在するのかについて露になったことです。つまりかつては様々なインポータが暗黙で行っていたことが、今では完全に `importlib` パッケージの一部として公開されています。

`importlib.abc` で定義される抽象基底クラスは meta path finder と path entry finder の差異を正確に表現するように拡張されて、それぞれ順に `importlib.abc.MetaPathFinder` と `importlib.abc.PathEntryFinder` が導入されました。古い ABC である `importlib.abc.Finder` は後方互換性のためだけに残されますが、何かのメソッドの必要性を強制したりはしません。

ファインダ (finder) の側面からは、 `importlib.machinery.FileFinder` がモジュールのソースファイルおよびバイトコードファイルの検索に使われる機構を公開しています。以前はこのクラスは `sys.path_hooks` の暗黙のメンバでした。

ローダ (loader) については、新規の抽象基底クラス `importlib.abc.FileLoader` が、モジュールのコードを格納する機構としてのファイルシステムを使うローダを書く助けとなります。ソースファイルのローダ (`importlib.machinery.SourceFileLoader`)、ソースを持たないバイトコードのためのローダ (`importlib.machinery.SourcelessFileLoader`)、そして拡張モジュールのためのローダ (`importlib.machinery.ExtensionFileLoader`) が今では直接的に利用出来ます。

`ImportError` には属性 `name` と `path` が追加されて、これには提供すべき関連データがある場合にセットされます。インポート失敗時のメッセージも、これまでのようにモジュール名の末尾だけを与えるのではなく、モジュールの完全名を提供するようになりました。

`importlib.invalidate_caches()` 関数が `sys.path_importer_cache` 内にキャッシュされている全てのファインダの同名メソッドを呼び出すようになりました。これにより必要に応じて記憶されている状態をクリーンアップ出来ます。

### 目に見える変化

潜在的に必要となるかもしれないコード修正については、 Python コードの移植 セクションを参照してください。

`importlib` によって公開されるものが拡がったことによる、インポートについてのほかの目に見える変化があります。最大の変化は `sys.meta_path` と `sys.path_hooks` が、インポートで使われる meta path finder と path entry hook の全てを格納するようになったことです。以前はファインダは直接的に公開されるのではなく、インポートの C コード内に暗黙のものとして隠されていました。このことによって、今では望めば要件に合うようファインダを取り除いたり順序を変えたりといったことが簡単に行えるようになっています。

もう一つの変化は、モジュール生成時に使われたローダを格納する `__loader__` 属性を、全てのモジュールが持つようになったことです。 PEP 302 はローダの実装においてこの属性をセットすることを必須とするよう更新されました。ですので今後サードパーティのローダが更新されれば、この属性の存在に依存出来るようになります。ですがそのときが来るまでは、インポート処理がモジュールのロードの後処理としてセットします。

さらにローダが PEP 366 よりの `__package__` 属性を設定することも期待出来るようになりました。繰り返しになりますがインポート処理自身が既にこれを全てのローダで `importlib` より行っていて、また、インポート処理自身がこの属性をロードの後処理としてセットしています。

`sys.path_hooks` にファインダが見つからない場合に、 `sys.path_importer_cache` に `None` が挿入されるようになりました。 `imp.NullImporter` は `sys.path_hooks` に直接的に公開されないため、これはファインダが見つからないことの表現値としては当てにならないものになりました。

全てのほかの変更は、Python 3.3 へのコードの更新の際に考慮すべきセマンティクスの変更に関係しています。ですのでそららについて、このドキュメントの Python コードの移植 セクションを読むべきです。

(Implementation by Brett Cannon)

## その他の言語変更

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

- Unicode name aliases と named sequences のサポートが追加されました。 `unicodedata.lookup()` と `'\N{...}'` の両方が name aliases の解決を行い、 `unicodedata.lookup()` は named sequences の解決も行います。

  (Contributed by Ezio Melotti in bpo-12753.)

- Unicode データベースを UCD バージョン 6.1.0 にアップグレードしました。

- `range()` オブジェクトどうしの等値性比較が、それぞれの range オブジェクトによって生成されるシーケンスの等値性を反映して行われるようになりました (bpo-13201)。

- `bytes` と `bytearray` オブジェクトのメソッド `count()`, `find()`, `rfind()`, `index()`, `rindex()` が、第一引数に 0 から 255 の整数を受け付けるようになりました。

  (Contributed by Petri Lehtinen in bpo-12170.)

- `bytes` と `bytearray` オブジェクトのメソッド `rjust()`, `ljust()`, `center()` が、 `fill` 引数として `bytearray` を受け付けるようになりました (Contributed by Petri Lehtinen in bpo-12380.)。

- `list` と `bytearray` に新規メソッド `copy()`, `clear()` が追加されました (bpo-10516)。これに伴い `MutableSequence` にも `clear()` メソッドが追加されました (bpo-11388)。

- raw bytes リテラルとして `br"..."` だけでなく `rb"..."` とも書けるようになりました。

  (Contributed by Antoine Pitrou in bpo-13748.)

- `dict.setdefault()` が与えられたキーのルックアップを一度しか行わないようになったので、組み込み型でのこれの使用はアトミックになります。(訳注: 外部観察可能な変化で説明すると、以前はこの呼び出しが、キーの2回の __hash__、__eq__ 呼び出しを引き起こしていたものが、1回になった。)

  (Contributed by Filip Gruszczyński in bpo-13521.)

- 関数呼び出しが関数シグニチャに合致しない場合のエラーメッセージがかなり改善されました。

  (Contributed by Benjamin Peterson.)

## 細粒度のインポートロック

以前のバージョンの CPython では、常に大域的なインポートロックを当てにしていました。このことは意図せず頭痛の種を持ち込むこと繋がっていました。たとえば、モジュールをインポートすることで副作用として異なるスレッドでのコード実行を引き起こす際に起こる、デッドロックといったことです。不恰好な回避策がときどき採用されてきました。C API 関数 `PyImport_ImportModuleNoBlock()` などです。

Python 3.3 ではモジュールのインポートでは、モジュール単位でのロックを採用しています。このことによって複数スレッドからの指定モジュールのインポートは (モジュールが不完全な初期化のまま曝されるのを防いで) 正しく直列化されて、前述の頭痛の種は取り除かれています。

(Contributed by Antoine Pitrou in bpo-9260.)

## 組み込みの関数と型

- `open()` に新規パラメータ opener が追加されました。背後のファイルオブジェクトのファイル記述子は opener を (file, flags) で呼び出して得られます。これは例えば `os.O_CLOEXEC` のようなカスタムなフラグを用いるのに使えます。 / `'x'` モードが追加されました。排他的作成として開きます。ファイルが既存の場合は失敗します。

- `print()`: flush キーワード引数が追加されました。flush キーワード引数が真の場合ストリームは強制的にフラッシュされます。

- `hash()`: ハッシュのランダム化がデフォルトで有効になりました。 `object.__hash__()` と環境変数 `PYTHONHASHSEED` を参照してください。

- `str` 型に `casefold()` メソッドが追加されました。文字列の casefold されたコピーを返します。casefold された文字列は、大文字小文字に関係ないマッチに使えます。例えば `'ß'.casefold()` は `'ss'` を返します。

- シーケンスについてのドキュメントを大幅に書き換えました。バイナリのシーケンスとテキストのシーケンスについての区別についてより良い説明を加え、また、個々の組み込みシーケンスに関して個別のドキュメントを提供しています (bpo-4966)。

## 新たなモジュール

### faulthandler

この新規モジュール `faulthandler` には、異常 (セグメンテーション違反のようなクラッシュ) 時、タイムアウト時、ユーザシグナルの発生時などのタイミングで Python traceback を明示的にダンプするための関数が含まれています。シグナル `SIGSEGV`, `SIGFPE`, `SIGABRT`, `SIGBUS`, `SIGILL` に対するフォールトハンドラをインストールするには、 `faulthandler.enable()` を呼び出してください。インタプリタ開始時点でも有効に出来ます。それには環境変数 `PYTHONFAULTHANDLER` をセットするか、コマンドラインオプション `-X` `faulthandler` を与えます。

Linuxでのセグメンテーションフォールト時の例:

    $ python -q -X faulthandler
    >>> import ctypes
    >>> ctypes.string_at(0)
    Fatal Python error: Segmentation fault

    Current thread 0x00007fb899f39700:
      File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
      File "<stdin>", line 1 in <module>
    Segmentation fault

### ipaddress

新規モジュール `ipaddress` は、IPv4/IPv6 アドレス、ネットワーク、インターフェース (すなわち固有の IP サブネットで関連付けられる IP アドレス) を表現するオブジェクトを生成したり加工したりするための道具立てを提供します。

(Contributed by Google and Peter Moody in PEP 3144.)

### lzma

The newly added `lzma` module provides data compression and decompression using the LZMA algorithm, including support for the `.xz` and `.lzma` file formats.

(Contributed by Nadeem Vawda and Per Øyvind Karlsen in bpo-6715.)

## 改良されたモジュール

### abc

抽象メソッドで構成されるデスクリプタを含む抽象基底クラスのサポートが改善されています。抽象デスクリプタを宣言するために推奨されるアプローチは今後は、動的に更新されるプロパティとして `__isabstractmethod__` を提供することです。この結果として、組み込みのデスクリプタが更新されました。

> - `abc.abstractproperty` は非推奨となりました。代わりに `abc.abstractmethod()` に `property` を渡して使ってください。

> - `abc.abstractclassmethod` は非推奨となりました。代わりに `abc.abstractmethod()` に `classmethod` を渡して使ってください。

> - `abc.abstractstaticmethod` は非推奨となりました。代わりに `abc.abstractmethod()` に `staticmethod` を渡して使ってください。

(Contributed by Darren Dale in bpo-11610.)

`abc.ABCMeta.register()` が登録されたサブクラスを返すようになりました。つまりクラスデコレータとして使うことができるようになったということです (bpo-10868)。

### array

The `array` module supports the `long long` type using `q` and `Q` type codes.

(Contributed by Oren Tirosh and Hirokazu Yamamoto in bpo-1172711.)

### base64

`base64` モジュールのモダンなインターフェイスのほうのデコード関数が、ASCII 文字のみで構成された Unicode 文字列を受け付けるようになりました。たとえば `base64.b64decode('YWJj')` は `b'abc'` を返します。 (Contributed by Catalin Iacob in bpo-13641.)

### binascii

`a2b_` 関数が、バイナリオブジェクトだけでなく ASCII 文字のみで構成された Unicode 文字列を入力として受け付けるようになりました。 (Contributed by Antoine Pitrou in bpo-13637.)

### bz2

`bz2` モジュールが最初から書き直されました。その過程で新機能がいくつか追加されました。

- 新たな `bz2.open()` 関数: bzip2 で圧縮されたファイルをバイナリかテキストモードで開きます。

- `bz2.BZ2File` が、コンストラクタの fileobj 引数で、任意のファイル様オブジェクトの読み書きが出来るようになりました。

  (Contributed by Nadeem Vawda in bpo-5863.)

- `bz2.BZ2File` と `bz2.decompress()` が (pbzip2 ツールで生成されたような) マルチストリームの入力を展開出来るようになりました。同時に `bz2.BZ2File` は、 `'a'` (追記) モードを使ってこのタイプの圧縮ファイルを作るのに使えるようになりました。

  (Contributed by Nir Aides in bpo-1625.)

- `bz2.BZ2File` が、 `io.BufferedIOBase` API で規定されているメソッドや属性のうち、 `detach()` と `truncate()` を除くすべてを実装するようになりました。

### codecs

`mbcs` コーデックが、全ての Windows バージョンでエラーハンドラ `replace` と `ignore` を正しく処理するように書き換えられました。 `mbcs` コーデックは以前は、エンコードでは `replace` のみ、デコードでは `ignore` のみでしたが、これにより全てのエラーハンドラがサポートされます。

新たに Windows のみ用のコーデック `cp65001` が追加されました (bpo-13216)。これは Windows コードページ 65001 (Windows UTF-8, `CP_UTF8`) です。例えばこれはコンソール出力のコードページが (例えば `chcp 65001` コマンドを使って) cp65001 にセットされている場合に `sys.stdout` で使われます。

マルチバイト CJK デコーダの再同期が高速になりました。これは不正なバイトシーケンスが最初のバイトであれば無視するだけです。例えば `b'\xff\n'.decode('gb2312', 'replace')` は文字置き換えののちに `\n` を返すようになっています。

(bpo-12016)

漸増的 CJK コーデックのエンコーダは以前は encode() メソッド呼び出しのたびにリセットしていましたが、リセットしなくなりました。例えば:

    >>> import codecs
    >>> encoder = codecs.getincrementalencoder('hz')('strict')
    >>> b''.join(encoder.encode(x) for x in '\u52ff\u65bd\u65bc\u4eba\u3002 Bye.')
    b'~{NpJ)l6HK!#~} Bye.'

この例の場合は以前の Python では `b'~{Np~}~{J)~}~{l6~}~{HK~}~{!#~} Bye.'` となっていました。

(bpo-12100)

`unicode_internal` コーデックは非推奨となりました。

### collections

新たに追加されたクラス `ChainMap` は、複数のマッピングをひとまとまりに扱えるようにします。 (Written by Raymond Hettinger for bpo-11089, made public in bpo-11297.)

抽象基底クラス群は新しいモジュール `collections.abc` に移動しました。抽象コレクションと具象コレクションを識別しやすくするためです。これをインポートしている既存のコードを維持するために、 ABC の別名群が `collections` モジュール内に残されています。 (bpo-11085)

`Counter` クラスが、単項 `+` 演算子、単項 `-` 演算子、インプレイス演算子の `+=`, `-=`, `|=`, `&=` をサポートするようになりました。(Contributed by Raymond Hettinger in bpo-13121.)

### contextlib

コンテキストマネージャをプログラム的に操作することと、これと類似のクリーンアップの機能性について、`ExitStack` が今後は確かな基礎を提供します。かつての (非推奨となり削除された) `contextlib.nested` API とは違って、この新しい API は、コンテキストマネージャがリソースを (たとえばファイルオブジェクトなどを) `__init__` メソッドで獲得したのか、あるいは (たとえば `threading` モジュールからの同期オブジェクトを) `__enter__` メソッドで獲得したのかとは無関係に正しく動作するように設計されました。

(bpo-13585)

### crypt

`crypt` モジュールに、 salt として使う追加の crypt フォーマット (ハッシュ化メソッド) と `mksalt()` 関数が追加されました。

(bpo-10924)

### curses

> - `curses` モジュールが ncursesw ライブラリとリンクしている場合に、 Unicode 文字列や Unicode 文字が渡されれば Unicode 関数 (例えば `waddwstr()`)、それ以外の場合はバイト列用関数 (例えば `waddstr()`) を呼び出すようにしました。

> - Unicode 文字列をエンコードするのに `utf-8` ではなく locale のエンコーディングを使うようになりました。(---訳注: bpo-12567 に対応した説明と思います。とすればこれは ワイド文字を受け取らない C 関数に渡す 際に Unicode をエンコードする際の話。このときに以前は暗黙で `utf-8` でエンコードしていたのは「誤りである」ということのようです。 ---)

> - `curses.window` クラスに属性 `curses.window.encoding` が追加されました。

> - `curses.window` クラスに `get_wch()` メソッドが追加されました。これはワイド文字を一つ取得します。

> - `curses` モジュールに関数 `unget_wch()` が追加されました。これはワイド文字をプッシュし、次に `get_wch()` を呼び出した時にその値が返るようにします。

(Contributed by Iñigo Serna in bpo-6755.) (---訳注: 最初の2つはおそらく bpo-12567 --)

### datetime

> - naive な `datetime` インスタンスと aware な `datetime` インスタンスの等価比較で、 `TypeError` を投げずに `False` を返すようになりました。 (bpo-15006).

> - 新規メソッド `datetime.datetime.timestamp()`: `datetime` インスタンスに対応する POSIX タイムスタンプを返します。

> - `datetime.datetime.strftime()` メソッドが 1000 年よりも前の書式化をサポートしました。(---訳注: What's New in Python 3.2 での変更も参照してみてください。---)

> - `datetime.datetime.astimezone()` メソッドを引数なしで呼び出せるようになりました。これは datetime インスタンスをシステムのタイムゾーンに変換します。

### decimal

bpo-7652 - decimal 算術演算の、高速なネイティブ 実装の統合

  C-module and libmpdec written by Stefan Krah.

The new C version of the decimal module integrates the high speed libmpdec library for arbitrary precision correctly rounded decimal floating point arithmetic. libmpdec conforms to IBM's General Decimal Arithmetic Specification.

性能向上は、データベースアプリケーションで 10 倍から、数値計算が中心的なアプリケーションで 100 倍まで幅があります。この数字は、 10進数の浮動小数点計算において使われる標準的な精度における期待値です。精度はユーザが変更可能なので、正確な数字は変わる可能性があります。例えば、整数 bignum 計算では、違いはかなりより大きくなるかもしれません。

The following table is meant as an illustration. Benchmarks are available at https://www.bytereef.org/mpdecimal/quickstart.html.

> | decimal.py | _decimal | speedup
> --- | --- | --- | ---
> pi | 42.02s | 0.345s | 120x
> telco | 172.19s | 5.68s | 30x
> psycopg | 3.57s | 0.29s | 12x

#### フィーチャー

- `FloatOperation` シグナル により、float と Decimal の混合の厳密なセマンティクスを有効に出来ます。(---訳注: 使用例が クイックスタートチュートリアル にあります。---)

- Python がスレッド無しでコンパイルされている場合、C 版は自動的にコストがかかるスレッドローカルなコンテキスト機構を使用不可にします。この場合、 `HAVE_THREADS` が `False` にセットされます。

#### API の変更

- C モジュールはマシンアーキテクチャに依存する以下のコンテキストの制限を持ちます:

  > | 32-bit | 64-bit
  > --- | --- | ---
  > `MAX_PREC` | `425000000` | `999999999999999999`
  > `MAX_EMAX` | `425000000` | `999999999999999999`
  > `MIN_EMIN` | `-425000000` | `-999999999999999999`

- コンテキストの雛形 (`DefaultContext`, `BasicContext`, `ExtendedContext`) では `Emax` と `Emin` の絶対値が `999999` に変更されました。

- decimal.py の `Decimal` コンストラクタは上記のコンテキスト制限に無知で、任意の指数や精度で正確に変換しようとします。C 版は内部の制限を持っていますので、次の規則が使われます: 可能ならば値は正確に変換され、そうでない場合 `InvalidOperation` が送出されて結果が NaN となります。後者のケースは丸めあるいは不正確な値を得るために `create_decimal()` を使うことでいつでも可能です。(---訳注: わかりにくい表現ですがコンテキストで InvalidOperation をトラップしていれば結果が NaN で受け取れて(そうでなければ InvalidOperation が投げられて)、その制御は create_decimal で明示的に行える、ということを言っています。---)

- The power function in decimal.py is always correctly rounded. In the C version, it is defined in terms of the correctly rounded `exp()` and `ln()` functions, but the final result is only "almost always correctly rounded".

- C 版ではシグナルを含む辞書は `MutableMapping` です。速度的な理由により `flags` と `traps` はコンテキストが初期化された時点での `MutableMapping` を参照し続けます。新たなシグナル辞書を `flags` に `traps` 割り当てれば新しい値で更新はされるものの、コンテキストはそれら右辺の辞書を参照しません。

- `Context` を pickle 化するとこれまでとは異なる出力をします。これは Python 版と C 版で共通の交換フォーマットを実現するためです。

- `Context` コンストタクタの引数順が `repr()` での表示順に合うように改められました。

- `quantize()` メソッドの `watchexp` パラメータが非推奨となりました。

### email

#### ポリシーフレームワーク

email パッケージに `policy` フレームワークが追加されました。 `Policy` は、 email パッケージがどのように振舞うのかを制御するための多数のメソッドとプロパティを持つオブジェクトです。Python 3.3 のための最初のポリシーは `Compat32` で、これは Python 3.2 の email パッケージとの後方互換性を提供します。 `policy` は、 `parser` によって email メッセージが解析される際、あるいは `Message` オブジェクトを生成する際、あるいは `generator` を用いて email がシリアライズする際に指定出来ます。オーバライドしない限りは、 `parser` に渡されたポリシーは全ての `Message` オブジェクトと `parser` が生成したサブオブジェクトに引き継がれます。デフォルトでは `generator` は、シリアライズしようとする `Message` オブジェクトのポリシーを使います。デフォルトのポリシーは `compat32` です。

すべての `policy` オブジェクトで実装される制御の最小限のセットは以下です:

> max_line_length | `Message` がシリアライズされる際に各行が持ちうる、linesep 文字(列)を含まない最大の行幅です。デフォルトでは 78 です。
> linesep | `Message` がシリアライズされる際に各行を分割するのに使われる文字です。デフォルトは `\n` です。
> cte_type | `7bit` または `8bit` 。 `8bit` は `Bytes` `generator` に対してのみ適用され、プロトコルが許す場所 (あるいはオリジナルの入力に含まれる場所) には非 ASCII が使われうることを示します。
> raise_on_defect | `parser` が異常を検出した場合に、 `Message` オブジェクトの `defects` リストに追加するのではなく例外を送出するようにします。

新たな設定値を持つ新しいポリシーインスタンスは、ポリシーオブジェクトの `clone()` メソッドを使って作られます。 `clone` は任意の上記制御値をキーワード引数として受け取ります。この呼び出しで指定されない制御はデフォルトのまま残されます。ですので linesep 文字列として `\r\n` を使うポリシーをこのようにして作れます:

    mypolicy = compat32.clone(linesep='\r\n')

ポリシーは、あなたのアプリケーションが必要とするフォーマットでメッセージを生成するのを簡単にしてくれます。 `generator` を呼び出す全ての場所で `linesep='\r\n'` を指定するのを忘れないようにする代わりに、あなたのプログラムが `Message` オブジェクトを作成するために使う `parser` あるいは `Message` がポリシーを要求する一箇所だけで指定すれば良いのです。もちろん一方ではメッセージを複数の形式で生成する必要があれば、 `generator` 呼び出しのたびにパラメータで指定する必要があります。もしくは、あなた固有のケースのためにカスタムなポリシーを作って、 `generator` 作成の際にそれを渡すことも出来ます。

#### 新規ヘッダ API を伴った暫定ポリシー

ポリシーフレームワーク単品でもまったくもって価値があるものではありますが、その導入の主たる動機は、それを使わないコードに対しての後方互換を壊さないやり方で、email パッケージに新機能を実現する新しいポリシーを作れるようにすることでした。その新しいポリシーは新規 API を導入するものなので、私たちはそれらを Python 3.3 での 暫定ポリシー としてリリースしました。コア開発者が必要と判断すれば、後方互換性を破壊する (コードの破棄さえも含む) 変更が起こりえます。

その新規ポリシーは `EmailPolicy` のインスタンス (訳注: `email.policy.default` や `email.policy.SMTP` など) です。これには以下の制御が追加されています:

> refold_source | `parser` により解析されたヘッダを、 `generator` が折り返しし直す (refold) かどうかを制御します。 `none`, `long`, `all` のいずれかを指定します。デフォルトは `long` で、ソースのヘッダで `max_line_length` よりも長い行を refold します。 `none` はどの行も refold しません。 `all` は全ての行を refold します。
> header_factory | `name` と `value` を引数に取り、カスタムなヘッダオブジェクトを生成する呼び出し可能 (callable) です。

`header_factory` が、この新規ポリシーにより提供される新機能の要です。この新規ポリシーの一つが使われると、 `Message` オブジェクトから抽出されたすべてのヘッダは `header_factory` で生成されるオブジェクトであり、また、 `Message` にヘッダをセットする場合のいつでも、それは `header_factory` で生成されるオブジェクトになります。すべてのその種のヘッダオブジェクトは、ヘッダ名と同名の `name` 属性を持ちます。アドレスヘッダと日付ヘッダは、ヘッダの解析済み日付にアクセス出来るよう、追加の属性群を持ちます。以下のように使えます:

    >>> m = Message(policy=SMTP)
    >>> m['To'] = 'Éric <foo@example.com>'
    >>> m['to']
    'Éric <foo@example.com>'
    >>> m['to'].addresses
    (Address(display_name='Éric', username='foo', domain='example.com'),)
    >>> m['to'].addresses[0].username
    'foo'
    >>> m['to'].addresses[0].display_name
    'Éric'
    >>> m['Date'] = email.utils.localtime()
    >>> m['Date'].datetime
    datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
    >>> m['Date']
    'Fri, 25 May 2012 21:44:27 -0400'
    >>> print(m)
    To: =?utf-8?q?=C3=89ric?= <foo@example.com>
    Date: Fri, 25 May 2012 21:44:27 -0400

Unicode の display name が、メッセージがシリアライズされる際に自動的に `utf-8` (訳注: 実行例の場合は「の MIME ヘッダエンコード」) でエンコードされ、ヘッダに直接アクセスすると Unicode で返ることに気付くと思います。つまり `email.header` の `decode_header()` 関数や `make_header()` 関数を取り扱う必要性を取り除いてくれています。

アドレスを部品から組み立てることも出来ます:

    >>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
    ...                           Address('Sally', 'sally', 'example.com')]),
    ...            Address('Bonzo', addr_spec='bonz@laugh.com')]
    >>> print(m)
    To: =?utf-8?q?=C3=89ric?= <foo@example.com>
    Date: Fri, 25 May 2012 21:44:27 -0400
    cc: pals: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>

Unicode へデコードするのは自動で行われます:

    >>> m2 = message_from_string(str(m))
    >>> m2['to']
    'Éric <foo@example.com>'

メッセージ解析の際、グループと個々のアドレスにアクセスするのにヘッダオブジェクトの `addresses` 属性と `groups` 属性を使えます:

    >>> m2['cc'].addresses
    (Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
    >>> m2['cc'].groups
    (Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))

要するに新規ポリシーのどれか一つを使うことは、ヘッダ操作をこのようなものにしてくれるということです: あなたのアプリケーションは Unicode 文字列でお仕事をし、email パッケージは Unicode のエンコード/デコードを透過的に行って RFC 標準 Content Transfer Encoding との相互変換をやってのける、と。

#### その他のAPIの変更

`BytesHeaderParser` が `parser` モジュールに追加されました。これは `HeaderParser` を補足するものであり、また、 bytes API を完全にする (訳注: What's New in Python 3.2 での email の変更内容参照) ものです。

新しいユーティリティ関数:

> - `format_datetime()`: `datetime` を与えると email ヘッダで使われる書式でフォーマットした文字列を生成します。

> - `parsedate_to_datetime()`: email ヘッダからの日付文字列を渡すと、 aware な、または naive な `datetime` に変換します。オフセットが `-0000` の場合に naive で返します。

> - `localtime()`: 引数なしで呼び出すと、ローカル `timezone` を使った aware な `datetime` として現在ローカル時間を返します。aware な `datetime` を渡して呼び出すと、ローカル `timezone` を使った aware な `datetime` に変換します。

### ftplib

- `ftplib.FTP` に新しいキーワード引数 `source_address` が追加されました。 `(host, port)` の形で指定し、これは外に向かうソケットを作成する際に `bind()` 呼び出し内でのソースアドレスとして用いられます。 (Contributed by Giampaolo Rodolà in bpo-8594.)

- `FTP_TLS` クラスに、制御チャネルを平文に戻すための `ccc()` 関数が追加されました。これは、固定ポートで開くことなく非セキュア FTP で NAT を処理する方法を知っているファイアウォールを利用するのに有用となりえます。(Contributed by Giampaolo Rodolà in bpo-12139.)

- 新規メソッド `ftplib.FTP.mlsd()` は機械で読めるディレクトリリスティングのフォーマットを提供し、 `ftplib.FTP.nlst()` と `ftplib.FTP.dir()` に取って代わるものとなりました。(Contributed by Giampaolo Rodolà in bpo-11072.)

### functools

`functools.lru_cache()` デコレータにキーワード引数 `typed` を指定出来るようになりました (デフォルトは `False` です)。これは異なった型の等値比較のキャッシュ値を別々のキャッシュスロットに置くかどうかを決めます。(Contributed by Raymond Hettinger in bpo-13227.)

### gc

ガーベージコレクタが回収前後に呼び出すコールバックを登録出来るようになりました。新規属性 `callbacks` リストに登録します。

### hmac

タイミング解析によるダイジェストに対する サイドチャンネル攻撃 からの防御のために、 `compare_digest()` 関数が追加されました。(Contributed by Nick Coghlan and Christian Heimes in bpo-15061.)

### http

`http.server.BaseHTTPRequestHandler` がヘッダをバッファするようになり、 `end_headers()` 呼び出し時に一度に全てをまとめて書き出すようになりました。新規のメソッド `flush_headers()` は、集積したヘッダを送信する場合の管理に直接使うことが出来ます。(Contributed by Andrew Schaaf in bpo-3709.)

`http.server` が正当な `HTML 4.01 strict` 出力を生成するようになりました。 (Contributed by Ezio Melotti in bpo-13295.)

`http.client.HTTPResponse` にメソッド `readinto()` が追加されました。つまりこのクラスを `io.RawIOBase` のように扱えるということです。 (Contributed by John Kuhn in bpo-13464.)

### html

`html.parser.HTMLParser` が壊れたマークアップをエラーなしで解析出来るようになりました。これによりコンストラクタの strict 引数と `HTMLParseError` 例外が撤廃されました。この壊れたマークアップを解析出来る能力は数多くのバグフィックスからの結果であり、それらは Python 2.7/3.2 の最新バグフィックスリリースでも利用可能です。(Contributed by Ezio Melotti in bpo-15114, and bpo-14538, bpo-13993, bpo-13960, bpo-13358, bpo-1745761, bpo-755670, bpo-13357, bpo-12629, bpo-1200313, bpo-670664, bpo-13273, bpo-12888, bpo-7311.)

`html.entities` モジュールに、HTML5 名前付き文字参照と Unicode 文字(列) とを対応付ける `html5` 辞書が追加されました (例: `html5['gt;'] == '>'`)。この辞書は既に `HTMLParser` が使っています。 (Contributed by Ezio Melotti in bpo-11113 and bpo-15156.)

### imaplib

`IMAP4_SSL` コンストラクタが SSLContext パラメータを受け取るようになりました。これはセキュアなチャネルのパラメータを制御します。

(Contributed by Sijin Joseph in bpo-8808.)

### inspect

`getclosurevars()` 関数が追加されました。この関数は、指定した関数の関数本体から参照されている現在束縛されている全ての名前と、それら名前が解決された場所 (訳注: globals, builtins など) を報告します。これにより、ステートフルなクロージャに依存するコードをテストするのに、正しい内部状態を検証するのが容易になります。

(Contributed by Meador Inge and Nick Coghlan in bpo-13062.)

`getgeneratorlocals()` 関数が追加されました。この関数は、指定したジェネレータのスタックフレーム内のローカル変数の、現在束縛されているものを報告します。これにより、ジェネレータをテストするのに、正しい内部状態を検証するのが容易になります。

(Contributed by Meador Inge in bpo-15153.)

### io

`open()` 関数に排他的作成に使用する新たな `'x'` モードが追加されました。ファイルが既に存在する場合は `FileExistsError` を送出します。 C11 fopen() の 'x' モードに基づいています。

(Contributed by David Townshend in bpo-12760.)

`TextIOWrapper` のコンストラクタにオプショナルな引数 write_through が追加されました。 write_through が `True` の場合、`write()` の呼び出しはバッファされないことが保証されます。 `TextIOWrapper` オブジェクトに書かれた全てのデータは直ちに下層のバイナリ buffer に処理されます。

### itertools

`accumulate()` がユーザ提供二項関数を渡すためのオプショナル引数 `func` を受け付けるようになりました。

### logging

`basicConfig()` 関数がオプショナルな `handlers` 引数をサポートするようになりました。これはルートロガーに追加するハンドラ群の イテラブル です。

`SysLogHandler` クラスに、クラスレベル属性の `append_nul` が追加されました。これは syslog レコードに `NUL` (`\000`) バイトを追加するかどうかを制御します。これはあるデーモンはこれで終端することが必要な一方でほかはメッセージの一部として NUL を通すという、デーモンによって振る舞いが異なることに対応するためです。

### math

`math` モジュールに新たな関数 `log2()` が追加されました。x の 2 を底とする対数を返します。

(Written by Mark Dickinson in bpo-11888.)

### mmap

`read()` メソッドの他のファイルライクなオブジェクトとの互換性が増しました。引数が省略されるか `None` の場合に、ファイルの現在位置からマッピングの末尾までのバイト列を返すようになっています。(Contributed by Petri Lehtinen in bpo-12021.)

### multiprocessing

関数 `multiprocessing.connection.wait()` が追加されました。これは複数の (接続やソケット、パイプのような) オブジェクトをタイムアウト付きでポーリングします。(Contributed by Richard Oudkerk in bpo-12328.)

プロセス間で　(訳注: `Connection.send()` と `Connection.recv()` で) `multiprocessing.Connection` オブジェクトを相互に転送出来るようになりました。 (Contributed by Richard Oudkerk in bpo-4892.)

`multiprocessing.Process` がキーワード引数 `daemon` を取るようになりました。これは親プロセスから `daemon` フラグを継承するデフォルトの振る舞いをオーバライドします (bpo-6064)。

属性 `multiprocessing.Process.sentinel` が追加されました。これを用いることで、ふさわしい OS プリミティブ (例えば POSIX システムでの `select`) を使った一括での複数 `Process` オブジェクト待ちが可能です。

`map()` と `itertools.starmap()` との関係と同じ、既存の `multiprocessing.pool.Pool.map()` と `map_async()` に対応する `multiprocessing.pool.Pool.starmap()` と `starmap_async()` が追加されました。 (Contributed by Hynek Schlawack in bpo-12708.)

### nntplib

`nntplib.NNTP` クラスがコンテキスト管理プロトコルをサポートするようになりました。with ブロックを抜ける際に無条件に NNTP 接続をクローズします (クローズ処理で発生する `socket.error` は無視されます)。:

    >>> from nntplib import NNTP
    >>> with NNTP('news.gmane.org') as n:
    ...     n.group('gmane.comp.python.committers')
    ...
    ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
    >>>

(Contributed by Giampaolo Rodolà in bpo-9795.)

### os

- `os` モジュールに `pipe2()` 関数が追加されました。これはフラグ `O_CLOEXEC` と `O_NONBLOCK` を (論理和指定で) セットしたパイプをアトミックに作ることが出来ます。これはマルチスレッドプログラムでの競合状態を避けるために特に有用です。

- `os` モジュールに `sendfile()` 関数が追加されました。これはあるファイル (またはソケット) 記述子からのコピーを、効率的な「ゼロコピー」で行います。「ゼロコピー」という言い回しは、これは二つの記述子間でのデータのコピー全てが完全にカーネルによって行われる、という事実について指しています。データコピーにユーザ空間のバッファは使われません。 `sendfile()` は例えばファイルのダウンロードのような、ディスク上のファイルとネットワークソケット間での効率的なデータコピーに使うことが出来ます。

  (Patch submitted by Ross Lagerwall and Giampaolo Rodolà in bpo-10882.)

- シンボリックリンク攻撃や一時ファイル、一時ディレクトリにまつわる問題のような競合状態を避けるには、ファイル名の代わりにファイル記述子を操作することがより信頼出来ます (そして高速でもあります)。 Python 3.3 はファイル記述子で動作するよう既存関数の強化と新規関数の追加を行ないました。 (bpo-4761, bpo-10755 and bpo-14626)

  - `os` モジュールの新規関数 `fwalk()` は `walk()` と似ていますが、これは訪問するディレクトリを指すファイル記述子も yield します。これは特にシンボリックリンクの競合を避けるために有用です。

  - 関数 `access()`, `chflags()`, `chmod()`, `chown()`, `link()`, `lstat()`, `mkdir()`, `mkfifo()`, `mknod()`, `open()`, `readlink()`, `remove()`, `rename()`, `replace()`, `rmdir()`, `stat()`, `symlink()`, `unlink()`, `utime()` が、新たな 2 つのオプショナルなキーワード引数のどちらか、または両方をサポートするようになりました。 dir_fd (paths relative to directory descriptors) と follow_symlinks (not following symlinks) です。プラットフォームがそれらパラメータをサポートするかどうかは `os.supports_dir_fd` と `os.supports_follow_symlinks` を調べることでわかります。

  - 関数 `chdir()`, `chmod()`, `chown()`, `execve()`, `listdir()`, `pathconf()`, `exists()`, `stat()`, `statvfs()`, `utime()` が、パス引数としてファイル記述子をサポートするようになりました。これをプラットフォームがサポートするかどうかは `os.supports_fd` を調べることでわかります。

- `access()` がキーワード引数 `effective_ids` を受け取るようになりました。これは実 uid/gid の代わりに実効 uid/gid を使ってアクセスチェックを行うように振る舞いを変更します。これをプラットフォームがサポートするかどうかは `supports_effective_ids` を調べることでわかります。

- `os` モジュールに 2 つの関数が追加されました。 `getpriority()` と `setpriority()` です。これらはプロセスのナイス値/優先度 (niceness/priority) を `os.nice()` と似た方法で取得・設定しますが、現在プロセスだけのものだけではなく全てのプロセスに対して使えるよう拡張されています。

  (Patch submitted by Giampaolo Rodolà in bpo-10784.)

- 新規関数 `os.replace()` は変更先の上書きにおいてクロスプラットフォームな方法でファイル名変更を行えます。既存の `os.rename()` では、変更先が既存のファイルの場合に POSIX では上書き、Windows ではエラーとなります。(Contributed by Antoine Pitrou in bpo-8828.)

- stat 系関数 (`stat()`, `fstat()`, `lstat()`) がファイルのタイムスタンプのナノ秒精度を読み取れるようになりました。これと対となる `utime()` もファイルのタイムスタンプをナノ秒精度で書き出せるようになりました。 (Contributed by Larry Hastings in bpo-14127.)

- 新規関数 `os.get_terminal_size()` はファイル記述子が接続しているターミナルウィンドウのサイズを取得します。 `shutil.get_terminal_size()` も参照して下さい。 (Contributed by Zbigniew Jędrzejewski-Szmek in bpo-13609.)

- Linux 拡張属性をサポートするための新たな関数 (bpo-12720): `getxattr()`, `listxattr()`, `removexattr()`, `setxattr()`.

- スケジューラに対する新たなインターフェイス。これら関数はプロセスに対する OS による CPU 時間割り当てを制御します。新規関数: `sched_get_priority_max()`, `sched_get_priority_min()`, `sched_getaffinity()`, `sched_getparam()`, `sched_getscheduler()`, `sched_rr_get_interval()`, `sched_setaffinity()`, `sched_setparam()`, `sched_setscheduler()`, `sched_yield()`,

- ファイルシステムを制御する新たな関数:

  - `posix_fadvise()`: データへアクセスする意思を、パターンを指定して宣言します。これによりカーネルが最適化を行えるようになります。

  - `posix_fallocate()`: ファイルを割り当てるに十分なディスクスペースを確保します。

  - `sync()`: ディスクへの全ての書き込みを強制します。

- 追加された新たな POSIX 関数:

  - `lockf()`: オープンされたファイル記述子に対して、POSIX ロックの適用、テスト、解除を行います。

  - `pread()`: ファイル記述子の指定オフセット位置から読み込みます。ファイルオフセットは変化しません。

  - `pwrite()`: ファイル記述子に対し、指定オフセット位置から書き出します。ファイルオフセットは変化しません。

  - `readv()`: ファイル記述子からデータを読みこんで複数の書き込み可能なバッファに書き込みます。

  - `truncate()`: path に対応するファイルを、サイズが最大で length バイトになるよう切り詰めます。

  - `waitid()`: 一つ以上の子プロセスの完了を待ちます。

  - `writev()`: buffers の内容をファイル記述子へ書き出します。 buffer は任意のバッファのシーケンスです。

  - `getgrouplist()` (bpo-9344): 指定したユーザが属するグループ ID のリストを返します。

- `times()` および `uname()`: 戻り値の型がタプルから属性名のついたタプルライクオブジェクトに変更されました。

- いくつかのプラットフォームにおいて、 `lseek()` 関数で使う追加の定数をサポートするようになりました。 `os.SEEK_HOLE` や `os.SEEK_DATA` などです。

- 新規の定数 `RTLD_LAZY`, `RTLD_NOW`, `RTLD_GLOBAL`, `RTLD_LOCAL`, `RTLD_NODELETE`, `RTLD_NOLOAD`, `RTLD_DEEPBIND` が、それをサポートしているプラットフォームで利用可能になりました。これらは `sys.setdlopenflags()` 関数で使います。これら定数は `ctypes` モジュールと `DLFCN` で定義されている同じような定数を置き換えるものです。(Contributed by Victor Stinner in bpo-13226.)

- クロスプラットフォームのサポートを簡単にするために、非 Windows 環境でも `os.symlink()` がキーワード引数 `target_is_directory` を受け付けるようになりました (単に無視します)。

### pdb

`Tab` キーでの補完がコマンド名だけでなくその引数に対しても使えるようになりました。例えば `break` コマンドに対しては、関数、ファイル名が補完されます。

(Contributed by Georg Brandl in bpo-14210)

### pickle

`pickle.Pickler` オブジェクトに pickler ごとのリダクション関数を設定する、オプショナルな `dispatch_table` 属性が追加されました。

(Contributed by Richard Oudkerk in bpo-14166.)

### pydoc

Tk GUI と `serve()` 関数は `pydoc` モジュールから削除されました。 `pydoc -g` と `serve()` は Python 3.2 から既に非推奨となっていました。

### re

`str` 正規表現が `\u` および `\U` エスケープをサポートしました。

(Contributed by Serhiy Storchaka in bpo-3665.)

### sched

- `run()` が blocking パラメータを取るようになりました。 これを偽にセットすると、このメソッドは既に実行予定時間になっているイベント (もしあれば) を実行してすぐに戻ります。 これは `scheduler` を非ブロッキングなアプリケーションで使いたい場合に有用です。 (Contributed by Giampaolo Rodolà in bpo-13449.) (---訳注: 原文の表現がわかりにくいですが、これは `blocking=False` 時はスケジュールされた時間になっているタスクがあれば通常は delayfunc を呼び出すところをそうせずに、一番早く次の予定時間に達するタスクの予定時間までの時間差を返します。---)

- `scheduler` クラスをマルチスレッド環境で安全に使えるようになりました。 (Contributed by Josiah Carlson and Giampaolo Rodolà in bpo-8684.)

- `scheduler` クラスのコンストラクタでのパラメータ timefunc と delayfunc が省略可能になりました。それぞれデフォルトで順に `time.time()`, `time.sleep()` が使われます。 (Contributed by Chris Clark in bpo-13245.)

- `enter()` と `enterabs()` の argument パラメータが省略可能になりました。 (Contributed by Chris Clark in bpo-13245.)

- `enter()` と `enterabs()` が kwargs パラメータを受け付けるようになりました。 (Contributed by Chris Clark in bpo-13245.)

### select

Solaris とその派生プラットフォームにおいて、新規クラス `select.devpoll` が追加されました。これはハイパフォーマンスな非同期ソケットを `/dev/poll` 経由で提供するものです。 (Contributed by Jesús Cea Avión in bpo-6397.)

### shlex

これまで `pipes` モジュールにいて文書化もされてこなかったヘルパー関数 `quote` が、 `shlex` に移動の上で文書化されました。この `quote()` は、文字列内でシェルによって何か特別な意味を与えられている全ての文字を適切にエスケープします。

### shutil

- 新たな関数:

  - `disk_usage()`: ディスクの利用状況について、トータル、使用中、空きの容量を返します。 (Contributed by Giampaolo Rodolà in bpo-12442.)

  - `chown()`: 指定された path のユーザ、グループの両方あるいは一方を変更します。ユーザ、グループは名前もしくは数値での ID (uid, gid) で指定します。(Contributed by Sandro Tosi in bpo-12191.)

  - `shutil.get_terminal_size()`: インタプリタが接続しているターミナルウィンドウのサイズを取得します。 (Contributed by Zbigniew Jędrzejewski-Szmek in bpo-13609.)

- `copy2()` と `copystat()` がファイルのタイムスタンプを、それをサポートするプラットフォームではナノ秒精度も維持するようになりました。また、Linux ではこれらは「拡張属性 (extended attributes)」もコピーするようになりました。 (Contributed by Larry Hastings in bpo-14127 and bpo-15238.)

- いくつかの関数がオプショナルな `symlinks` 引数を取るようになりました。これが真の場合、シンボリックリンクの指す先を解決するのではなくシンボリックそのものに対しての操作をします (そうすることが必要であればシンボリックリンク作成もします)。(Contributed by Hynek Schlawack in bpo-12715.)

- ファイルシステムをまたがったファイルのコピーの際に、 `move()` がシンボリックリンクを POSIX の `move` コマンドが行うのと同じやり方で扱うようになりました。つまりターゲットのファイルの中身をコピーするのではなくシンボリックリンクを再作成します。(Contributed by Jonathan Niehof in bpo-9993.) また、 `move()` は `dst` 引数を戻り値として返すようになりました。

- `os.open()` と `os.unlink()` が新パラメータ `dir_fd` をサポートしているプラットフォームでは、 `rmtree()` は今では シンボリックリンク攻撃に耐性を持ちます。 (Contributed by Martin von Löwis and Hynek Schlawack in bpo-4489.)

### signal

- `signal` モジュールに新規関数が追加されました:

  - `pthread_sigmask()`: これを呼び出すスレッドにセットされているシグナルマスクを取り出したり変更したりします (Contributed by Jean-Paul Calderone in bpo-8407);

  - `pthread_kill()`: スレッドにシグナルを送ります;

  - `sigpending()`: 保留中のシグナルを調べます;

  - `sigwait()`: シグナルを待ちます;

  - `sigwaitinfo()`: シグナルを待ちますが、それについての詳細情報を返します;

  - `sigtimedwait()`: `sigwaitinfo()` と似ていますがタイムアウト指定できます。

- シグナルハンドラは wakeup ファイル記述子に以前は `\0` を書き込んでいましたが、シグナル番号を 1 バイト整数として書き込むようにしました。これにより、一つ以上のシグナルを待った上でどのシグナルが発生したのかあとから調べるといったことが出来ます。

- `signal.signal()` と `signal.siginterrupt()` は RuntimeError ではなく `OSError` を投げるようになりました: OSError は errno 属性を持っています。

### smtpd

`smtpd` モジュールが RFC 5321 (extended SMTP) と RFC 1870 (size extension) をサポートするようになりました。標準により、これら拡張を有効にするための必要十分条件はクライアントがセッションを `EHLO` コマンドで開始することです。

(Initial `ELHO` support by Alberto Trevino. Size extension by Juhana Jauhiainen. Substantial additional work on the patch contributed by Michele Orrù and Dan Boswell. bpo-8739)

### smtplib

クラス `SMTP`, `SMTP_SSL`, `LMTP` に新しいキーワード引数 `source_address` が追加されました。 `(host, port)` の形で指定し、これは外に向かうソケットを作成する際に `bind()` 呼び出し内でのソースアドレスとして用いられます。(Contributed by Paulo Scardine in bpo-11281.)

`SMTP` がコンテキスト管理プロトコルをサポートするようになったので `SMTP` のインスタンスを `with` 文で使えます。 (Contributed by Giampaolo Rodolà in bpo-11289.)

`SMTP_SSL` コンストラクタと `starttls()` メソッドが SSLContext パラメータを受け取るようになりました。これはセキュアなチャネルのパラメータを制御します。 (Contributed by Kasun Herath in bpo-8809.)

### socket

- `socket` クラスが、前提となるプラットフォームがサポートしていれば従属的なデータを処理する追加のメソッドを公開しました:

  - `sendmsg()`

  - `recvmsg()`

  - `recvmsg_into()`

  (Contributed by David Watson in bpo-6560, based on an earlier patch by Heiko Wundram)

- `socket` クラスが Linux で (https://lwn.net/Articles/253425) PF_CAN プロトコルファミリ (https://en.wikipedia.org/wiki/Socketcan) をサポートしました。

  (Contributed by Matthias Fuchs, updated by Tiago Gonçalves in bpo-10141.)

- `socket` クラスが PF_RDS プロトコルファミリ (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets および https://oss.oracle.com/projects/rds/) をサポートするようになりました。

- `socket` クラスが OS X で `PF_SYSTEM` プロトコルファミリをサポートするようになりました。 (Contributed by Michael Goderbauer in bpo-13777.)

- New function `sethostname()` allows the hostname to be set on Unix systems if the calling process has sufficient privileges. (Contributed by Ross Lagerwall in bpo-10866.)

### socketserver

`BaseServer` がオーバライド可能な `service_actions()` メソッドを持つようになり、これは `serve_forever()` によりサービスループ内で呼び出されます。 `ForkingMixIn` がこれをゾンビ化した子プロセスのクリーンアップに使っています。 (Contributed by Justin Warkentin in bpo-11109.)

### sqlite3

`sqlite3.Connection` の新規のメソッド `set_trace_callback()` を使うと sqlite3 により処理されるすべての sql コマンドの足跡 (トレース) をキャプチャ出来ます。(Contributed by Torsten Landschoff in bpo-11688.)

### ssl

- `ssl` モジュールに新たに 2 つの乱数生成関数が追加されました:

  - `RAND_bytes()`: 暗号学的に強固な擬似乱数バイト列を生成します。

  - `RAND_pseudo_bytes()`: 擬似乱数バイト列を生成します。

  (Contributed by Victor Stinner in bpo-12049.)

- `ssl` モジュールがより粒度の細かい例外階層を公開するようになり、これにより様々な種類のエラーを調べることが容易になります。 (Contributed by Antoine Pitrou in bpo-11183.)

- `load_cert_chain()` が password 引数を受け付けるようになりました。これは秘密鍵が暗号化されている場合に使われます。 (Contributed by Adam Simpkins in bpo-12803.)

- ディフィー・ヘルマン鍵共有の、通常のものと楕円曲線ベースのもの両方が `load_dh_params()` メソッドと `set_ecdh_curve()` メソッドを通じてサポートされるようになりました。(Contributed by Antoine Pitrou in bpo-13626 and bpo-13627.)

- SSL ソケットに新規メソッド `get_channel_binding()` が追加されました。これは SCRAM-SHA-1-PLUS (訳注: RFC 5802 など参照) のようなある種の認証メカニズムの実装で拡張されることを想定したものです。(Contributed by Jacek Konieczny in bpo-12551.)

- `compression()` メソッドが追加されたので、SSL ソケットで使われている SSL 圧縮アルゴリズムを問い合わせることが出来ます。また、新規の属性 `OP_NO_COMPRESSION` で圧縮を無効に出来ます。(Contributed by Antoine Pitrou in bpo-13634.)

- `ssl.SSLContext.set_npn_protocols()` による Next Protocol Negotiation 拡張のサポートが追加されました。 (Contributed by Colin Marc in bpo-14204.)

- 属性 `library` と `reason` が追加されたので、SSL のエラーは以前よりもっと簡単に調べることが出来るようになりました。(Contributed by Antoine Pitrou in bpo-14837.)

- `get_server_certificate()` 関数が IPv6 をサポートするようになりました。 (Contributed by Charles-François Natali in bpo-11811.)

- 新規属性 `OP_CIPHER_SERVER_PREFERENCE` は SSLv3 サーバソケットに対し、暗号の優先順位をクライアントのものではなくサーバのものを使うようにします。 (bpo-13635)

### stat

ドキュメントされていなかった `tarfile.filemode` 関数が `stat.filemode()` に移動されました。これはファイルモードを '-rwxrwxrwx' 形式の文字列に変換するのに使えます。

(Contributed by Giampaolo Rodolà in bpo-14807.)

### struct

`struct` モジュールが新たに `ssize_t` (コード `n`)、 `size_t` (コード `N`) をサポートするようになりました。 (Contributed by Antoine Pitrou in bpo-3163.)

### subprocess

POSIX プラットフォームにおいて、コマンド文字列として bytes オブジェクトを渡せるようになりました。 (Contributed by Victor Stinner in bpo-8513.)

新規定数 `DEVNULL` は、プラットフォームに依存しない方法で出力を抑制するのに使えます。 (Contributed by Ross Lagerwall in bpo-5870.)

### sys

`sys` モジュールに、スレッドの実装に関する情報が格納された 名前付きタプル を保持する `thread_info` が追加されました。 (bpo-11223)

### tarfile

`tarfile` が `lzma` モジュールにより `lzma` エンコーディングをサポートするようになりました (Contributed by Lars Gustäbel in bpo-5689.)。

### tempfile

`tempfile.SpooledTemporaryFile` の `truncate()` メソッドが `size` 引数を受け取るようになりました。 (Contributed by Ryan Kelly in bpo-9957.)

### textwrap

`textwrap` モジュールに `indent()` が追加されました。これはテキストのブロック内の選択行に共通のプレフィクスを追加する簡単な方法になります。(bpo-13857)

### threading

いずれもかつてインスタンスを返すファクトリ関数であった `threading.Condition`, `threading.Semaphore`, `threading.BoundedSemaphore`, `threading.Event`, `threading.Timer` がクラスになったので、サブクラス化出来るようになりました。 (Contributed by Éric Araujo in bpo-10968.)

`threading.Thread` コンストラクタがキーワード引数 `daemon` を取るようになりました。これは親スレッドから `daemon` フラグを継承するデフォルトの振る舞いをオーバライドします (bpo-6064)。

かつての非公開関数 `_thread.get_ident` が公開関数 `threading.get_ident()` として利用可能となっています。これは標準ライブラリにおいて多数の `_thread` モジュールへの直接アクセスを取り除く結果になりました。 `_thread.get_ident` を使っているサードパーティのコードも同じように、新しく公開化されたインターフェイスに乗り換えるべきです。

### time

PEP 418 が `time` モジュールに新たな関数を追加しました:

- `get_clock_info()`: クロックの情報を取得します。

- `monotonic()`: 単調なクロック (逆行しない)、システムクロックの更新の影響を受けません。

- `perf_counter()`: 短期間の計測のために利用可能な最高の解像度を持つパフォーマンスカウンタです。

- `process_time()`: 現在のプロセスの system と user CPU 時間の和です。

その他の新たな関数:

- 関数 `clock_getres()`, `clock_gettime()`, `clock_settime()` と、これに使われる定数群 `CLOCK_xxx` の追加。 (Contributed by Victor Stinner in bpo-10278.)

クロスプラットフォーム間での一貫性を改善するために、 `sleep()` が負の値を渡すと `ValueError` を投げるように変更されています。以前から POSIX システムではエラーでしたが、Windows の場合に無限に sleep していました。

### types

新規クラス `types.MappingProxyType` の追加: 読み出し専用のマッピングのプロキシです。 (bpo-14386)

新規関数 `types.new_class()` と `types.prepare_class()` は PEP 3115 準拠の動的な型の生成サポートを提供します。(bpo-14588)

### unittest

メソッド `assertRaises()`, `assertRaisesRegex()`, `assertWarns()`, `assertWarnsRegex()` が、コンテキストマネージャとして使われる際にキーワード引数 msg を受け付けるようになりました。 (Contributed by Ezio Melotti and Winston Ewert in bpo-10775.)

`unittest.TestCase.run()` が `TestResult` オブジェクトを返すようになりました。

### urllib

`Request` クラスが `get_method()` で使われる method 引数を受け付けるようになりました。これはどの HTTP メソッドが使われるべきかを指定します。例えば以下は `'HEAD'` リクエストを送信します:

    >>> urlopen(Request('https://www.python.org', method='HEAD'))

(bpo-1673007)

### webbrowser

`webbrowser` モジュールがさらに多くの "browsers" をサポートしました: Google Chrome (バージョンと OS 依存で名前が chrome, chromium, chrome-browser, あるいは chromium-browser) と、汎用のランチャ xdg-open (FreeDesktop.org プロジェクトのもの) と gvfs-open (GNOME 3 のデフォルト URI ハンドラ)。 (The former contributed by Arnaud Calmettes in bpo-13620, the latter by Matthias Klose in bpo-14493.)

### xml.etree.ElementTree

`xml.etree.ElementTree` モジュールはデフォルトで C 実装による高速版をインポートするようになりました; もう明示的に `xml.etree.cElementTree` をインポートする必要はありません (cElementTree モジュールは後方互換のために残されますが非推奨となりました)。また、 `Element` クラスの `iter` 系のメソッドに最適化が施されました (C で再実装されました)。また、このモジュールのドキュメントは大幅に改善されて、実例が追加され、さらに詳細なリファレンスになりました。

### zlib

New attribute `zlib.Decompress.eof` makes it possible to distinguish between a properly formed compressed stream and an incomplete or truncated one. (Contributed by Nadeem Vawda in bpo-12646.)

新規属性 `zlib.ZLIB_RUNTIME_VERSION` は実行時にロードされた背後の `zlib` ライブラリのバージョン文字列です。 (Contributed by Torsten Landschoff in bpo-12306.)

## 最適化

大きな性能向上がありました:

- PEP 393 により、Unicode 文字列に対する操作が最適化されました:

  - メモリフットプリントはテキストに依存して 1/2 から 1/4 になりました

  - ASCII 文字列を UTF-8 にエンコードするのに文字をエンコードする必要はなくなりました、UTF-8 表現は ASCII 表現と共有されます

  - UTF-8 エンコーダが最適化されました

  - 単一の ASCII 文字を繰り返して ASCII 文字列の部分列を得るのは 4 倍速くなりました

- UTF-8 が2倍から4倍速くなりました。UTF-16 のエンコーディングが最大で10倍速くなりました。

  (Contributed by Serhiy Storchaka, bpo-14624, bpo-14738 and bpo-15026.)

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

Python のビルド過程と C API の変更は以下の通りです:

- 新しい PEP 3118 関連の関数:

  - `PyMemoryView_FromMemory()`

- PEP 393 により追加された新たな Unicode 型、マクロ、関数:

  - 高水準 API:

    - `PyUnicode_CopyCharacters()`

    - `PyUnicode_FindChar()`

    - `PyUnicode_GetLength()`, `PyUnicode_GET_LENGTH`

    - `PyUnicode_New()`

    - `PyUnicode_Substring()`

    - `PyUnicode_ReadChar()`, `PyUnicode_WriteChar()`

  - 低水準 API:

    - 型 `Py_UCS1`, `Py_UCS2`, `Py_UCS4`

    - 構造体 `PyASCIIObject` と `PyCompactUnicodeObject`

    - `PyUnicode_READY`

    - `PyUnicode_FromKindAndData()`

    - `PyUnicode_AsUCS4()`, `PyUnicode_AsUCS4Copy()`

    - `PyUnicode_DATA`, `PyUnicode_1BYTE_DATA`, `PyUnicode_2BYTE_DATA`, `PyUnicode_4BYTE_DATA`

    - `PyUnicode_Kind` 列挙型での `PyUnicode_KIND`: `PyUnicode_WCHAR_KIND`, `PyUnicode_1BYTE_KIND`, `PyUnicode_2BYTE_KIND`, `PyUnicode_4BYTE_KIND`

    - `PyUnicode_READ`, `PyUnicode_READ_CHAR`, `PyUnicode_WRITE`

    - `PyUnicode_MAX_CHAR_VALUE`

- `PyArg_ParseTuple` が `c` フォーマットとして `bytearray` を許容するようになりました (bpo-12380)。

## 非推奨

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

保守する者がいないため OS/2 ならびに VMS はもはやサポートされません。

保守の負担のため WIndows 2000 および `COMSPEC` を `command.com` に設定している Windows プラットフォームはもはやサポートされません。

3.2 で非推奨だった OSF のサポートが完全に削除されました。

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

- object 型そのものの `object.__format__()` に空でない文字列が渡すことは非推奨となりました。Python 3.4 ではこれは `TypeError` となります (bpo-9856)。

- PEP 393 により、 `unicode_internal` コーデックは非推奨となりました。UTF-8, UTF-16 (`utf-16-le` または `utf-16-be`), あるいは UTF-32 (`utf-32-le` または `utf-32-be`) を使ってください。

- `ftplib.FTP.nlst()` および `ftplib.FTP.dir()`: `ftplib.FTP.mlsd()` を使ってください

- `platform.popen()`: `subprocess` モジュールを使ってください。 古い関数を subprocess モジュールで置き換える を是非お読みください (bpo-11377)。

- bpo-13374: `os` モジュールにある Windows のバイト列 API は非推奨となりました。ANSI コードページに依存しないようにしてあらゆるファイル名をサポートするために、バイト列文字列のファイル名ではなく Unicode ファイル名を使ってください。

- bpo-13988: `xml.etree.cElementTree` モジュールは非推奨です。利用できる際はいつでも自動的にアクセラレータを使用します。

- `time.clock()` の振る舞いがプラットフォーム依存のため、今後は要件に応じて新たに追加された `time.perf_counter()` または `time.process_time()` を使ってください。これらの振る舞いは良く定義されています(well defined)。

- `os.stat_float_times()` 関数は非推奨です。

- `abc` モジュール:

  - `abc.abstractproperty` は非推奨となりました。代わりに `abc.abstractmethod()` に `property` を渡して使ってください。

  - `abc.abstractclassmethod` は非推奨となりました。代わりに `abc.abstractmethod()` に `classmethod` を渡して使ってください。

  - `abc.abstractstaticmethod` は非推奨となりました。代わりに `abc.abstractmethod()` に `staticmethod` を渡して使ってください。

- `importlib` パッケージ:

  - バイトコードファイルとしての `importlib.abc.SourceLoader.path_stats()` によりコンパイル時点の修正時刻とソースファイルサイズの両方を格納するようになったので、 `importlib.abc.SourceLoader.path_mtime()` は非推奨となりました。

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

PEP 393 で `Py_UNICODE` は非推奨になり、Python 4 で削除されます。この型を使用している全ての関数は非推奨です。

Unicode functions and methods using `Py_UNICODE` and `Py_UNICODE*` types:

- `PyUnicode_FromUnicode`: `PyUnicode_FromWideChar()` または `PyUnicode_FromKindAndData()` を使用してください

- `PyUnicode_AS_UNICODE`, `PyUnicode_AsUnicode()`, `PyUnicode_AsUnicodeAndSize()`: `PyUnicode_AsWideCharString()` を使用してください

- `PyUnicode_AS_DATA`: `PyUnicode_READ` および `PyUnicode_WRITE` とともに `PyUnicode_DATA` を使用してください

- `PyUnicode_GET_SIZE`, `PyUnicode_GetSize()`: `PyUnicode_GET_LENGTH` または `PyUnicode_GetLength()` を使用してください

- `PyUnicode_GET_DATA_SIZE`: `PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)` を使用してください (既存の文字列でのみうまくいきます)

- `PyUnicode_AsUnicodeCopy()`: `PyUnicode_AsUCS4Copy()` または `PyUnicode_AsWideCharString()` を使用してください

- `PyUnicode_GetMax()`

Py_UNICODE* 文字列を操作する関数ならびにマクロ:

- `Py_UNICODE_strlen`: `PyUnicode_GetLength()` または `PyUnicode_GET_LENGTH` を使用してください

- `Py_UNICODE_strcat`: `PyUnicode_CopyCharacters()` または `PyUnicode_FromFormat()` を使用してください

- `Py_UNICODE_strcpy`, `Py_UNICODE_strncpy`, `Py_UNICODE_COPY`: `PyUnicode_CopyCharacters()` または `PyUnicode_Substring()` を使用してください

- `Py_UNICODE_strcmp`: `PyUnicode_Compare()` を使用してください

- `Py_UNICODE_strncmp`: `PyUnicode_Tailmatch()` を使用してください

- `Py_UNICODE_strchr`, `Py_UNICODE_strrchr`: `PyUnicode_FindChar()` を使用してください

- `Py_UNICODE_FILL`: `PyUnicode_Fill()` を使用してください

- `Py_UNICODE_MATCH`

エンコーダ:

- `PyUnicode_Encode()`: `PyUnicode_AsEncodedObject()` を使用してください

- `PyUnicode_EncodeUTF7()`

- `PyUnicode_EncodeUTF8()`: `PyUnicode_AsUTF8()` または `PyUnicode_AsUTF8String()` を使用してください

- `PyUnicode_EncodeUTF32()`

- `PyUnicode_EncodeUTF16()`

- `PyUnicode_EncodeUnicodeEscape()`: `PyUnicode_AsUnicodeEscapeString()` を使用してください

- `PyUnicode_EncodeRawUnicodeEscape()`: `PyUnicode_AsRawUnicodeEscapeString()` を使用してください

- `PyUnicode_EncodeLatin1()`: `PyUnicode_AsLatin1String()` を使用してください

- `PyUnicode_EncodeASCII()`: `PyUnicode_AsASCIIString()` を使用してください

- `PyUnicode_EncodeCharmap()`

- `PyUnicode_TranslateCharmap()`

- `PyUnicode_EncodeMBCS()`: (`CP_ACP` code_page とともに) `PyUnicode_AsMBCSString()` または `PyUnicode_EncodeCodePage()` を使用してください

- `PyUnicode_EncodeDecimal()`, `PyUnicode_TransformDecimalToASCII()`

### 非推奨の機能

`array` モジュールの `'u'` 書式化コードは非推奨となりました。Python 4 ではほかの (`Py_UNICODE`) API と一緒に削除されるでしょう。

## Python 3.3 への移植

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

### Python コードの移植

- ハッシュのランダム化がデフォルトで有効になりました。これを無効にするには環境変数 `PYTHONHASHSEED` を `0` にセットして下さい。 `object.__hash__()` メソッドも参照して下さい。

- bpo-12326: Linux では、 `sys.platform` はもはやメジャーバージョン番号を含みません。 これは今では常に 'linux' です。以前はこれは Python のビルドに使われた Linux バージョンに依存した `'linux2'` や `'linux3'` でした。 `sys.platform == 'linux2'` などとするのではなく、 `sys.platform.startswith('linux')` とするか、古い Python バージョンのサポートが不要であれば直接的に `sys.platform == 'linux'` として下さい。

- bpo-13847, bpo-14180: `time` および `datetime`: タイムスタンプが範囲外の場合に、 `ValueError` ではなく `OverflowError` を送出するようになりました。また、C 関数の `gmtime()` あるいは `localtime()` が失敗した場合には `OSError` を送出するようになりました。

- インポートで使われるデフォルトのファインダが、特定のディレクトリに何が含まれるのかについてのキャッシュを利用するようになっています。実行中に Python ソースファイルやバイトコードファイルを作ったら、キャッシュをクリアしてファインダが新しく作られたファイルに気付けるように、 `importlib.invalidate_caches()` を呼ぶ必要があることに注意してください。

- `ImportError` がインポートを試みたモジュール名として完全名を使うようになっています。ImportError のメッセージをチェックする doctest は、モジュール名をその末尾の名前ではなく完全な名前を使うように更新する必要があります。

- `__import__()` の引数 index のデフォルトが -1 ではなく 0 となり、また、もはや負の値はサポートされません。デフォルト値が -1 で残されたのは(訳注: つまり絶対、相対インポートの両方を試みるようにしたのは) PEP 328 を実装した際の過失でした。絶対インポートに先立って相対インポートを実行する振る舞いがまだ必要なのであれば、index を 1 にして相対インポートを実行して、その後で index 0 のインポートをするようにしてください。そうなのですが、 `__import__()` を直接呼び出すのではなく、 `importlib.import_module()` を使うことが望ましいやり方です。

- `__import__()` の index に、トップレベルモジュールに対して 0 でなく 1 を与えることは今では許されません。例えば `__import__('sys', level=1)` はエラーです。

- `sys.meta_path` と `sys.path_hooks` にデフォルトでファインダが含まれるようになったので、これらリストの操作で `list.append()` してきたのであれば、今後はおそらくほとんどは `list.insert()` が相応しいでしょう。

- ファインダが見つからない場合に `sys.path_importer_cache` に `None` が挿入されるようになったので、ファインダを持たないパスの辞書エントリをクリアするには、後方互換性を保つためには `imp.NullImporter` を値に持つエントリと `None` を値に持つエントリ の両方を 削除する必要があります。古い Python バージョンと比較して、暗黙のファインダを使うことを示すのに `sys.path_importer_cache` に `None` を再挿入するという追加のオーバヘッドが必要となりますが、意味的には何の変更もないはずです。

- `importlib.abc.Finder` no longer specifies a `find_module()` abstract method that must be implemented. If you were relying on subclasses to implement that method, make sure to check for the method's existence first. You will probably want to check for `find_loader()` first, though, in the case of working with path entry finders.

- `pkgutil` は、内部的に `importlib` を使うように変更されました。このことは、 PEP 302 インポートエミュレーションの古い振る舞いが本物のインポートシステムの振る舞いに合わせるのに失敗していた数多くの特殊ケースの問題を取り除きます。インポートエミュレーションそのものはまだ存在しますが、今では非推奨です。 `pkgutil.iter_importers()` 関数と `pkgutil.walk_packages()` 関数は標準インポートフックを特別に扱うので、ファインダの `iter_modules()` メソッドは標準ではないにも関わらず、まだサポートされます。

- `email.header.decode_header()` によってなされる解析に長い間存在していた RFC 非準拠のバグ (bpo-1079) が修正されました。エンコードされたヘッダを Unicode に変換するための標準的なイディオム (`str(make_header(decode_header(h))`) を使うコードからは変化はみえません。ですが、 decode_header から返される個々のタプル要素を見ているコードでは、 `ASCII` セクションの前後の空白が `ASCII` 内に含まれるようになったことがわかります。 `make_header` は入力文字列に既に存在していなければ `ASCII` 非 `ASCII` セクション間に以前と同じく空白を追加するので、 `make_header` を使ってヘッダを構築するコードは変更なしで動作するはずです。

- `email.utils.formataddr()` は非 ASCII の display name に対し正しい content transfer encoding の扱いをするようになっています。かつての、フォーマット後文字列内に非 ASCII Unicode を維持してしまう誤った振る舞いに依存するすべてのコードは、変更の必要があります。 (bpo-1690608)

- `poplib.POP3.quit()` メソッドもほかの全ての `poplib` のメソッドと同じく、今ではプロトコルエラーを送出し得ます。 `quit` が `poplib.error_proto` エラーを送出しないことをあてにしていたコードは、 `quit` でのエラーが特定のアプリケーションにとって問題となるようであれば、修正の必要があるかもしれません (bpo-11291)。

- Python 2.4 から非推奨となっていた、 `email.parser.Parser` への `strict` 引数はついに削除されました。

- 非推奨となっていたメソッド `unittest.TestCase.assertSameElements` は削除されました。

- 非推奨となっていた変数 `time.accept2dyear` は削除されました。

- 非推奨となっていた `Context._clamp` 属性が `decimal` モジュールから削除されました。以前に既にこれは公開属性 `clamp` に置き換えられていました (bpo-8540 参照)。

- 文書化されていなかった内部ヘルパクラス `SSLFakeFile` が `smtplib` モジュールより削除されました。この機能はずっと以前から `socket.socket.makefile()` によって直接的に提供されています。

- Windows では `time.sleep()` に負値を与えた場合に無限に眠っていましたが、今ではこれは例外を送出します。POSIX ではこれは以前より常に例外です。

- 定数 `ast.__version__` は削除されました。AST バージョンに依拠して何かしらの決定をする必要があるのであれば、 `sys.version_info` を使ってください。

- `threading` モジュールの、非公開クラスをサブクラス化するファクトリ関数を迂回していたコードは、今では公開クラスになったので修正の必要があります。

- threading モジュール内の文書化されていなかったデバッグ機構を削除してコードを単純化しました。このことが製品コードに影響することがあってはなりませんが、これと連携していたアプリケーションデバッグフレームワークのケースがありうるので、言及しておきます (bpo-13550)。

### C コードの移植

- バッファ API 変更の一環で、文書化されてこなかった `Py_buffer` 構造体のメンバ `smalltable` が削除され、また、 `PyMemoryViewObject` のレイアウトが変更されました。

  `memoryobject.h` あるいは `object.h` での関係する部分に依存する全ての拡張は、再ビルドが必要です。

- PEP 393 により、 `Py_UNICODE` 型とこの型を使う全ての関数は非推奨となりました (ただし最低 5 年は利用可能なまま保たれます)。Unicode オブジェクトの構築とアクセスに低水準 Unicode API をこれまで使っていて、 PEP 393 によって提供されるメモリフットプリント削減の恩恵を受けたければ、新しい Unicode API に乗り換える必要があります。

  一方で `PyUnicode_Concat()` 、 `PyUnicode_Join()` あるいは `PyUnicode_FromFormat()` といった高水準関数のみを使ってきたのであれば、あなたのコードは自動的に新しい Unicode 表現に便乗できます。

- `PyImport_GetMagicNumber()` は失敗時に `-1` を返すようになりました。

- `__import__()` の level 引数に負値を渡すことはもはや有効ではないので、対応する `PyImport_ImportModuleLevel()` でも同じです。このことは `PyImport_ImportModuleEx()` に使われる level の値が `-1` ではなく `0` を使うようになったことも意味しています。

### C 拡張のビルド

- C 拡張のファイル名として認められる範囲が狭められました。滅多に使われてこなかった命名は取りやめられました: POSIX では、 `xxxmodule.so`, `xxxmodule.abi3.so`, `xxxmodule.cpython-*.so` 命名は今後 `xxx` モジュールの実装とは認識されません。これまでそのようなファイルを作ってきたのであれば、別の命名に乗り換えてください (つまり `module` 文字列をファイル名から取り除いてください)。

  (implemented in bpo-14040.)

### コマンドラインスイッチの変更

- `-Q` コマンドラインスイッチとそれに関係するものは削除されました。 `sys.flags.division_warning` をチェックしているコードは修正する必要があります。

  (bpo-10998, contributed by Éric Araujo.)

- `-S` スイッチ付きで python を開始すると、 `import site` がモジュール検索パスにサイト固有のパスを追加しなくなります。以前のバージョンではそれをしていました。

  (bpo-11591, contributed by Carl Meyer with editions by Éric Araujo.)