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