# What's New In Python 3.4

著者

  R. David Murray <rdmurray@bitdance.com> (編集者)

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

参考

PEP 429 -- Python 3.4 リリーススケジュール

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

新たな文法機能:

- Python 3.4 に追加された新しい文法機能はありません。

その他の新しい機能:

- pip が常に利用可能であることが保障されるようになりました (PEP 453)。

- 新しく作成されたファイル記述子が継承不可能 （non-inheritable） になりました (PEP 446)。

- 隔離モード (isolated mode) の為のコマンドラインオプション (bpo-16499)。

- 非テキストエンコーディングでの Codec 処理の改良 (複数の issue に関係).

- インポートシステムのための ModuleSpec 型 (PEP 451). (インポーターの作者に影響します)

- `marshal` フォーマットが よりコンパクトで効率的に なりました (bpo-16475)。

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

- `asyncio`: 非同期 IO のための新たな暫定 API (PEP 3156)。

- `ensurepip`: pip インストーラのブートストラップ (PEP 453)。

- `enum`: 列挙型のサポート (PEP 435)。

- `pathlib`: オブジェクト指向のファイルシステムパス (PEP 428)。

- `selectors`: 高水準で効率的な I/O の多重化、`select` モジュールプリミティブを基にしています (PEP 3156 の一部)。

- `statistics`: 基礎的な 数値的に安定な統計ライブラリ (PEP 450)。

- `tracemalloc`: Python のメモリ割り当てのトレース (PEP 454)。

大幅に改善されたライブラリモジュール:

- `functools` の シングルディスパッチジェネリック関数 (PEP 443)。

- `pickle` の新しい プロトコル 4 (PEP 3154).

- `multiprocessing` が Unix で os.fork の使用を避けるオプションを持つようになりました (bpo-8713)。

- `email` にサブモジュール `contentmanager` が追加され、また、 `Message` のサブクラス (`EmailMessage`) が追加されました。これは MIME 処理を簡単にします 。 (bpo-18891)

- `inspect` と `pydoc` が以前よりも遥かに幅広い種類の callable オブジェクトを正しくイントロスペクション出来るようになり、これは Python `help()` システムを改善することになりました。

- `ipaddress` モジュール API は安定だと宣言されました。

セキュリティの改善:

- 安全で取り替え可能なハッシュアルゴリズム (PEP 456)。

- ファイル記述子が子プロセスにリークするのを防ぐために 新しく作成されたファイル記述子が継承不可になりました (PEP 446)。

- 隔離モード (isolated mode) のための新たなコマンドラインオプション (bpo-16499)。

- `multiprocessing` が Unix で os.fork の使用を避けるオプション を持つようになりました。 子プロセスとのデータ共有を避けるため spawn と forkserver はより安全です。

- Windows での `multiprocessing` 子プロセスはもはや、必要なものを除いて親の継承可能なハンドルを継承しません。

- 新たな関数 `hashlib.pbkdf2_hmac()` は PKCS#5 パスワードベースの鍵導出関数２ を提供します。

- `ssl` での TLSv1.1、 TLSv1.2 サポート の追加。

- `ssl` での Windows のシステム証明書ストアよりの証明書抽出サポート の追加。

- `ssl` での サーバサイド SNI (Server Name Indication) サポート の追加。

- `ssl.SSLContext` クラスに 多数の改善 がなされました。

- SSL をサポートする全ての標準ライブラリモジュールは今や、ホスト名のマッチング (`ssl.match_hostname()`) と証明書失効リスト (CRLs=certification revocation lists。 `ssl.SSLContext.load_verify_locations()` 参照) を含むサーバ証明書検証をサポートします。

CPython の実装の改善:

- オブジェクトの安全なファイナライゼーション (PEP 442)。

- PEP 442 を活用することで、ほとんどのケースで モジュールのグローバルがファイナライゼーション中に None がセットされることはなくなりました (bpo-18214)。

- 設定可能なメモリアロケータ (PEP 445)。

- Argument Clinic (PEP 436)。

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

## 新しい機能

### PEP 453: Python インストール時の PIP の明示的なブートストラッピング

#### デフォルトでの pip のブートストラッピング

新しい `ensurepip` モジュール(PEP 453 で定義されています)は標準のクロスプラットフォームのメカニズムで、Python インストールと仮想環境に pip インストーラをブートストラップします。Python 3.4.0 に含まれる `pip` のバージョンは `pip` 1.5.4 で、将来の 3.4.x メンテナンスリリースでは Python のリリース候補の作成時点で入手出来る最新バージョンの `pip` がバンドルされる予定です。

デフォルトでは `pipX` , `pipX.Y` コマンドが全てのプラットフォームに、Python パッケージ `pip` とその依存物とともにインストールされます(X. Y はインストールされる Python のバージョン)。Windows 実環境と全てのプラットフォームの仮想環境には、バージョンが名前に付与されない `pip` コマンドもインストールされます。ほかのプラットフォームでは、システムワイドでバージョンが名前に付与されない `pip` コマンドは、典型的には Python 2 を別途インストールした際のものを指しています。

`pyvenv` コマンドラインユーティリティと `venv` モジュールは、仮想環境で `pip` が使えるようにするために `ensurepip` モジュールを使います。 コマンドラインユーティリティを使う際は `pip` はデフォルトでインストールされます。 `venv` モジュールの API を使う際は、 `pip` のインストールは明示的に要求しなければなりません。

CPython の source builds on POSIX systems では `make install`, `make altinstall` コマンドはデフォルトで `pip` ブートストラップを行います。この振る舞いは configure のオプションを変更して Makefile を作ることで変更できます。

Windows と Mac OS X では CPython インストーラはそれ自身と一緒に `pip` をデフォルトでインストールするようになっています(ユーザはインストールプロセスで除外するかもしれませんが)。Windows ユーザは `pip` がコマンドラインからデフォルトで利用可能なように `PATH` の自動修正するかの選択を求められます。そうしない場合でも Windows のための Python ランチャで `py -m pip` のようにすれば良いです。

discussed in the PEP の通りプラットフォームのパッケージャは、プラットフォームでのそれらインストールの単純明快な手段を自身が提供する(普通システムのパッケージマネージャ)からと言う理由で、デフォルトでのこれらコマンドのインストールを選択しないかもしれません。

注釈

Python 2 と Python 3 の共存インストールでの衝突を避けるために、 `ensurepip` を直接呼び出した場合のデフォルトでは、バージョン付けされた `pip3`, `pip3.4` コマンドだけがインストールされます。バージョン付けのない `pip` コマンドもインストールしたければ、 `--default-pip` オプションが必要です。 `pyvenv` と Windows インストーラは修飾のない `pip` コマンドがそれら環境で利用可能となるように保障しますし、また、複数の Python がインストールされたシステムで曖昧さを避けようと直接コマンドを呼び出す代わりに、 `pip` は `-m` スイッチ経由でいつでも呼び出せます。

#### ドキュメントの変更

この変更の一部は、 Python モジュールのインストール と Python モジュールの配布 セクションがより手短な始め方として完全にデザインし直されたことと、FAQ ドキュメントです。ほとんどのパッケージングについてのドキュメンテーションは Python Packaging User Guide が保守している Python Packaging Authority に移動されて、独立したプロジェクトのドキュメンテーションになっています。

ですが、この移行は現在のところまだ少し不完全ですので、これらのガイドのレガシーなバージョンは Python モジュールのインストール (旧版) と Python モジュールの配布 (レガシーバージョン) に残してあります。

参考

PEP 453 -- Python インストールの際の明示的なpipのブートストラッピング

  PEP は Donald Stufft と Nick Coghlan によって書かれ、Donald Stufft, Nick Coghlan, Martin von Löwis, Ned Deily により実装されました。

### PEP 446: 新規作成されたファイル記述子は継承不可

PEP 446 により、新規作成するファイル記述子は 継承不可 (non-inheritable) となります。一般的にはこれこそがアプリケーションが望む振る舞いです。新たにプロセスを生成する際に、現在開いているファイルを起こした子プロセスでも開くことは、検出が困難なあらゆるバグや潜在的なセキュリティ問題を引き起こしかねません。

そうはいっても継承することが望ましい場合もあります。それらのケースをサポートするために、以下の新規関数とメソッドが利用出来ます:

- `os.get_inheritable()`, `os.set_inheritable()`

- `os.get_handle_inheritable()`, `os.set_handle_inheritable()`

- `socket.socket.get_inheritable()`, `socket.socket.set_inheritable()`

参考

PEP 446 -- 新規作成されたファイル記述子を継承不可にする

  PEP written and implemented by Victor Stinner.

### Codec 処理の改良

その最初の導入からずっと、 `codecs` モジュールとはいつなんどきも、型に中立で動的なエンコーディング・デコーディングシステムとして働くものであったのです。そうなのですがその Python テキストモデルとの密接な結合、特に組み込み型 `str`, `bytes`, `bytearray` にある型に制限があるコンビニエンスメソッドのおかげで、歴史的にその本来の意図を曖昧にしてきたのでした。

そんな状況を清く正しくするための重要な一歩として、今ではコンビニエンス関数 `codecs.encode()`, `codecs.decode()` が Python 2.7、3.3、3.4 で適切にドキュメントされました。これら関数は `codecs` モジュールに Python 2.4 からずっと存在している (うえに回帰テストスイートでもずっと網羅してきた) のですが、以前はドキュメントされていなかったわけなので、実行時イントロスペクションでようやく見つけられるというものだったわけです。

`str`, `bytes`, `bytearray` でのコンビニエンスメソッドが Python 3 では Unicode テキストエンコーディングに制限され、Python 2 では `basestring` <-> `basestring` 変換に制限されるのとは違うのです。 `codecs` のコンビニエンス関数は Python 2 と Python 3 の両方で任意のコーデックをサポートするのです。

Python 3.4 では、インタプリタは標準ライブラリで提供している非テキストエンコーディングについて知っています。そして以下のように適宜、それら汎用目的のコンビニエンス関数へユーザを誘導します:

    >>> b"abcdef".decode("hex")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    LookupError: 'hex' is not a text encoding; use codecs.decode() to handle arbitrary codecs

    >>> "hello".encode("rot13")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    LookupError: 'rot13' is not a text encoding; use codecs.encode() to handle arbitrary codecs

    >>> open("foo.txt", encoding="hex")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    LookupError: 'hex' is not a text encoding; use codecs.open() to handle arbitrary codecs

関連する変更で、後方互換性を壊すことなくそれが相応しい場合にはいつでも、エンコーディング・デコーディング操作中に起こる例外は、同じ例外型でありエラーを発生させることになった原因コーデックの名前に言及する連鎖例外内に包まれます:

    >>> import codecs

    >>> codecs.decode(b"abcdefgh", "hex")
    Traceback (most recent call last):
      File "/usr/lib/python3.4/encodings/hex_codec.py", line 20, in hex_decode
        return (binascii.a2b_hex(input), len(input))
    binascii.Error: Non-hexadecimal digit found

    The above exception was the direct cause of the following exception:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    binascii.Error: decoding with 'hex' codec failed (Error: Non-hexadecimal digit found)

    >>> codecs.encode("hello", "bz2")
    Traceback (most recent call last):
      File "/usr/lib/python3.4/encodings/bz2_codec.py", line 17, in bz2_encode
        return (bz2.compress(input), len(input))
      File "/usr/lib/python3.4/bz2.py", line 498, in compress
        return comp.compress(data) + comp.flush()
    TypeError: 'str' does not support the buffer interface

    The above exception was the direct cause of the following exception:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: encoding with 'bz2' codec failed (TypeError: 'str' does not support the buffer interface)

そしてついに、ここまで実例で見てきたような的確な誘導による改善が、それ自体は Python 3.2 で復活していた非 Unicode コーデックへのコンビニエンスのエイリアスの復活を可能にしました。(---訳注: Python 3.0 で一度非 Unicode エンコーディングは消滅し、3.2 でそれらコーデックそのものは復活したものの、 Lib/encodings/aliases.py のマッピングからは除外されたままだった。---) つまり、バイナリデータの 16 進表現エンコードとそのデコード (たとえば、です) は、今ではこう書けるということです:

    >>> from codecs import encode, decode
    >>> encode(b"hello", "hex")
    b'68656c6c6f'
    >>> decode(b"68656c6c6f", "hex")
    b'hello'

標準ライブラリで提供されるバイナリ変換とテキスト変換は、 バイナリ変換 (Binary Transforms) と テキスト変換 (Text Transforms) に詳細記述されました。

(Contributed by Nick Coghlan in bpo-7475, bpo-17827, bpo-17828 and bpo-19619.)

### PEP 451: インポートシステムのための ModuleSpec 型

PEP 451 は、インポート機構がロードに使うモジュールに関する情報 (つまりモジュールの仕様) のカプセル化を提供します。これはインポートの実装とインポート関連 API の両方を単純化するのに役立ちます。この変更は、 いくつかの将来のインポート関連の改善 の足掛かりでもあります。

この PEP による公な側面での変化は完全に後方互換です。さらにそれらは、インポーターの作者以外にとっては透過的であるはずです。鍵となるファインダとローダのメソッドはまだ動作し続けますが非推奨となりました。新しいインポータは PEP に記述された新メソッドを使うべきです。既存のインポータは新メソッドを実装するように更新すべきです。置き換えられるべきメソッドとその代わりとなるメソッドのリストについては 非推奨 を参照してください。

### その他の言語変更

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

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

- `min()` と `max()` にキーワード専用引数 default が追加されました。これにはイテラブルが要素なしであると評価される場合に返す値を指定出来ます。 (Contributed by Julian Berman in bpo-18111.)

- モジュールオブジェクトが `weakref` 可能になりました。

- モジュールの `__file__` 属性 (と関連する値) にはデフォルトでは常に絶対パスを含むようになりました。ただし、スクリプトがコマンドラインから相対パスを使って直接実行された際の `__main__.__file__` は唯一の例外です。 (Contributed by Brett Cannon in bpo-18416.)

- UTF-16 デコーダ (妥当なサロゲートペアを受け付ける) と UTF-16 エンコーダ (非 BMP 文字のエンコードでサロゲートペアを生成) 以外の、(UTF-7 を除く) 全ての UTF-* コーデックが、エラーハンドラ `surrogatepass` を使わない限りはエンコーディングとデコーディングの両方でサロゲートペアを拒絶するようになりました。(Contributed by Victor Stinner, Kang-Hao (Kenny) Lu and Serhiy Storchaka in bpo-12892.)

- 新規ドイツ語 EBCDIC codec `cp273`. (Contributed by Michael Bierenfeld and Andrew Kuchling in bpo-1097797.)

- 新規ウクライナ語 codec `cp1125`. (Contributed by Serhiy Storchaka in bpo-19668.)

- `bytes`.join() と `bytearray`.join() が引数として任意のバッファオブジェクトを受け取れるようになりました。 (Contributed by Antoine Pitrou in bpo-15958.)

- `int` コンストラクタの base 引数に、 `__index__` メソッドを持つ任意のオブジェクトを渡せるようになりました。(Contributed by Mark Dickinson in bpo-16772.) (---訳注: Python API の変更 に同じ bpo-16772 を発端とする変更が書かれているのでそちらも参照して下さい。 ---)

- フレームオブジェクトに、ローカル変数への全ての参照をフレームからクリアするメソッド `clear()` が追加されました。(Contributed by Antoine Pitrou in bpo-17934.)

- `memoryview` が `Sequence` として登録され、また、組み込み関数 `reversed()` をサポートするようになりました。 (Contributed by Nick Coghlan and Claudiu Popa in bpo-18690 and bpo-19078.)

- Argument Clinic の導入、 `inspect` と `pydoc` になされた他の変更の結果、多くの場合で `help()` が報告するシグニチャが修正・改善されました。

- `__length_hint__()` が、公式な言語仕様の一部になりました (see PEP 424)。 (Contributed by Armin Ronacher in bpo-16148.)

## 新たなモジュール

### asyncio

`asyncio` モジュールが追加されました (PEP 3156 で定義されています)。これは Python のための標準的で抜き挿し可能なイベントループモデルを、標準ライブラリに信頼出来る非同期 I/O サポートを追加することで提供し、また、ほかのイベントループ実装を標準ライブラリと相互運用することを容易にします。

Python 3.4 では、このモジュールは 暫定 API であるとみなされています。

参考

PEP 3156 -- 非同期 IO サポートの再起動: "asyncio" モジュール

  PEP written and implementation led by Guido van Rossum. (訳注: PEP タイトルの「Asynchronous IO Support Rebooted: the "asyncio" Module」は PEP 3153 の焼き直しのため。)

### ensurepip

新規の `ensurepip` モジュールは PEP 453 実装のための本質的な基盤です。通常はエンドユーザはこのモジュールを弄ぶ必要はありません。ですが、 `pip` のインストレーションや仮想環境に対する自動ブートストラップを拒否していた場合には、手動でそれをブートストラップするのに使えます。

`ensurepip` は `pip` のバンドルされたコピーを含んでいて、これは CPython リリースの最初のリリース候補時点での最新です (このことはメンテナンスリリース、feature リリースの両方に適用されます)。 `ensurepip` 自身はインターネットアクセスしません。依存パッケージ解決のためのインターネットアクセスを要するならばそれは `ensurepip` 実行の後の `pip` で行いますし、 `pip` そのもののアップグレードも `pip` 自身で行います。(そのようなアップグレード版 `pip` は個別のインストールパッケージとみなされて、Python がアンインストールされても削除されないことを付記しておきます。)

このモジュールが「 ensure (保障する) 」を名前に冠するのは、 `pip` がインストール済みならば何もしないからです。このモジュールは `--upgrade` オプションを持ちますが、これは既存のインストール版 `pip` がこのモジュールにバンドルされたコピーよりも古い場合に、バンドルされたコピー版 `pip` をインストールします。

### enum

`enum` モジュール (PEP 435 にて定義) は標準の列挙型実装を提供します。これにより (`socket` のような) ほかのモジュールが、不透明な整数定数を後方互換を保ったまま列挙値に置き換えることによって、より情報に富むエラーメッセージを提供したり、より良いデバッグサポートを行えるようになります。

参考

PEP 435 -- Python 標準ライブラリに enum 型を追加

  PEP written by Barry Warsaw, Eli Bendersky and Ethan Furman, implemented by Ethan Furman.

### pathlib

新規モジュール `pathlib` は、異なるオペレーティングシステムごとに適切な意味付けでファイルシステムパスを表現するクラス群を提供しています。パスのクラス群は 純粋パス と 具象パス に分離されています。前者は I/O を伴わない純粋なパス計算操作を提供するもので、後者は純粋パスを派生しますが I/O 操作も提供します。

Python 3.4 では、このモジュールは 暫定 API であるとみなされています。

参考

PEP 428 -- pathlib モジュール -- オブジェクト指向のファイルシステムパス

  PEP written and implemented by Antoine Pitrou.

### selectors

新規モジュール `selectors` (PEP 3156 の一部として作成されました)　は、高水準で効率的な I/O の多重化を行います。これは `select` モジュールプリミティブに基いています。

### statistics

新規モジュール `statistics` (PEP 450 で定義) は統計を扱う中核機能のいくつかを標準ライブラリで直接提供します。このモジュールはデータ系列の平均、中央値、最頻値、分散、標準偏差の計算をサポートします。

参考

PEP 450 -- 標準ライブラリに統計モジュールを追加

  PEP written and implemented by Steven D'Aprano

### tracemalloc

新たな `tracemalloc` モジュール (PEP 454 で定義) は Python が割り当てたメモリブロックをトレースするためのデバッグツールです。 以下の情報を提供します:

- オブジェクトが割り当てられた場所をトレースする

- ファイル名ごと、及び行ごとに割り当てられたメモリブロックの以下の統計を取ります：総サイズ、ブロック数、割り当てられたブロックの平均サイズ

- メモリリークを検出するために2つのスナップショットの差を計算します。

参考

PEP 454 -- Python メモリ割り当てをトレースするための tracemalloc モジュールの追加

  PEP written and implemented by Victor Stinner

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

### abc

新規関数 `abc.get_cache_token()` は、オブジェクトグラフ内での変化の影響を受けるキャッシュをいつ無効化すれば良いかを知るために使えます。 (Contributed by Łukasz Langa in bpo-16832.)

新規クラス `ABC` はそのメタクラスとして `ABCMeta` を持ちます。この `ABC` を基底クラスとして使うことは `metaclass=abc.ABCMeta` を指定するのと本質的に同じ効果を持ちますが、少ないタイプ数で単純に書ける上に読みやすいものになります。(Contributed by Bruno Dupuis in bpo-16049.)

### aifc

`getparams()` メソッドがプレインなタプルではなく `namedtuple` を返すようになりました。 (Contributed by Claudiu Popa in bpo-17818.)

`aifc.open()` がコンテキスト管理プロトコルをサポートするようになりました: `with` ブロックで使うと戻り値オブジェクトの `close()` メソッドがブロックの終了時に自動的に呼び出されます。 (Contributed by Serhiy Storchacha in bpo-16486.)

`writeframesraw()` メソッドと `writeframes()` メソッドが bytes-like object を受け付けるようになりました。 (Contributed by Serhiy Storchaka in bpo-8311.)

### argparse

`FileType` クラスが encoding 引数、 errors 引数を受け付けるようになりました。これは `open()` にそのまま渡されます。 (Contributed by Lucas Maystre in bpo-11175.)

### audioop

`audioop` は 24 ビットサンプルをサポートするようになりました。 (Contributed by Serhiy Storchaka in bpo-12866.)

新規関数 `byteswap()` はビッグエンディアンのサンプル、リトルエンディアンのサンプルの相互変換を行います。 (Contributed by Serhiy Storchaka in bpo-19641.)

全ての `audioop` 関数が今では任意の bytes-like object を受け付けます。文字列は許容されません。文字列では以前から動作しませんでしたが、ただちに例外を投げるように変更されました。 (Contributed by Serhiy Storchaka in bpo-16685.)

### base64

`base64` のエンコード・デコード関数が任意の bytes-like object オブジェクトを受け取れるようになりました。以前は `bytes` または `bytearray` インスタンスである必要がありました。 (Contributed by Nick Coghlan in bpo-17839.)

新規関数 `a85encode()`, `a85decode()` は `Ascii85` フォーマットの、 `b85encode()`, `b85decode()` は git/mercurial の `Base85` フォーマットの、バイナリデータのエンコード・バイナリデータへのデコードを提供します。 `a85` 関数は、Abobe 方言を含む `Ascii85` エンコーディングの変種と互換性を持たせるためのオプションを持っています。(Contributed by Martin Morrison, the Mercurial project, Serhiy Storchaka, and Antoine Pitrou in bpo-17618.)

### collections

`ChainMap.new_child()` メソッドが、チェーンに追加する子マップを指定する m 引数を取るようになりました。これにより、以前は組み込み辞書が必ず maps の先頭になっていましたが、カスタムマッピング型も使えるようになります。(Contributed by Vinay Sajip in bpo-16613.)

### colorsys

RGB --- YIQ 変換の係数の桁数が FCC NTSC version に合うように広げられました。結果としての変化は 1% 未満のはずで、また、ほかの処理系での結果とより合致するでしょう。 (Contributed by Brian Landers and Serhiy Storchaka in bpo-14323.)

### contextlib

新規コンテキストマネージャ `contextlib.suppress` によって、意図して単独ステートメントからの例外を抑制しているというコードの意図をはっきりと読み手に伝えることが出来ます。 (Contributed by Raymond Hettinger in bpo-15806 and Zero Piraeus in bpo-19266.)

新規コンテキストマネージャ `contextlib.redirect_stdout()` は、ユーティリティスクリプトにて、その出力を `sys.stdout` に書き出す一方でその向き先を変えれない頑固な API の扱いを簡単にしてくれます。これを使うと、 `sys.stdout` 出力をなにかほかのストリームに振り替えたり、あるいは `io.StringIO` と組み合わせて文字列化したり出来ます。後者などは特に便利で、たとえば元々はコマンドラインインターフェイスとして実装された関数からの出力を取り込む、などということが出来ます。このコンテキストマネージャはユーティリティスクリプト以外では使わない方が肝要です。というのもこれは `sys.stdout` の大域的な状態に影響を与えてしまうからです。 (Contributed by Raymond Hettinger in bpo-15805.)

`contextlib` ドキュメントにも改善が行われ、コンテキストマネージャを単独で使うのと再利用したり再入可能(リエントラント)するのとの違いについての 議論 が追加されました。

### dbm

`dbm.open()` がコンテキスト管理プロトコルをサポートするようになりました: `with` ブロックで使うとデータベースオブジェクトの `close` メソッドがブロックの終了時に自動的に呼び出されます。 (Contributed by Claudiu Popa and Nick Coghlan in bpo-19282.)

### dis

関数 `show_code()`, `dis()`, `distb()`, `disassemble()` が新たにキーワード専用引数 file を受け取ります。これは出力先を制御します。

`dis` モジュールはいまでは `Instruction` クラスを中心に据えて構築されています。これは個々のバイトコード操作の詳細に対し、オブジェクト指向的なアクセスを提供するクラスです。

新規メソッド `get_instructions()` が、与えた Python コード片についての命令 (インストラクション) ストリームを発行するイテレータを提供します。これを使えば、`dis` モジュール自身が提供しているのとは違った方法で、バイトコードオブジェクトを調べたり加工するようなプログラムを書くことが出来ます。例えばこのように書けます:

    >>> import dis
    >>> for instr in dis.get_instructions(lambda x: x + 1):
    ...     print(instr.opname)
    LOAD_FAST
    LOAD_CONST
    BINARY_ADD
    RETURN_VALUE

`dis` モジュールにある色々な表示ツールが、これらの新しい構成要素でもって書き直されました。

アプリケーションフレンドリな `Bytecode` クラスも追加されています。これはバイトコードを調べるのに、人が読める形式としてもインストラクション列をイテレートするのにも優しい、オブジェクト指向的な API になっています。 `Bytecode` コンストラクタは `get_instruction()` と同じ引数 (と、追加でオプショナルな current_offset) を受け取って、結果のオブジェクトは `Instruction` オブジェクトを生成するイテレータとして振舞うことが出来ます。このオブジェクトは、 `dis` にコンストラクタ引数を渡して呼び出すのと等価な `dis` メソッドも持っていますが、マルチライン文字列で返します:

    >>> bytecode = dis.Bytecode(lambda x: x + 1, current_offset=3)
    >>> for instr in bytecode:
    ...     print('{} ({})'.format(instr.opname, instr.opcode))
    LOAD_FAST (124)
    LOAD_CONST (100)
    BINARY_ADD (23)
    RETURN_VALUE (83)
    >>> bytecode.dis().splitlines()
    ['  1           0 LOAD_FAST                0 (x)',
     '      -->     3 LOAD_CONST               1 (1)',
     '              6 BINARY_ADD',
     '              7 RETURN_VALUE']

`Bytecode` にはクラスメソッド `from_traceback()` もあります。トレースバックから `Bytecode` を構築します。(`print(Bytecode.from_traceback(tb).dis())` は `distb()` を使って `distb(tb)` とするのと同じです。)

(Contributed by Nick Coghlan, Ryan Kelly and Thomas Kluyver in bpo-11816 and Claudiu Popa in bpo-17916.)

新規関数 `stack_effect()` は与えられた opcode (命令コード) と引数の Python スタックへの effect を計算します。この情報は他からは得られません。 (Contributed by Larry Hastings in bpo-19722.) (---訳注: `PyCompile_OpcodeStackEffect` として C API として曝した上で Python からアクセス出来るようにしたものらしいです。 stackdepth_walk での使用箇所 参照。---)

### doctest

新規 オプションフラグ の `FAIL_FAST` により、テスト実行を最初の失敗検出で終了させることが出来ます。 (Contributed by R. David Murray and Daniel Urban in bpo-16522.)

`doctest` コマンドラインインターフェイスは `argparse` を使うようになりました。2 つの新オプション `-o` と `-f` が追加されています。 `-o` によりコマンドラインから doctest オプション を指定することが出来ます。 `-f` は `-o FAIL_FAST` の速記法です (`unittest` CLI でサポートされる似たオプション サポートされる同じオプション に似せるためです)。 (Contributed by R. David Murray in bpo-11390.)

`doctest` はいまや、拡張モジュールの `__doc__` 文字列から doctest を見つけることが出来ます。 (Contributed by Zachary Ware in bpo-3158.)

### email

`as_string()` メソッドが、その文字列表現を生成するのに使うデフォルトポリシーを上書き出来る policy 引数を取るようになりました。つまり `Message` を作り直したり `flattern` メソッドの書式化パラメータのためだけに `generator` を使うことなしに、 `as_string` をより多くの状況で使えるということになります。(Contributed by R. David Murray in bpo-18600.)

`as_bytes()` メソッドが追加されました。これは `as_string` が文字列表現を生成するのと似たやり方で、メッセージの bytes 表現を生成します。これは maxheaderlen 引数を取りませんが、 unixfrom 引数と policy 引数を取ります。 `Message` の `__bytes__()` がこれを呼び出すようにしたので、 `bytes(mymsg)` は今や直感に反しない結果、つまり完全にフォーマットされたメッセージを生成します。(Contributed by R. David Murray in bpo-18600.)

`Message.set_param()` メソッドにキーワード引数 replace が追加されました。真を渡すとヘッダリスト内のその位置を変更せずに関連ヘッダを更新します。後方互換のためにデフォルトは `False` です。 (Contributed by R. David Murray in bpo-18891.)

サブモジュール `contentmanager` と `policy` 属性の `content_manager` の追加と併せて、 `Message` の対となる二つのサブクラス (`EmailMessage` と `MIMEPart`) が追加されました。 全てのドキュメントは、 email の新規 暫定 API の構成要素として追加されたこの新しいモジュールにあります。 これらのクラスは、 email メッセージからの内容抽出や挿入を遥かに簡単に行える、数多くの新規メソッドを提供しています。 詳細は `contentmanager` のドキュメントと email: 使用例 を参照してください。 これらの API の追加作業により email6 プロジェクトの一部として計画されていた作業は、その大部分が完了しました。 現在のところ、暫定 API 状態は Python 3.5 で最後となる予定です (可能性としてはエラー処理あたりのゾーンでは少々の些細な追加は残るかもしれません)。 (Contributed by R. David Murray in bpo-18891.)

### filecmp

`clear_cache()` 関数が追加されました。 `filecmp` は `os.stat()` 情報をキャッシュして最後の比較時点からのファイルの変化をみていますが、このキャッシュをクリアします。これはたとえば、ファイルシステムのタイムスタンプフィールドの解像度未満の時間差で再比較したい場合に使えるでしょう。(Contributed by Mark Levitt in bpo-18149.)

`dircmp()` 関数に与える ignore パラメータのデフォルト値を、新規のモジュール属性 `DEFAULT_IGNORES` で指定出来るようになりました。無視するディレクトリのリストで指定してください。(Contributed by Eli Bendersky in bpo-15442.)

### functools

新たな `partialmethod()` デスクリプタは、ちょうど普通の callable に対して `partial()` がするように、デスクリプタへの引数部分適用を可能にします。この新しいデスクリプタをクラス定義内で使うと、簡単に (`partial()` インスタンスを含む) 任意の callable を普通のインスタンスメソッドのように振舞わせることも出来ます。(Contributed by Alon Horev and Nick Coghlan in bpo-4331.)

新たな `singledispatch()` デコレータは、Python 標準ライブラリにシングルディスパッチのジェネリック関数のサポートを追加します。オブジェクト指向プログラミングは共通データ集合についての複数操作をまとめあげてクラスに押し込めようとしますが、ジェネリック関数は 異なった 種類のデータに対して動作させたい操作の複数実装をひとつにまとめあげる考え方です。(---訳注: ここで「ジェネリック関数」と呼んでいるものを他の言語との類推で理解しようとすると、「呼び出す側目線」では同じで、「呼び出される側」目線では違うかもしれません。例えば C++ ユーザは「template の特殊化」もしくは「型ごとのオーバロード」との類推で理解してください。---)

参考

PEP 443 -- シングルディスパッチのジェネリック関数

  PEP written and implemented by Łukasz Langa.

`total_ordering()` は基となる比較関数が `NotImplemented` を値として返すのをサポートするようになりました。 (Contributed by Katie Miller in bpo-10042.) (---訳注: functools.py のコメント 参照。---)

`partial()` 関数のピュア Python 版が標準ライブラリに追加されました。CPython の場合は C による高速版で置き換えられますが、ほかの Python 実装で利用出来ます。 (Contributed by Brian Thorne in bpo-12428.)

### gc

新規関数 `get_stats()` は、インタプリタが開始してからの、世代ごと回収統計を持つ辞書の、3 世代ぶんのリストを返します。(Contributed by Antoine Pitrou in bpo-16351.)

### glob

新規関数 `escape()` は、glob 的な展開がなされないようにして字句通りの合致をするように、ファイル名に含まれる特殊文字をエスケープする手段となります。(Contributed by Serhiy Storchaka in bpo-8402.)

### hashlib

新たな関数 `hashlib.pbkdf2_hmac()` は PKCS#5 パスワードベースの鍵導出関数２ を提供します。 (Contributed by Christian Heimes in bpo-18582.)

`hashlib` のハッシュオブジェクトの `name` 属性が、公式にサポートされるインターフェイスになりました。これは CPython の `hashlib` には以前から存在していました (ただしサポートされるハッシュの名前を必ずしも小文字で返してはいませんでした) が、公開インターフェイスとしていなかったために、ほかのいくつかの Python 実装では以前はサポートされていませんでした。(Contributed by Jason R. Coombs in bpo-18532.)

### hmac

`hmac` は、 `new()` の key 引数として `bytearray` と `bytes` を許容するようになり、また、 `new()` 関数と `update()` メソッドの両方への msg パラメータとして、 `hashlib` モジュールがサポートする任意の型を許容するようになりました。(Contributed by Jonas Borgström in bpo-18240.)

`hmac.new()` 関数への digestmod 引数には、`hashlib` が認識する任意のハッシュダイジェスト名を渡せるようになりました。これとともに、 digestmod のデフォルトとして `MD5` を使う現在の振る舞いは非推奨です。将来のバージョンの Python ではこれのデフォルト値はなくなり、指定が必須になります。 (Contributed by Christian Heimes in bpo-17276.)

`block_size` 属性と `name` 属性 (と `digest_size` 属性の公式ドキュメント) の追加をもって、 `hmac` モジュールは完全に PEP 247 API を遵守するものとなりました。 (Contributed by Christian Heimes in bpo-18775.)

### html

新規関数 `unescape()` は HTML5 文字参照を対応する Unicode 文字に変換します。 (Contributed by Ezio Melotti in bpo-2927.)

`HTMLParser` が新規キーワード引数 convert_charrefs を受け取ります。これが `True` の場合に、全ての文字参照が自動的に変換されます。後方互換性の問題から今はこのデフォルトを `False` にしてありますが、将来バージョンの Python でこれを `True` に変えます。ですから値は明示的にセットしてこの新しい機能を使うように更新しておくと良いです。(Contributed by Ezio Melotti in bpo-13633.)

`HTMLParser` の strict 引数が非推奨となりました。 (Contributed by Ezio Melotti in bpo-15114.)

### http

`send_error()` がオプショナルなパラメータ explain を受け付けるようになりました。指定されると、拡張のエラー説明を提供するにあたって、ハードコードされたデフォルトの代わりに使われます。この拡張のエラー説明は `error_message_format` 属性を使ってフォーマットされて、エラーレスポンスのメッセージボディとして送信されます。(Contributed by Karl Cow in bpo-12921.)

`http.server` の コマンドラインインターフェイス に `-b/--bind` オプションが追加されました。これは特定のアドレスで listen することを指示します。 (Contributed by Malte Swart in bpo-17764.) (---訳注: ネットワークプログラミングに詳しい人ほど混乱しそうなので一応。 `--bind` というオプション名が示すとおり、より正確に表現するなら「ユーザ指定のネットワークインターフェイスに bind」。コミットログの表現「Expose --bind argument for http.server, enable http.server to bind to a user specified network interface.」の方がわかりやすいかと。 ---)

### idlelib と IDLE

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

### importlib

`InspectLoader` ABC に新規メソッド `source_to_code()` が追加されました。ソースデータとパスを受け取り、コードオブジェクトを返します。これのデフォルト実装は `compile(data, path, 'exec', dont_inherit=True)` と同じです。 (Contributed by Eric Snow and Brett Cannon in bpo-15627.)

`InspectLoader` では `get_code()` メソッドへのデフォルト実装追加も行われました。とはいえ性能面の理由より、通常はデフォルト実装をオーバライドすることが望ましいです。 (Contributed by Brett Cannon in bpo-18072.)

`imp` モジュール撤廃に向けて、 `imp` にあった reload が `importlib` `reload()` 関数に移動しました。 (Contributed by Berker Peksag in bpo-18193.)

`importlib.util` に `MAGIC_NUMBER` 属性が追加されました。これはバイトコードのバージョン番号へのアクセスを提供します。これは非推奨の `imp` モジュールにある `get_magic()` 関数を置き換えるものです。 (Contributed by Brett Cannon in bpo-18192.)

撤廃されるモジュール `imp` での同名関数を置き換える新規関数として、 `importlib.util` 関数の `cache_from_source()` と `source_from_cache()` が追加されました。 (Contributed by Brett Cannon in bpo-18194.)

`importlib` ブートストラップ `NamespaceLoader` が `InspectLoader` ABC に従うようになりました。つまりこれにより `runpy` と `python -m` が名前空間パッケージに対して使えるようになりました。(Contributed by Brett Cannon in bpo-18058.) (訳注: 3.3 以降の名前空間パッケージについては What's New In Python 3.3 (PEP 420) 参照。)

`importlib.util` に `decode_source()` 関数が追加されました。 universal newlines 処理を使って bytes からソースをデコードします。 `InspectLoader.get_source()` メソッドを実装するのに便利です。

`importlib.machinery.ExtensionFileLoader` に `get_filename()` メソッドが追加されました。これは本来実装されるべきものでしたが見落とされていました。(Contributed by Eric Snow in bpo-19152.)

### inspect

`inspect` モジュールに、ソースコードおよびモジュール・クラス・関数についてのその他情報を手早く表示するための、基礎的な コマンドラインインターフェイス が追加されました。 (Contributed by Claudiu Popa and Nick Coghlan in bpo-18626.)

新規の `unwrap()` で、 `functools.wraps()` (やラッパー関数に `__wrapped__` 属性をセットするその他 API) で作られたラッパー関数のチェインを、簡単にほどくことが出来ます。 (Contributed by Daniel Urban, Aaron Iles and Nick Coghlan in bpo-13266.) (---訳注: 「簡単に」の意味するところについて、 Python API の変更 に記述されている `functools.update_wrapper()` と `functools.wraps()` の変更も参照して下さい。---)

新規 `enum` モジュールが実装されたことを受け `inspect` モジュールは、カスタム `__dir__` メソッドに対する、またメタクラスを介して提供される動的クラス属性に対する、ずっと良いサポートを提供出来るようになりました。 (Contributed by Ethan Furman in bpo-18929 and bpo-19030.)

`getfullargspec()` と `getargspec()` が `signature()` API を使うようになりました。このことで、以前より遥かに幅広い callable をサポートするようになっています。それには `__signature__` 属性を含むもの、 Argument Clinic で提供されるメタデータを含むもの、あるいは `functools.partial()` オブジェクト、なども含まれます。 `signature()` そのものとは違い、今でも `getfullargspec()`, `getargspec()` は `__wrapped__` 属性を無視し、そして束縛されたメソッドで最初に束縛された引数を報告するので、それが望みでないならば `signature()` を直接使うようにあなたのコードを更新する必要があります。(Contributed by Yury Selivanov in bpo-17481.) (---訳注: What's New In Python 3.5 を参照してください。 `signature()` により `getfullargspec()` と `getargspec()` は結果として非推奨となりました。---)

`signature()` が CPython 関数のダックタイプをサポートするようになりました。これは Cython でコンパイルされた関数をサポートすることになります。 (Contributed by Stefan Behnel and Yury Selivanov in bpo-17159.) (---訳注: duck type はここでは「 `types.FunctionType` であることを要求しない」の意味。 _signature_is_functionlike 参照。 ---)

### ipaddress

`ipaddress` は Python 3.3 で標準ライブラリに 暫定 API として追加されました。Python 3.4 リリースで、この但し書きは削除されました: `ipaddress` は今や安定 API とみなされ、今後は通常の標準ライブラリの後方互換性維持要件に従います。

新規のプロパティ `is_global` は、アドレスが routeable である場合に `True` を返します。 (Contributed by Peter Moody in bpo-17400.) (---訳注: リファレンスマニュアルでは routeable という表現ではなく「アドレスがパブリックネットワークに割り当てられている場合」。---)

### logging

`TimedRotatingFileHandler` に atTime パラメータが追加されました。ロールオーバ対象となる日付での時刻を指定します。 (Contributed by Ronald Oussoren in bpo-9556.)

`SocketHandler` と `DatagramHandler` が Unix ドメインソケットをサポートするようになりました (port に `None` をセットすることで)。 (Contributed by Vinay Sajip in commit ce46195b56a9 .)

`fileConfig()` が fname パラメータとして `configparser.RawConfigParser` のサブクラスを許容するようになりました。これはロギングの設定がアプリケーション全体の設定の一部に過ぎない場合や、 `fileConfig()` に渡す前にアプリケーションが設定を修正するような場合でも設定ファイルを使用することを容易にします。(Contributed by Vinay Sajip in bpo-16110.)

`logging.config.listen()` 関数経由でソケットから受信したロギング設定データを、処理前に検証出来るようになりました。新規のキーワード引数 verify に検証関数を渡すことで可能です。(Contributed by Vinay Sajip in bpo-15452.)

### marshal

`marshal` のバージョンが 3 に上げられました。新バージョンを実装しているコードは、intern された文字列をただ一つのコピーだけ記録しておきデシリアライズでその intern を維持するという Python 2 での振舞いを復活させつつ、「ただ一つのコピー」を文字列型のみならず任意のオブジェクト型に (再帰参照の処理も含め) 拡張しています。これは `.pyc` ファイルのサイズを削減し、また、 `.pyc` (または `.pyo`) ファイルからロードされる際にモジュールが占めるメモリ量を削減します。(Contributed by Kristján Valur Jónsson in bpo-16475, with additional speedups by Antoine Pitrou in bpo-19219.)

### mmap

mmap オブジェクトが `weakref` 可能になりました。 (Contributed by Valerie Lambert in bpo-4885.)

### multiprocessing

`multiprocessing` を使ってプロセスを開始する 開始方式 として、Unix において 2 つ、 `spawn` と `forkserver` が追加されました。これらはスレッドとプロセスのミックスをより堅牢にし、また、 `spawn` は multiprocessing が以前から常に Windows で使ってきたセマンティクスと一致します。新規関数の、 `get_all_start_methods()` はプラットフォームで利用出来るすべての開始方式を報告し、 `get_start_method()` は現在設定されている開始方式を報告し、 `set_start_method()` は開始方式を設定します。(Contributed by Richard Oudkerk in bpo-8713.)

`multiprocessing` には、子プロセスがどのように作られるかを決定する `context` のコンセプトが追加されています。新規関数 `get_context()` は指定した開始方式を使うコンテキストを返します。コンテキストは `multiprocessing` モジュール自身と同じ API を持っているので、コンテキスト内で操作する `Pool` や他のオブジェクトを、それを使って作成することが出来ます。コンテキストによって、フレームワークとアプリケーションあるいは同じアプリケーションの別の部分が相互に干渉しあわないようにして multiprocessing を使うことが出来ます。(Contributed by Richard Oudkerk in bpo-18999.)

昔からの fork 開始方式を除き、子プロセスはもはや必要のないハンドル・ファイル記述子をその親から継承しません。 (part of bpo-8713).

`multiprocessing` が開始方式に `spawn` または `forkserver` を使う場合に、子プロセスで適切に `__main__` を初期化するために `runpy` (これが `-m` スイッチを実装しています) に頼るようになりました。これは、 multiprocessing と `-m` コマンドラインスイッチ・明示的な相対インポートを組み合わせると子プロセスが不可解に失敗していたような、いくつかの際どい問題を解決します。 (Contributed by Nick Coghlan in bpo-19946.)

### operator

新規関数 `length_hint()` は、言語仕様となった特殊メソッド `__length_hint__()` の PEP 424 公式仕様の一環として、それがどのように使われるのかについて詳述する実装を提供します。(Contributed by Armin Ronacher in bpo-16148.)

参照実装として、また Python 実装の代替として用いることが出来る、 `operator` モジュールのピュア Python 版が書かれました。 (Contributed by Zachary Ware in bpo-16694.)

### os

新規関数により 継承可能フラグ を制御出来るようになりました。ファイル記述子には `os.get_inheritable()`, `os.set_inheritable()` を、Windows のハンドルには `os.get_handle_inheritable()`, `os.set_handle_inheritable()` を使います。

関数 `cpu_count()` が追加されました。これは Python を実行しているプラットフォームで利用可能な CPU 数を返します (決定できない場合は `None` を返します)。既存の `multiprocessing.cpu_count()` はこの関数の値を返すようになりました。(Contributed by Trent Nelson, Yogesh Chaudhari, Victor Stinner, and Charles-François Natali in bpo-17914.)

`os.path.samestat()` が Windows プラットフォームでも動作するようになりました (また、 `os.path.samefile()` の実装は Unix と Windows で共有されました)。 (Contributed by Brian Curtin in bpo-11939.)

`os.path.ismount()` が Windows において、ドライブルートよりも下にあるマウントポイントを認識するようになりました。 (Contributed by Tim Golden in bpo-9035.)

`os.open()` が新たな 2 つのフラグを、それを提供しているプラットフォームでサポートするようになりました。 `O_PATH` (未オープンファイル記述子)、 `O_TMPFILE` (名前なし一時ファイル; Python 3.4.0 リリース時点では、 uapi ヘッダを持っているカーネルバージョン 3.11 以降の Linux システムでのみ利用可能) です。 (Contributed by Christian Heimes in bpo-18673 and Benjamin Peterson, respectively.)

### pdb

`pdb` が、ジェネレータ、 `yield` 、 `yield from` をより価値ある方法で処理するように強化されました。これは `asyncio` ベースのプログラムをデバッグする際にとりわけ助けとなります。 (Contributed by Andrew Svetlov and Xavier de Gaye in bpo-16596.)

`pdb` から `print` コマンドは削除され、pdb コマンドラインからの Python `print()` 関数へのアクセスを取り戻しました。 Python 2 の `pdb` には `print` コマンドはなく `print` の入力は Python 2 の `print` 文を実行していました。 Python 3 で pdb の `p` コマンドへのエイリアスとして `print` を作ったのが間違いでした。 `p` はその引数の `repr` を表示するのであって、Python 2 での `print` コマンドがしていた `str` を表示するのではありません。さらに悪いことに、Python 3 の `pdb print` コマンドは Python 3 の `print` 関数を隠してしまい、 `pdb` プロンプトからのアクセスを出来なくしていたのでした。 (Contributed by Connor Osborn in bpo-18764.)

### pickle

`pickle` で新 pickle プロトコル 4 が追加されました (デフォルトにはされていません)。この新プロトコルは、入れ子のクラスや巨大な文字列・コンテナやキーワード専用引数を取る `__new__()` メソッドを持つクラスなどにまつわるシリアライズの問題など、以前のプロトコルに存在していた数多くの問題を措置しています。ほかにもいくつか効率面での改善が入っています。

参考

PEP 3154 -- Pickle プロトコル 4

  PEP written by Antoine Pitrou and implemented by Alexandre Vassalotti.

### plistlib

`plistlib` が、ほかのシリアライズ化プロトコルを扱う標準ライブラリでのお決まりのパターンに従った新 API を追加しました。 `load()`, `dump()`, `loads()`, `dumps()` です。(なので旧 API は非推奨です。) また、既にサポートされている XML plist フォーマット (`FMT_XML`) に加えてバイナリ plist フォーマット(`FMT_BINARY`) のサポートも追加されました。 (Contributed by Ronald Oussoren and others in bpo-14455.)

### poplib

`poplib` に 2 つの新規メソッドが追加されました。 `capa()` は POP サーバにより公表された機能リストを返します。 `stls()` は平文 POP3 セッションを、POP サーバがサポートしていれば暗号化された POP3 セッションに切り替えます。 (Contributed by Lorenzo Catucci in bpo-4473.)

### pprint

`pprint` モジュールの、 `PrettyPrinter` クラス、 `pformat()` 関数、 `pprint()` 関数に、新規オプション compact が追加されました。これは出力方法を制御するもので、今のところのこれの `True` での振舞いは、個々の (インデントされた) 行を width 幅で出来るだけ多くのシーケンスの要素が収まるように出力します。 (Contributed by Serhiy Storchaka in bpo-19132.)

長い文字列が Python の普通の行継続構文で折り返されるようになりました。 (Contributed by Antoine Pitrou in bpo-17150.)

### pty

`pty.spawn()` が `None` ではなく `os.waitpid()` からの戻り値から取ったステータス値を返すようになりました。 (Contributed by Gregory P. Smith.)

### pydoc

`pydoc` モジュールがイントロスペクション API `inspect.signature()` に直接基くようになりました。これによりより幅広く callable オブジェクトのシグニチャ情報を提供出来るようになりました。この変更は、ヘルプ情報表示の際に `__wrapped__` 属性も考慮に入れられることも意味しています。(Contributed by Larry Hastings in bpo-19674.)

`pydoc` モジュールはもはや既に束縛済みのメソッドでは `self` パラメータを表示しません。それよりも、与えられた callable の正確な現在のシグニチャを常に表示しようとします。 (Contributed by Larry Hastings in bpo-20710.)

`pydoc` に直接なされた変更に加え、背後の `inspect` モジュールの改善が、カスタム `__dir__` メソッドやさまざまなデスクリプタの扱いについての振る舞いの大幅な改善に寄与しました。

組み込み `help()` は `pydoc` モジュールに基いているので、上記変更は `help()` の振る舞いにも影響します。

### re

`fullmatch()` 関数と `regex.fullmatch()` メソッドが追加されました。これはパターンを合致する文字列の両端に固定します。コード変更や既存の正規表現になにか代わりとなるものを追加したりする際に、末尾に `$` を入れ忘れるといった類のバグは気付きにくいものです。これらの関数で、合致すべき終端をはっきり伝えることが出来ます。 (Contributed by Matthew Barnett in bpo-16203.)

正規表現オブジェクト の repr にパターンとフラグを含めるようになりました。 match オブジェクト の repr に start、end と合致した部分文字列を含むようになりました。 (Contributed by Hugo Lopes Tavares and Serhiy Storchaka in bpo-13592 and bpo-17087.)

### resource

新規関数 `prlimit()` は、指定プロセスのリソースリミットの問い合わせとセットを、一度の呼び出しで行えます。カーネルバージョン 2.6.36 以降で glibc 2.13 以降の Linux プラットフォームで利用可能です。 (Contributed by Christian Heimes in bpo-16595.)

Linux カーネル 2.6.36 以降のプラットフォームで、いくつかの Linux 固有の定数も追加されました: `RLIMIT_MSGQUEUE`, `RLIMIT_NICE`, `RLIMIT_RTPRIO`, `RLIMIT_RTTIME`, `RLIMIT_SIGPENDING`. (Contributed by Christian Heimes in bpo-19324.)

FreeBSD バージョン 9 以降のプラットフォームで、いくつかの FreeBSD 固有の定数が追加されました: `RLIMIT_SBSIZE`, `RLIMIT_SWAP`, `RLIMIT_NPTS`. (Contributed by Claudiu Popa in bpo-19343.)

### select

`epoll` がコンテキスト管理プロトコルをサポートするようになりました: `with` ブロックで使うと `close()` メソッドがブロックの終了時に自動的に呼び出されます。 (Contributed by Serhiy Storchaka in bpo-16488.)

`devpoll` オブジェクトに、メソッド `fileno()` とメソッド `close()` 、それに属性 `closed` が追加されました。 (Contributed by Victor Stinner in bpo-18794.)

### shelve

`Shelf` がコンテキスト管理プロトコルをサポートするようになりました: `with` ブロックで使うとブロックの終了時に自動的にクローズされます。 (Contributed by Filip Gruszczyński in bpo-13896.)

### shutil

`copyfile()` が、コピー元とコピー先が同じファイルの場合に `Error` の限定されたサブクラスである `SameFileError` を投げるようになりました。これにより、アプリケーションはこの特定のエラーでそれに相応しいアクションを取れます。 (Contributed by Atsuo Ishimoto and Hynek Schlawack in bpo-1492704.)

### smtpd

`SMTPServer` クラスと `SMTPChannel` クラスが `asynchat.async_chat` の map 引数に垂れ流すための map キーワード引数を受け取るようになりました。これでアプリケーションはグローバルなソケットマップを汚さずに済みます。 (Contributed by Vinay Sajip in bpo-11959.) (---訳注: 正確にはここでの変更は SMTPChannel は `asynchat.async_chat.__init__(self, conn, map=map)` 、SMTPServer は `asyncore.dispatcher.__init__(self, map=map)` です。グローバルなソケットマップを汚さない、というのは `SMTPServer` の方にだけその具体の意味が書かれていて、 map を指定しない場合は `asyncore` のグローバルマップを使う、ということで、これが今回のこの変更前に無条件で行われていたことです。 changeset 84047:ed498f477549 参照。---)

### smtplib

`SMTPException` が `OSError` のサブクラスになりました。これによって、とにかくエラーが起こったのだということにしか関心がないコードが、ソケット階層でのエラーと SMTP プロトコル階層の両エラーを一撃の try/except 文で捕捉出来るようになりました。 (Contributed by Ned Jackson Lovely in bpo-2118.)

### socket

socket モジュールはそれをサポートしているプラットフォームで `CAN_BCM` プロトコルをサポートするようになりました。 (Contributed by Brian Thorne in bpo-15359.)

ソケットオブジェクトで 継承可能フラグ を制御出来るようになりました。 `get_inheritable()` で取得し、 `set_inheritable()` でセットします。

定数値の `socket.AF_*` と `socket.SOCK_*` が、新規の `enum` モジュールを使った列挙値になりました。つまりデバッグなどで魑魅魍魎な整数ではなく徳高い名前で表示されるということです。

`AF_LINK` 定数が BSD と OSX で利用可能になりました。

`inet_pton()` と `inet_ntop()` が Windows でサポートされるようになりました。 (Contributed by Atsuo Ishimoto in bpo-7171.)

### sqlite3

`connect()` 関数に新規の真偽値パラメータ uri が追加されました。これを真にセットすると database パラメータを URI として解釈させることが出来ます。 (SQLite の URI のドキュメント を参照してください)。 (Contributed by poq in bpo-13773.)

### ssl

`PROTOCOL_TLSv1_1` と `PROTOCOL_TLSv1_2` (TLSv1.1 と TLSv1.2 のサポート) が追加されました。これらプロトコルのサポートは Python が OpenSSL 1.0.1 以降とリンクしている場合にのみ利用可能です。 (Contributed by Michele Orrù and Antoine Pitrou in bpo-16692.)

新規関数 `create_default_context()` は、互換性とセキュリティの間の程よいバランスとなるよう調整された `SSLContext` を得るための標準手段として追加されました。それらの設定は `SSLContext` コンストラクタが与えるデフォルトよりも厳しく、そして将来的にセキュリティにおけるベストプラクティスによる要請が変化すれば、事前予告なしで調整されるかもしれません。SSL をサポートする標準ライブラリの使用においての新しいベストプラクティスとして、 `SSLContext` を得るのには `create_default_context()` を使うことが推奨です。必要に応じ、対応する標準ライブラリ API の context 引数に渡すためにそれを使うよう修正してください。(Contributed by Christian Heimes in bpo-19689.)

`SSLContext` のメソッド `load_verify_locations()` にオプショナル引数 cadata が追加されました。これには PEM あるいは DER エンコードの証明書を直接指定できます。前者の場合は文字列で、後者では bytes-like object で指定します。(Contributed by Christian Heimes in bpo-18138.)

関数 `get_default_verify_paths()` が追加されました。これは `set_default_verify_paths()` メソッドが OpenSSL デフォルトの `cafile` と `capath` をセットするのに使うパスと環境変数から成る名前付きタプルを返します。デフォルトの検証にまつわる問題をデバッグするのに使えるでしょう。(Contributed by Christian Heimes in bpo-18143.)

`SSLContext` の新規メソッド `cert_store_stats()` はロードされた `X.509` 証明書、 `X.509 CA` 証明書、証明書失効リスト (`crl`) を報告し、また、新規メソッド `get_ca_certs()` はロードされた `CA` 証明書のリストを返します。(Contributed by Christian Heimes in bpo-18147.)

OpenSSL 0.9.8 以降が利用可能な場合に、 `SSLContext` で属性 `verify_flags` を指定出来るようになりました。これは証明書の検証プロセスをコントロールします。定数 `VERIFY_DEFAULT`, `VERIFY_CRL_CHECK_LEAF`, `VERIFY_CRL_CHECK_CHAIN`, `VERIFY_X509_STRICT` を組み合わせてセットします。OpenSSL は頼まない限りは証明書失効リスト(CRLs) の検証はしません。 (Contributed by Christien Heimes in bpo-8813.)

`SSLContext` の新規メソッド `load_default_certs()` は、プラットフォームによって異なるデフォルトの場所から “認証局” (CA=certification authority) 証明書ファイル一式をロードします。クライアントがサーバを検証するための TLS web サーバ証明の証明書をロード (`purpose=``SERVER_AUTH`) することも、サーバがクライアント証明書を検証するのに用いる証明書をロード (`purpose=``CLIENT_AUTH`) することも出来ます。(Contributed by Christian Heimes in bpo-19292.)

Windows だけで利用出来る関数が 2 つ追加されました。 `enum_certificates()` と `enum_crls()` で Windows のシステム証明書ストアから、証明書、証明書の情報、CRLs (certification revocation=証明書失効リスト) を抽出出来ます。(Contributed by Christian Heimes in bpo-17134.)

新規メソッド `ssl.SSLContext.set_servername_callback()` によるサーバサイド SNI (Server Name Indication) サポートが追加されました。 (Contributed by Daniel Black in bpo-8109.)

`SSLSocket.getpeercert()` が返す辞書に `X509v3` 拡張アイテムを含むようになりました: `crlDistributionPoints`, `caIssuers`, `OCSP` URI。 (Contributed by Christian Heimes in bpo-18379.)

### stat

`stat` モジュールが C 実装 `_stat` に基くようになりました。C 実装は、標準化されておらずプラットフォーム依存となる値のほとんどを取り込むために必要とされました。 (Contributed by Christian Heimes in bpo-11016.)

モジュールは新たに `filemode()` フラグの `S_IFDOOR`, `S_IFPORT`, `S_IFWHT` をサポートします。 (Contributed by Christian Hiemes in bpo-11016.)

### struct

関数 `iter_unpack` と、コンパイル済フォーマットでのメソッド `struct.Struct.iter_unpack()` が追加されました。これは、与えられたデータフォーマットの繰り返しインスタンスを含むバッファを逐次的にアンパックします。 (Contributed by Antoine Pitrou in bpo-17804.)

### subprocess

`check_output()` が input 引数を受け付けるようになりました。これは実行するコマンドにとっての `stdin` を供給するのに使われます (訳注: `run()` のドキュメント参照)。 (Contributed by Zack Weinberg in bpo-16624.)

`getstatus()` と `getstatusoutput()` が Windows でも動作するようになりました。ただしこの変更は実際には、不注意で 3.3.4 に対して既に行われました。 (Contributed by Tim Golden in bpo-10197.)

### sunau

`getparams()` メソッドがプレインなタプルではなく `namedtuple` を返すようになりました。 (Contributed by Claudiu Popa in bpo-18901.)

`sunau.open()` がコンテキスト管理プロトコルをサポートするようになりました: `with` ブロックで使うと戻り値オブジェクトの `close` メソッドがブロックの終了時に自動的に呼び出されます。 (Contributed by Serhiy Storchaka in bpo-18878.)

24 ビットサンプルの出力をサポートしました。つまり `AU_write.setsampwidth()` に 24 ビットに対応する値をセット出来ます。 (Contributed by Serhiy Storchaka in bpo-19261.)

`writeframesraw()` メソッドと `writeframes()` メソッドが bytes-like object を受け付けるようになりました。 (Contributed by Serhiy Storchaka in bpo-8311.)

### sys

新規関数 `sys.getallocatedblocks()` は、現在インタプリタによりアロケートされているブロック数を返します (デフォルトの `--with-pymalloc` 設定での CPython では、これは `PyObject_Malloc()` API によるアロケーションです)。これはメモリリークの追跡に、とりわけテストスイートで自動化されている場合はなおさら有用です。 (Contributed by Antoine Pitrou in bpo-13390.)

Python インタプリタが 対話モード で開始する際に `sys` モジュールの属性 `__interactivehook__` をチェックするようになりました。この属性があると、対話モード開始直前にその設定値が引数なしで呼び出されます。このチェックは `PYTHONSTARTUP` ファイルが読み込まれたあとで行われるので、そのファイル内でセット出来ます。 `site` モジュールは `readline` をサポートするプラットフォームではタブ補完と (`~/.python-history` への) 履歴保存を有効にする関数を __interactivehook__ にセットします 。この (新たな) 振る舞いがお気に召さなければ、 `PYTHONSTARTUP`, `sitecustomize`, `usercustomize` のいずれかで `sys` からこの属性を削除 (あるいはほかのなにか callable をセット) してください。 (Contributed by Éric Araujo and Antoine Pitrou in bpo-5845.)

### tarfile

`tarfile` モジュールはスクリプトや直接 `-m` で呼ばれた場合、簡単な コマンドラインインターフェイス をサポートするようになりました。 これにより tar ファイルアーカイブの作成や解凍が可能です。 (Contributed by Berker Peksag in bpo-13477.)

### textwrap

`TextWrapper` に 2 つ新しい制御変数が追加されていて、これらは属性値であり、コンストラクタ引数に渡せます。それぞれ `max_lines` が最大出力行数、 `placeholder` が max_lines により切り詰める場合に出力の最終行に置くテキストです。これら機能を使った新規のコンビニエンス関数 `shorten()` が追加されています。これは入力に含まれる全ての空白文字を単一の空白に置き換え、また幅 width に収めて、切り詰める場合は末尾を placeholder (デフォルトで `[...]`) で置き換えて、単一行で返します。(Contributed by Antoine Pitrou and Serhiy Storchaka in bpo-18585 and bpo-18725.)

### threading

メインスレッドを表現する `Thread` オブジェクトを、新規関数 `main_thread()` で得られるようになりました。通常の条件であればこれは Python インタプリタを開始したスレッドになります。 (Contributed by Andrew Svetlov in bpo-18882.)

### traceback

新規関数 `traceback.clear_frames()` は、トレースバックオブジェクトを受け取って、それが参照している全てのフレーム内のローカル変数をクリアすることで、メモリ消費量を削減します。 (Contributed by Andrew Kuchling in bpo-1565525.)

### types

新規デスクリプタ `DynamicClassAttribute()` は、そのアクセスがインスタンスからの場合には普通に振舞いつつクラスからのアクセスでは クラス の __getattr__ メソッドに振り向ける属性、これを定義する手段を提供します。このことにより、インスタンス上ではアクティブなプロパティを持ち、クラス上では同名の仮想的属性を持つ、といったことが出来ます (`Enum` がこれの実例になっています)。 (Contributed by Ethan Furman in bpo-19030.)

### urllib

`urllib.request` が新規クラス `DataHandler` を介して `data:` URL をサポートするようになりました。 (Contributed by Mathias Panzenböck in bpo-16423.)

`Request` クラスで使われる HTTP メソッドを、サブクラスで `method` 属性をセットすることにより指定出来るようになりました。 (Contributed by Jason R Coombs in bpo-18978.) (---訳注: `method` は 3.3 で追加されたが、コンストラクタに渡されたものが設定されるだけだった。---)

`Request` オブジェクトは今では再利用可能です: `full_url` あるいは `data` 属性などが変更されると、関連する全ての内部プロパティが更新されます。このことによって今や、例えば、 `Request` オブジェクトを、異なる data 引数での `OpenerDirector.open()` の複数回呼び出し内で使ったり、あるいは、まっさらから作り直すのではなく `Request` の `url` を書き換えて使ったり出来ます。新たに `remove_header()` メソッドも追加されていて、これは `Request` からヘッダを取り除きます。 (Contributed by Alexey Kachayev in bpo-16464, Daniel Wozniak in bpo-17485, and Damien Brecht and Senthil Kumaran in bpo-17272.)

`HTTPError` オブジェクトに、エラーに関係する HTTP レスポンスヘッダへのアクセスを提供する `headers` 属性が追加されました。 (Contributed by Berker Peksag in bpo-15701.)

### unittest

The `TestCase` class has a new method, `subTest()`, that produces a context manager whose `with` block becomes a "sub-test". This context manager allows a test method to dynamically generate subtests by, say, calling the `subTest` context manager inside a loop. A single test method can thereby produce an indefinite number of separately identified and separately counted tests, all of which will run even if one or more of them fail. For example:

    class NumbersTest(unittest.TestCase):
        def test_even(self):
            for i in range(6):
                with self.subTest(i=i):
                    self.assertEqual(i % 2, 0)

これは 6 つのサブテストとなり、それぞれは unittest 内の冗長出力において、変数名 `i` とその変数への個々の値 (`i=0`, `i=1`, など) からなるラベルで識別されます。この例の完全なバージョンが サブテストを利用して繰り返しテストの区別を付ける にあります。 (Contributed by Antoine Pitrou in bpo-16997.)

`unittest.main()` の defaultTest に、テスト名からなるイテラブルを渡せるようになりました。以前は文字列で単一のテスト名を渡せるだけでした。 (Contributed by Jyrki Pulliainen in bpo-15132.)

テストディスカバリ最中に発生する `SkipTest` (これはテストファイル内のモジュールレベルで起こせます) を、エラーとしてではなくスキップとして報告するようになりました。 (Contributed by Zach Ware in bpo-16935.)

`discover()` が発見したファイルをソートするようになったので、一貫したテスト順でテスト出来ます。 (Contributed by Martin Melin and Jeff Ramnani in bpo-16709.)

`TestSuite` がその実行完了次第すぐに、テスト成功していれば、テストへの参照を取り除くようになりました。ガーベージコレクションを行う Python インタプリタ上ではこの振る舞いによって、テストへの参照を保持しているものが他にない場合のテストのガーベージコレクトを可能にします。この振る舞いは `TestSuite` をサブクラス化して何もしない `_removeTestAtIndex` を定義することで上書き出来ます。 (Contributed by Tom Wardill, Matt McClure, and Andrew Svetlov in bpo-11798.)

テストアサーションの新規コンテキストマネージャ `assertLogs()` が追加されました。これはコードブロックが `logging` を使ってログメッセージを発行しているか確認します。デフォルトでは任意のロガーからの `INFO` 以上のプライオリティを持つメッセージを取れますが、ロガー名と最小プライオリティの両方とも指定可能です。コンテキストマネージャからの戻りオブジェクトに対して、ログされた `LogRecord` とフォーマットされたメッセージの両方あるいはどちらかを問い合わせることが出来ます。 (Contributed by Antoine Pitrou in bpo-18937.)

テストディスカバリが名前空間パッケージで動作するようになりました。 (Contributed by Claudiu Popa in bpo-17457.)

`unittest.mock` オブジェクトが、呼び出しが合致する際に仕様としてのシグニチャを検査するようになりました。これはつまり、以前は位置引数だけの合致だったものが、位置引数と名前の両方で合致できるようになったということです。(Contributed by Antoine Pitrou in bpo-17015.)

`mock_open()` オブジェクトに `readline` メソッドと `readlines` メソッドが追加されました。 (Contributed by Toshio Kuratomi in bpo-17467.)

### venv

`venv` に `csh` と `fish` シェルの有効化スクリプトが追加されました。 (Contributed by Andrew Svetlov in bpo-15417.)

`EnvBuilder` クラスとコンビニエンス関数 `create()` が新規キーワード引数 with_pip を取るようになりました。デフォルトは `False` です。これは `EnvBuilder` が仮想環境に `pip` がインストールされていることを保証するかどうかを制御します。(Contributed by Nick Coghlan in bpo-19552 as part of the PEP 453 implementation.)

### wave

`getparams()` メソッドがプレインなタプルではなく `namedtuple` を返すようになりました。 (Contributed by Claudiu Popa in bpo-17487.)

`wave.open()` がコンテキスト管理プロトコルをサポートするようになりました。 (Contributed by Claudiu Popa in bpo-17616.)

`wave` は シーク不能なファイルへの書き出しが出来るように なりました。 (Contributed by David Jones, Guilherme Polo, and Serhiy Storchaka in bpo-5202.)

`writeframesraw()` メソッドと `writeframes()` メソッドが bytes-like object を受け付けるようになりました。 (Contributed by Serhiy Storchaka in bpo-8311.)

### weakref

新規 `WeakMethod` クラスは、インスタンスメソッドへの弱参照をシミュレートします。 (Contributed by Antoine Pitrou in bpo-14631.)

新規クラス `finalize` は、弱参照自身のライフサイクルを注意深く管理する必要性なしに、オブジェクトがガーベージコレクトされる際に呼び出されるコールバックを登録することを可能にします。 (Contributed by Richard Oudkerk in bpo-15528.)

`ref` に関連付いたコールバック (あれば) を、新規属性 `__callback__` で取得出来るようになりました。(Contributed by Mark Dickinson in bpo-17643.)

### xml.etree

ノンブロッキングなアプリケーションでの XML ドキュメントの解析に、新規パーサ `XMLPullParser` を利用出来ます。実例は 非ブロックパースのためのプル API をみてください。 (Contributed by Antoine Pitrou in bpo-17741.)

`xml.etree.ElementTree` の関数 `tostring()` 、`tostringlist()` と、 `ElementTree` クラスの `write()` メソッドに、 キーワード専用引数 の short_empty_elements が追加されました。これはコンテンツを持たない要素を省略形 (`<tag />`) で書き出すか展開された形 (`<tag></tag>`) で書き出すかを制御します。(Contributed by Ariel Poliak and Serhiy Storchaka in bpo-14377.)

### zipfile

`PyZipFile` クラスの `writepy()` メソッドに filterfunc オプションが追加されました。これはアーカイブにどのディレクトリ・ファイルを加えるのかをコントロールするのに使うことが出来ます。例えばテスト用ファイルをアーカイブから除外する、などということが出来ます。(Contributed by Christian Tismer in bpo-19274.)

`ZipFile` クラスと `PyZipfile` クラスの allowZip64 パラメータのデフォルトが `True` に変更されました。 (Contributed by William Mallard in bpo-17201.)

## CPython の実装の変更

### PEP 445: CPython のメモリアロケータのカスタマイズ

PEP 445 は、CPython インタープリタのメモリ割り当てをカスタマイズするために新たな C 水準のインターフェイスを追加しました。

参考

PEP 445 -- Python メモリアロケータをカスタマイズするための新 API 追加

  PEP written and implemented by Victor Stinner.

### PEP 442: オブジェクトの安全なファイナライゼーション

PEP 442 は、 CPython でのオブジェクトのファイナライゼーションにまつわる現在の制限と奇癖を取り除きます。これによって、 `__del__()` メソッドを持つオブジェクトと `finally` 節を持つジェネレータが、それらが循環参照に含まれる場合もファイナライズ出来ます。(---訳注: ジェネレータの例については bpo-17468 から派生した bpo-17807 での修正 changeset 83688:c89febab4648 の `Lib/test/test_generators.py` に追加されたテスト参照。---)

この変更の一環で、モジュールのグローバルは、ほとんどのケースではインタプリタのシャットダウン中に強制的に `None` がセットされることはなくなり、代わりに循環ガーベージコレクタの通常のオペレーションに委ねます。このことは、循環 GC が最初に導入されて以来悩みの種だった、普通 `__del__` メソッドを巻き込んだ「インタプリタシャットダウン時エラーの類」全体を回避します。(---訳注: bpo-18214 (superseder for bpo-812369), changeset 84936:79e2f5bbc30c ---)

参考

PEP 442 -- オブジェクトの安全なファイナライゼーション

  PEP written and implemented by Antoine Pitrou.

### PEP 456: 安全で取り換え可能なハッシュアルゴリズム

PEP 456 は、Python のハッシュアルゴリズムで行われた以前のセキュリティ修正作業 --- これは公に曝されている辞書検索に裏打ちされた API が標的になるかもしれない、特定の DOS 攻撃に対処するものです --- に追従するものです (この改善の現在ラウンドの事の起こりについては bpo-14621 を見てください)。この PEP では、 CPython のハッシュのコードをパッケージャが異なるハッシュアルゴリズムへの差し替えを容易にするために一元化し、そして Python のデフォルト実装としては 64 ビットデータ型を持つプラットフォームで SipHash に乗り換えます。以前の FNV アルゴリズムと比較したどんなパフォーマンスの差異も、些細なものです。

この PEP は `sys.hash_info` 名前付きタプルに、現在実行しているバイナリで使われているハッシュアルゴリズムを記述するためのフィールドを追加します。これら以外にはこの PEP が既存の CPython API を何か置き換えることはありません。

### PEP 436: Argument Clinic

「Argument Clinic」(PEP 436) は CPython ビルドプロセスの新たな鍋の具です。ビルトインと標準ライブラリの拡張モジュールが C で実装されるにあたって、正確なシグニチャを定義し保守管理するプロセスを単純化するのに使えます。

Python 3.4 では既にいくつかの標準ライブラリ拡張モジュールが Argument Clinic を使うように変換されていて、またこれの結果として `pydoc` と `inspect` が更新されました。

Python 3.4 メンテナンスリリースでの更新の一部として C で実装されている callable に対して、プログラム的なイントロスペクションのためのシグニチャメタデータの追加が、さらに追加で行われることが期待されています。

注釈

Argument Clinic の PEP は、実装されている状態に対して完全には最新のものとはなっていません。Argument Clinic は Python 3.4 ではサードパーティに向けた公開 API として利用可能とする予定ではないので、このケースではリリース管理者とコア開発チームによって許容出来るとみなされました。

参考

PEP 436 -- The Argument Clinic DSL (訳注: DSL=Domain-Specific Language)

  PEP written and implemented by Larry Hastings.

### その他のビルド並びに C API の変更

- `PyType_GetSlot()` 関数が、安定 ABI に追加されました。これにより、制限 API を使う際に名前の付いた型のスロットから関数ポインタを取り出すことが出来ます。(Contributed by Martin von Löwis in bpo-17162.) (---訳注: 安定 ABI, 制限 API については What's New In Python 3.2 (PEP 384) を参照。---)

- 初期化前処理 API の `Py_SetStandardStreamEncoding()` が追加されました。これにより CPython インタプリタを埋め込むアプリケーションは、標準ストリームに対して確実に特定のエンコーディングとエラーハンドラを使わせることが出来ます。(Contributed by Bastien Montagne and Nick Coghlan in bpo-16129.)

- 文字列引数を変更することのない Python C API のほとんどが、 `char *` ではなく適切に `const char *` として宣言されました。 (Contributed by Serhiy Storchaka in bpo-1772673.)

- Python インタプリタが利用出来ない場合 (例えばクロスコンパイルのシナリオ) であっても使える、シェルで書き直したバージョンの `python-config` が追加されました。

- `PyUnicode_FromFormat()` が `%s`, `%A`, `%U`, `%V`, `%S`, `%R` についての幅と精度の指定をサポートするようになりました。 (Contributed by Ysj Ray and Victor Stinner in bpo-7330.)

- 既存の `PyStructSequence_InitType()` 関数を補うものとして、 `PyStructSequence_InitType2()` が追加されました。違いは、これは成功時に `0` 、失敗時に `-1` を返すことです。

- CPython のソースを、最近の GCC と clang のアドレスサニティチェック機能を使ってコンパイル出来るようにしました: 小さなオブジェクト用アロケータで起こっていた偽の警報を黙らせました。 (Contributed by Dhiru Kholia in bpo-18596.)

- Windows ビルドに アドレス空間配置のランダム化 と データ実行防止 を使うようにしました。 (Contributed by Christian Heimes in bpo-16632.)

- `operator.length_hint()` と等価な C API 関数 `PyObject_LengthHint()` が追加されました。 (Contributed by Armin Ronacher in bpo-16148.)

### その他の改善

- python コマンドに新規 オプション の `-l` が追加されました。これは「隔離モード (isolated mode)」で Python を実行します。これが意味するのは、 `sys.path` がスクリプトディレクトリもユーザの `site-packages` ディレクトリも含まず、また、全ての `PYTHON*` 環境変数が無視される、というものです (ので暗黙で `-s` と `-E` を含んでいるということです)。ほかの制限についても将来適用されるでしょう。その目標はユーザ環境からスクリプト実行を隔離することです。例えばこれは Python がシステムスクリプトとして実行される場合に適切なものです。ほとんどの POSIX システムではシステムスクリプトの `#!` 行で指定できますし、そうすべきです。(Contributed by Christian Heimes in bpo-16499.)

- `readline` をサポートするプラットフォームで、対話インタプリタでの `Tab` キーでの補完がデフォルトで有効になりました。履歴もデフォルトで有効となり、 `~/.python-history` に書き込まれ (そしてそこから読み込まれ) ます。 (Contributed by Antoine Pitrou and Éric Araujo in bpo-5845.)

- Python インタプリタの `--version` での起動時、標準エラーではなく標準出力にバージョン情報を出力するようになりました (bpo-18338)。同じ変更は `argparse` モジュールに対して (bpo-18920)、また、スクリプトとして呼び出せる機能を持つモジュールに対して (bpo-18922) も行われました。

- CPython の Windows インストーラが、拡張子を登録する際に `PATHEXT` に `.py` を追加するようになりました。これをするとユーザは、 Windows コマンドプロンプトから Python スクリプトを、 `.py` 拡張子なしでその名前だけタイプして実行出来ます。 (Contributed by Paul Moore in bpo-18569.)

- A new `make` target coverage-report will build python, run the test suite, and generate an HTML coverage report for the C codebase using `gcov` and lcov.

- python 回帰テストスイート への `-R` オプションが、 `sys.getallocatedblocks()` を使ったメモリアロケーションのリークもチェックするようになりました。(Contributed by Antoine Pitrou in bpo-13390.) (---訳注: リファレンスマニュアルにオプション説明はないので、 python -m test --help を参照して下さい。---)

- `python -m` が名前空間パッケージで動くようになりました。

- `stat` モジュールが C で実装されました。これは以前問題であった Python モジュール内で値をハードコードすることなく、定数を C ヘッダファイルから取りこめることを意味しています。(---訳注: bpo-11016 、特に msg127114 以降参照。---)

- 単一の OS モジュール (POSIX の `.so` と Windows の `.dll`) からの複数 Python モジュールのロードを正しく行えるようになりました (以前は黙ってファイル内の最初のモジュールだけが返されていました)。 (Contributed by Václav Šmilauer in bpo-16421.)

- 新しい命令コード `LOAD_CLASSDEREF` が追加されました。これは __prepare__ のある種の使い方で起こりうる、クラス本体内の自由変数のロードでのバグを修正するために導入されました。(Contributed by Benjamin Peterson in bpo-17853.)

- Victor Stinner が、彼の PEP 445 ベースの `pyfailmalloc` ツールを用いて数多くのメモリエラー関連のクラッシュを特定し、そして修正しました。 (bpo-18408, bpo-18520)

- `pyvenv` コマンドに、シンボリックリンクがデフォルトのシステムでもそうせずにコピーを使うようにするための `--copies` オプションが追加されました。 (Contributed by Vinay Sajip in bpo-18807.)

- `pyvenv` コマンドにはさらに、そうしなければ自動的に仮想環境に pip がブートストラップされてしまうのを抑制するための、 `--without-pip` オプションが追加されました。(Contributed by Nick Coghlan in bpo-19552 as part of the PEP 453 implementation.)

- 環境変数 `PYTHONIOENCODING` の値内で、エンコーディング名を省略出来るようになりました。つまり、デフォルトエンコーディングを変更することなしにエラーハンドラだけをセット出来ます。 (Contributed by Serhiy Storchaka in bpo-18818.)

- `bz2`、`lzma`、`gzip` モジュールの `open` 関数が `x` (排他的作成) モードをサポートするようになりました。 (Contributed by Tim Heaney and Vajrasky Kok in bpo-19201, bpo-19222, and bpo-19223.)

### 大幅な最適化

- UTF-32 デコーダが3-4倍速くなりました。 (Contributed by Serhiy Storchaka in bpo-14625.)

- 集合に対するハッシュ衝突のコストが削減されました。ハッシュテーブルの個々の検査 (probe) で、ハッシュテーブル全体を通したランダムな検査を行う前に、連続する隣接したキー/ハッシュペアをチェックするようになりました。これは、キャッシュ局所性を利用して衝突解決のコストを減らします。この衝突解決戦略は、リニア検査とオープンアドレッシング法のハイブリッドとして説明できます。追加的なリニア検査の数はデフォルトでは 9 です。この値は、コンパイル時に LINEAR_PROBES を定義することで任意の値に変更できます。リニア検査を完全に無効にするには LINEAR_PROBES=0 を設定してください。 (Contributed by Raymond Hettinger in bpo-18771.)

- インタプリタの起動が約 30% 高速化されました。この速度向上は、いくつかの手段によってもたらされました。インタプリタは起動時により少数のモジュールをロードするようになりました。例えば `re`, `collections`, `locale` モジュール、およびそれらの依存モジュールは、デフォルトではインポートされません。 marshal モジュールは、コンパイルされた Python コードをより高速にロードできるように改善されました。 (Contributed by Antoine Pitrou, Christian Heimes and Victor Stinner in bpo-19219, bpo-19218, bpo-19209, bpo-19205 and bpo-9548.)

- `bz2.BZ2File` が大半の場合 Python2 のバージョン以上に速くなりました。`lzma.LZMAFile` も最適化されました。(Contributed by Serhiy Storchaka and Nadeem Vawda in bpo-16034.)

- `random.getrandbits()` が (通常使用される) 小さな整数に対して20%-40% 早くなりました。 (Contributed by Serhiy Storchaka in bpo-16674.)

- 文字列のストレージ形式を変更したことにより、文字列のピックル化は非常に速くなりました。(Contributed by Victor Stinner and Antoine Pitrou in bpo-15596.)

- `io.FileIO.readall()` の性能問題が解決されました。これは特に Windows に影響し、 `subprocess` を通して大量のデータをパイプで渡しているケースでかなり速度向上します。 (Contributed by Richard Oudkerk in bpo-15758.)

- `html.escape()` が10倍速くなりました。(Contributed by Matt Bryant in bpo-18020.)

- Windows において、 `obmalloc` で CRT の `malloc` の代わりにネイティブの `VirtualAlloc` を使うようになりました。人工的なベンチマーク結果は、メモリー消費が 3% 減ったことを示しています。

- `os.urandom()` now uses a lazily opened persistent file descriptor so as to avoid using many file descriptors when run in parallel from multiple threads. (Contributed by Antoine Pitrou in bpo-18756.)

## 非推奨

このセクションでは、Python 3.4 で非推奨となり Python 3.5 以降で削除予定となる、様々な API とその他機能性についてをカバーします。(全てではありませんが) ほとんどのケースで、非推奨に対する警告を (たとえば `-Wd` を使って) 有効にしたインタプリタ起動時、非推奨 API を使うと `DeprecationWarning` を励起します。

### Python API の非推奨項目

- PEP 451: インポートシステムのための ModuleSpec 型 にて述べたとおり、多数の `importlib` メソッドと関数が非推奨となりました。 `importlib.find_loader()` は `importlib.util.find_spec()` に取って代わられました; `importlib.machinery.PathFinder.find_module()` は `importlib.machinery.PathFinder.find_spec()` に取って代わられました; `importlib.abc.MetaPathFinder.find_module()` は `importlib.abc.MetaPathFinder.find_spec()` に取って代わられました; `importlib.abc.PathEntryFinder.find_loader()` と `find_module()` は `importlib.abc.PathEntryFinder.find_spec()` に取って代わられました; 全ての `xxxLoader` ABC `load_module` メソッド (`importlib.abc.Loader.load_module()`, `importlib.abc.InspectLoader.load_module()`, `importlib.abc.FileLoader.load_module()`, `importlib.abc.SourceLoader.load_module()`) はもう実装されるべきではなく、代わりにローダは `exec_module` メソッド (`importlib.abc.Loader.exec_module()`, `importlib.abc.InspectLoader.exec_module()`, `importlib.abc.SourceLoader.exec_module()`) を実装して残りはインポートシステムに任せなければなりません; そして `importlib.abc.Loader.module_repr()`, `importlib.util.module_for_loader()`, `importlib.util.set_loader()`, `importlib.util.set_package()` は、インポートシステムによって自動的に処理される内容となったため、もはや必要ありません。

- `imp` モジュールは撤廃保留中です。Python 2 と 3 でのコードベースの互換性を維持するために、モジュール削除は現在のところスケジュールされてはいません。

- `formatter` モジュールが撤廃保留中で、Python 3.6 での削除が計画されています。

- `hmac.new()` 関数の digestmod がデフォルトで暗黙に `MD5` を使う仕様は撤廃されます。Python 3.6 では digestmod 引数には明示的にダイジェスト名かコンストラクタを渡すことが求められます。

- `ftplib` モジュール内の内部クラス `Netrc` はずっと長いことそのドキュメンテーション文字列内で非推奨であることを謳ってきました。これは今や `DeprecationWarning` を発行します。Python 3.5 ではこのクラスは完全に削除されます。

- `subprocess.Popen.wait()` の文書化されていない引数 endtime は本来曝してはいけないものでしたので、使用されていないことを願っています。これは非推奨ですし、確実に Python 3.5 では削除されるのではないでしょうか。(---訳注: 3.5 では削除はされませんでしたが、もちろん使用しないでください。これは内部用です。---)

- `HTMLParser` の strict 引数は非推奨です。

- `plistlib` モジュールに追加された `load()`, `dump()`, `loads()`, `dumps()` により、対応する `readPlist()`, `writePlist()`, `readPlistFromBytes()`, `writePlistToBytes()` が非推奨となりました。同じく単に `bytes` コンストラクタを使えば良いので `Data()` が非推奨となりました。

- `sysconfig` のキー `SO` は非推奨です。これは `EXT_SUFFIX` に取って代わられました。

- 種々の `open` 関数で受け付けられていた `U` モードは非推奨となりました。Python 3 ではこれは何も役に立つことはしません。 `io.TextIOWrapper` (必要ならば)、 newline 引数を適切に使うことによって置き換えられるはずです。

- `xml.etree.ElementTree.iterparse()` の parser 引数と `XMLParser()` の html 引数が非推奨となりました。後者は (訳注: 第一引数のため) 削除に備えて `XMLParser` への全ての引数はキーワード引数として渡すようにしてください。

### 非推奨の機能

- IDLE の `-n` フラグでの実行 (サブプロセスを起こさない) は非推奨となりました。ただし、この機能は bpo-18823 が解決するまでは削除はされません。

- `site` モジュールは "site-python" ディレクトリが存在すればこれを sys.path に加えていましたが、これは非推奨となりました。 (bpo-19375)

## 削除

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

以下の OS 向けのソースとビルドツールは削除されました。

- OS/2 (bpo-16135)。

- Windows 2000 (changeset e52df05b496a)。

- `COMSPEC` が `command.com` を指している Windows システム (bpo-14470).

- VMS (bpo-16136)。

### API と機能の削除

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

- 保守されていなかった `Misc/TextMate` と `Misc/vim` ディレクトリは削除されました (代わりに何が使えるかの提案は devguide をみてください --- 訳注: おそらく Additional Resources に挙げられている wiki を指している ---)。

- makefile のマクロ `SO` は削除されました (これは `SHLIB_SUFFIX` マクロと `EXT_SUFFIX` マクロで置き換えられました) (bpo-16754)。

- `PyThreadState.tick_counter` フィールドは削除されました。これは Python 3.2 で「新しい GIL」が導入された際に意味をなくしていました。 (bpo-19199).

- `PyLoader` と `PyPycLoader` が `importlib` から削除されました。 (Contributed by Taras Lyapun in bpo-15641.)

- `HTTPConnection` と `HTTPSConnection` の strict 引数は削除されました。 HTTP 0.9 スタイルの 「Simple Responses」はもはやサポートされません。

- `urllib.request.Request` の非推奨となっていた getter/setter メソッドの `add_data`, `has_data`, `get_data`, `get_type`, `get_host`, `get_selector`, `set_proxy`, `get_origin_req_host`, `is_unverifiable` は削除されました (代わりに属性アクセスを直接使ってください)。

- 非推奨の `TYPE_INT64` ロードのサポートが `marshal` から削除されました。 (Contributed by Dan Riti in bpo-15480.)

- `inspect.Signature`: 位置専用パラメータを示すのに今では正当な名前が必要です。

- object 自身の `object.__format__()` はもはや空でないフォーマット文字列を受け付けず、 `TypeError` を投げます。空でない文字列を渡すことは既に Python 3.2 で非推奨となっていました。この変更は以前は動作した (そして正しくない) コードが、オブジェクトが __format__ メソッドを得ることで処理に失敗し始めていた状況を防ぐ目的でなされました。この変更が意味することはあなたのコードにとって、それを処理する __format__ メソッドを持たないオブジェクトに `s` フォーマットコードを使うと `TypeError` を起こしうるようになった、ということです。背景については bpo-7994 を参照して下さい。 (---訳注: このパラグラフの中盤が非常にわかりにくい表現で訳者も意味を取りきれていませんが、おそらく Python 2.6/3.0 で動作していた例えば `format(1+1j, '10s')` が Python 2.7/3.1 で動作しなくなったことを指しているのだと思います。問題にされているのは動作しなくなったことではなくてむしろ動作していたことで、そして object.__format__ が return str(self).__format__(fmt) で実現されていること。このコードでは fmt は何らの意味も持っていませんので、これは一貫性に欠ける要因である、とのことで、「わかりやすく拒絶する」ことが真意であるようです ---)

- Python 3.2 で非推奨となった `difflib.SequenceMatcher.isbjunk()` および `difflib.SequenceMatcher.isbpopular()` は削除されました: sm が `SequenceMatcher` であるとして、 `x in sm.bjunk` と `x in sm.bpopular` を使うようにしてください。 (bpo-13248)

### コードの整理

- `pydoc` モジュールで、使用されておらず文書化もされていなかった内部的な `Scanner` クラスが削除されました。

- ひどく壊れていた OSX システムで呼ばれる可能性があるのみだった `platform` モジュールの非公開関数 `_mac_ver_lookup`, `_mac_ver_gstalt`, `_bcd2str` とあわせて、非公開かつ実質的に未使用だった `_gestalt` モジュールが削除されました。 (see bpo-18393)

- `tarfile` モジュールの名前空間内に `stat` 定数群がハードコードでコピーされていましたが、これは削除されました。

## Python 3.4 への移植

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

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

- POSIX シェルでは、環境変数 `PATH` に空の値をセットすることは、何もセットしないことと同じです。ところが `PYTHONPATH` に空の値をセットすることは、何もセットしないことと まったく同じではありませんでした: `PYTHONPATH` に空の値をセットすると、 `.` をセットしたのと同じ意味になっていて、これは `PATH` での振舞いから類推しようとすると混乱を招くものでした。この振る舞いは `PATH` での POSIX の慣習に従うように改められました。

- CPython インタプリタのデバッグビルド (`--with-pydebug`) での出力 [X refs, Y blocks] がデフォルトではオフになりました。 `-X showrefcount` オプション起動で再度有効に出来ます。 (Contributed by Ezio Melotti in bpo-17323.)

- python コマンドとほとんどの標準ライブラリスクリプト (また `argparse` も) において、 `--version` が情報出力を `stderr` ではなく `stdout` に行うようになりました (issue へのリンクは その他の改善 セクション内参照)。

### Python API の変更

- `importlib.abc` 内に定義されている ABC は、無分別に `NotImplementedError` を投げるのではなく、相応しい例外を投げるかデフォルト値を返すかのどちらかになりました。このことは `super()` を呼び出して ABC がするがままに任せているコードにのみ影響します。互換性のために、必要であれば `NotImplementedError` とその投げられる新たな例外の両方を捕捉してください。

- モジュール型が `__package__` 属性と `__loader__` 属性をデフォルトで `None` で初期化するようになりました。これら属性がセットされたかどうかを後方互換性のある方法で調べるには、たとえば `getattr(module, '__loader__', None) is not None` のようにしてください。 (bpo-17115.)

- `importlib.util.module_for_loader()` がリロードを適切にサポートするために、 `__loader__` と `__package__` を無条件にセットするようになりました。これが望む振る舞いでないならば、これら属性を手動でセットする必要があるでしょう。モジュールの管理には `importlib.util.module_to_load()` を使うことが出来ます。(---訳注: 最後の「You can use `importlib.util.module_to_load()` for module management.」が意味不明。モジュールのプライベート `_module_to_load` がコンテキストマネージャとして定義されているので、それのことかもしれません。---)

- インポートがリロードの際に無条件に関連属性 (例えば `__name__`, `__loader__`, `__package__`, `__file__`, `__cached__`) をリセットするようになりました。これは、3.3 以前のリロードの際にモジュールを再発見する振る舞いと同じものを復元するものであるということを注記しておきます。 (bpo-19413)

- 凍結パッケージ (frozen package) はもはや `__path__` にパッケージ名を含むリストをセットせず、空リストをセットします。この以前の振る舞いは、凍結パッケージと同じ名前を持つディレクトリが存在する場合のサブモジュールのインポートで、インポートシステムが間違ったことを起こしうるものでした。モジュールがパッケージなのかそうでないのかを決める正しい方法は、 `hasattr(module, '__path__')` を使うことです。 (bpo-18065)

- 凍結モジュール (frozen module) はもはや `__file__` 属性を定義しません。それらはどこかはっきりとした場所からロードされたのではないのですから、凍結モジュールにこの属性をセットすることは、意味的に間違っているのです。モジュールが凍結コード由来であることを知る必要があれば、モジュールの `__spec__.location` に `'frozen'` がセットされているかどうかでわかりますし、ローダが `importlib.machinery.FrozenImporter` のサブクラスかどうかをチェックするか、Python 2 との互換性が必要であれば、 `imp.is_frozen()` が使えます。

- `py_compile.compile()` が書き込み先ファイルパスがシンボリックリンクか非レギュラーファイルの場合に `FileExistsError` を投げるようになりました。これは、警告の役割を果たすためです、インポートがファイルパスの元のファイルタイプが何かによらずに、それらファイルをレギュラーファイルで上書きすることの。

- ソースコードをロードしようとして `SyntaxError` かもしくは `UnicodeDecodeError` を引き起こした場合に、 `importlib.abc.SourceLoader.get_source()` はそれを `ImportError` に読み替えて投げることをしなくなりました。 `ImportError` はそうあるべきなのに見つからない場合にのみ投げられるべきなので、ソースコードが見つかったけれども正しくない構造である場合の意味にまで及ぶのは、手を伸ばし過ぎで過負荷です。ImportError を捕捉していたコードで今後とも構文エラーとデコーディングの問題を無視したいと望むならば、これら 3 つ全ての例外を捕捉するようにしてください。 (訳注: changeset 84172:e353f64dfd95 )

- `functools.update_wrapper()` と `functools.wraps()` が、たとえその関数も `__wrapped__` を持っていたとしても正しくその関数が包まれるように `__wrapped__` 属性値をセットするようになりました。つまり `__wrapped__` 属性は、以前のようにチェイン内の全ての `__wrapped__` 属性が最も内側の関数を参照するのではなく、デコレートされた関数の積み上げを正しくリンクするようになったということです。以前の振る舞いが意図されたものであると思い込んでいたイントロスペクションライブラリの作者は、チェインの中の最初の関数 (`__wrapped__` 属性を持たない) にアクセスするのに `inspect.unwrap()` を使えます。(---訳注: bpo-17482. わかりにくいので実例で。中で適切に @wrap を使うデコレータ @deco1、@deco2 があるとして、my_func をこの両方でデコレートするとします。この場合に、Python 3.3 までは `my_func.__wrapped__.__wrapped__` が AttributeError になります。今回のこの修正で `my_func.__wrapped__.__wrapped__` は期待通りに振舞います。 ---)

- `inspect.getfullargspec()` は、 `inspect.signature()` を前提とした再実装がなされました。これにより、かつて扱えていたよりも遥かに広い種類の呼び出し可能 (callable) を扱うようになりました (訳注: 例えば `open()` などは Python 3.3 までは扱えなかった)。Python 3.4 系列の経過のなかで、追加で組み込みや拡張モジュールの callable がシグニチャのメタデータを持つことが期待されています。 `inspect.getfullargspec()` が非 Python callable で失敗することを前提としたコードは、適宜調整の必要があるかもしれません。

- `importlib.machinery.PathFinder` は `sys.path_hooks` 内のオブジェクトに、空文字列の場合は現在作業ディレクトリを渡すようになりました。結果の `sys.path_importer_cache` が決して `''` を含まないことになるので、 `sys.path` に基いて `sys.path_importer_cache` を巡回しても全てのキーを見つけられません。インタプリタを `-m` で起動した場合も含め、現在作業ディレクトリ内でインポートされた際のモジュールの `__file__` も絶対パスで持つようになりました (ただしスクリプトがコマンドラインから相対パスを使って直接実行された際の `__main__.__file__` を除きます (Contributed by Brett Cannon in bpo-18416))。 (bpo-18416)

- `HTTPConnection` と `HTTPSConnection` から strict 引数が削除されたことは、残りの引数をキーワード引数としてではなく位置引数として使っていたなら意味が変わってしまいます。非推奨警告に注意を払ってきたのであれば、あなたのコードは既に全てのオプショナル引数をキーワードで渡しているはずです。

- `from __future__ import ...` ステートメントの間に文字列が含まれる場合に 常に `SyntaxError` となるようになりました。以前はモジュールの docstring が先頭にある場合とない場合で振る舞いが違っていて、ない場合にこのエラーが意図せず無視される場合がありました。この修正は CPython を言語仕様に準拠させるものです。Jython と PyPy では既にこれが行われています。 (bpo-17434)

- `ssl.SSLSocket.getpeercert()` と `ssl.SSLSocket.do_handshake()` は、 `SSLSocket` が未接続時に以前は `AttributeError` を投げていましたが、 `ENOTCONN` を持った `OSError` を投げるように改められました。加えて `getpeercert()` はハンドシェイクが未実施の場合に `ValueError` を投げるようになりました。

- `base64.b32decode()` が入力文字列が非 b32 文字を含む場合に `TypeError` ではなく `binascii.Error` を投げるようになりました。今回のこの `TypeError` はほか (訳注: if the input is incorrectly padded のとき) の `TypeError` が置き換えられた際に置き換え忘れられたものでした。 (Contributed by Serhiy Storchaka in bpo-18011.) 注意: この修正は後方互換性を保てないので本来メンテナンスリリースの Python 3.3 には入るべきではなかったのですが、不注意で Python 3.3.3 にも行われてしまいました。

- `file` 属性が `cgi.FieldStorage` インスタンスがガーベージコレクトされる際に自動的にクローズされるようになりました。FieldStorage インスタンスを生き永らえさせずにそのファイルオブジェクトを `cgi.FieldStorage` から切り離して取り出していたなら、 `cgi.FieldStorage` インスタンス全体を記憶しておくか、あるいは `cgi.FieldStorage` インスタンスがガーベージコレクトされる前にファイル内容を読み込んでおくかしてください。

- クローズ済みの SSL ソケットに対する `read` や `write` 呼び出しで、以前のようなミステリアスな `AttributeError` ではなく、役に立つ `ValueError` を投げるようになりました。 (bpo-9177)

- `slice.indices()` が巨大な値で `OverflowError` を起こすことはなくなりました。この修正からの流れで `slice.indices()` は負の値に対して `ValueError` を投げるようになっています。以前はこれは馬鹿げた値を返していました。 (bpo-14794)

- 特殊メソッド `__complex__` が複素数ではなく `float` を返す実装をしているオブジェクトを渡すと `cmath` 関数ではエラーとなり、 `complex` コンストラクタでは受け容れられていましたが、これはいずれも `TypeError` となるように改められました。(bpo-16290.)

- 3.2 と 3.3 での `int` コンストラクタが base パラメータとして誤って `float` を許容してしまっていました。それをわざわざやっているとも思えないですが、そうしていたなら今後は `TypeError` になります。 (bpo-16772)

- キーワード専用引数へのデフォルト値が、通常のキーワード引数へのデフォルト値評価の あとで 評価されるようになりました。前ではなく。望むらくは誰一人以前のバギーな振る舞いに頼っちゃうおバカなコードを書いていませんように。願います。 (bpo-16967)

- 古いスレッド状態が `fork()` 後にクリアされるようになりました。これにより、以前は不適切に永遠に生き残ってしまっていたいくつかのシステムリソース (たとえば、スレッドローカル記憶内に維持されたデータベース接続) が解放されるようになります。 (bpo-17094.)

- `__annotations__` 辞書内のパラメータ名が `__kwdefaults__` と同じように適切にマングル化されるようになりました。 (Contributed by Yury Selivanov in bpo-20625.)

- `hashlib.hash.name` が識別子を常に小文字で返すようになりました。以前はいくつかの組み込みハッシュが大文字名を持っていましたが、公式インターフェイスであることから、命名に一貫性を持たせるようにしました。 (bpo-18532)

- `unittest.TestSuite` がその実行後にテストへの参照を取り除くようになったので、テスト集合を再実行するのに `TestSuite` を再利用してテストをまとめあげていると、テスト失敗するかもしれません。テストスイートはそのような方法で再利用すべきではありません。そのようなことをすればテスト実行間で状態が残ってしまうので、 `unittest` 設計の狙いであるテストの独立性を破壊してしまいます。とはいえ、独立性の欠如を受け容れてもいいと思うのであれば、 `TestSuite` をサブクラス化して何もしない `_removeTestAtIndex` を定義することで、古い振る舞いは復元出来ます (`TestSuite.__iter__()` 参照)。 (bpo-11798)

- `unittest` がコマンドライン解析に `argparse` を使うようになりました。このことで、以前は動作していた不当なコマンド形式で許されなくなったものがあります。理屈から言えばこれは後方互換性の問題ではないはずです。許されなくなったコマンド形式は意味をなしていなかったものですから、使われていたとは思えません。

- 関数 `re.split()`, `re.findall()`, `re.sub()` と、 `match` オブジェクトのメソッド `group()`, `groups()` は、操作対象が bytes-like object である場合に常に bytes オブジェクトを返すようになりました。以前は戻り値型は入力型に合わせられていました。戻り値の型がたとえば `bytearray` になることに依存していたのであれば、コードを修正する必要があります。

- `audioop` 関数が文字列を入力として渡すと即座にエラーを投げるようにしました。以前は不規則に後々の処理でようやく失敗していました。 (bpo-16685)

- `HTMLParser` の新規引数 convert_charrefs は現在は後方互換性維持のために `False` をデフォルトとしていますが、最終的には `True` がデフォルトになります。あなたのコードでは `HTMLParser` の全ての呼び出しでこれをキーワード引数として明示することをお勧めします。 (bpo-13633)

- `hmac.new()` 関数の digestmod 引数からデフォルト値が消える予定です。ので、 `hmac.new()` 呼び出しは常に digestmod を明示するように修正すべきです。 (bpo-17276)

- `sysconfig.get_config_var()` にキー `SO` を渡すことと `sysconfig.get_config_vars()` の呼び出し結果から `SO` キーを探すことは非推奨です。このキーは文脈依存の `EXT_SUFFIX` または `SHLIB_SUFFIX` で置き換えられるべきです。 (bpo-19555)

- `open` 系関数にモード `U` を使っていたコードは修正すべきです。 `U` は Python 3 では無力であり、いずれはこれの使用は例外を投げるようになる予定です。使う関数に依存しますが、 newline 引数を使うか、あるいは必要であればストリームを `TextIOWrapper` でラップしてその newline 引数を使うことで、その古い Python 2 の振る舞いと同等なものを実現出来ます。 (bpo-15204)

- スクリプト内から `pyvenv` を使っていて、pip がインストール されない ことを望むならば、コマンド呼び出しに `--without-pip` を追加しなければなりません。

- indent を明示した場合の `json.dump()` と `json.dumps()` のデフォルトの振る舞いが変更されました。要素を区切るカンマが行末に来る場合の後ろに、空白を追加しなくなりました。これはその出力のテストを空白に繊細な比較をすることで行っている場合にだけ問題になります。 (bpo-16333)

- `doctest` が拡張モジュールの `__doc__` 文字列から doctest を見つけるようになったので、doctest のテストディスカバリが拡張モジュールを含んでいてその中で doctest のようにみえるものが含まれていると、テスト実行時にこれまで見かけたことのないテスト失敗を目にするかもしれません。 (bpo-3158)

- `collections.abc` モジュールが、Python スタートアップの改善の一環で少々リファクタリングが行われました。これの結果として `collections` は自動で `collections.abc` をインポートしなくなりました。もしもこの (文書化されていなかった) 暗黙でのインポートに依存していたのであれば、 `import collections.abc` として明示的にインポートを追加する必要があります。 (bpo-20784)

### C API の変更

- いくつかの内部 C API とともに `PyEval_EvalFrameEx()`, `PyObject_Repr()`, `PyObject_Str()` に、現在アクティブな例外を黙殺する状況で使われていないことを確かにするためのデバッグアサーションが仕込まれました。アクティブな例外を捨てることが期待されて望ましいケース (たとえば、既にローカルに `PyErr_Fetch()` で保存済みであるとか、異なる例外に置き換えることが意図である場合) は、アサーション有効でコンパイルされている Python バージョンで実行して、(直接的・間接的によらず) それら操作呼び出しがそのアサーションを発行するのを、明示的に `PyErr_Clear()` 呼び出しをすることで潰してください。

- `PyErr_SetImportError()` が msg がセットされていない場合に `TypeError` をセットするようになりました。以前は例外をセットすることなく `NULL` を返すだけでした。

- `PyOS_ReadlineFunctionPointer` コールバックは、エラー時に `NULL` を返すか `PyMem_RawMalloc()` または `PyMem_RawRealloc()` でアロケートした文字列を返さなければなりません。 `PyMem_Malloc()` や `PyMem_Realloc()` でアロケートした文字列はダメです。 (bpo-16742)

- `PyThread_set_key_value()` が必ず値をセットするようになりました。Python 3.3 ではこの関数はキーが既存 (で現在値が `NULL` ポインタでない) の場合には何もしませんでした。

- `PyFrameObject` 構造体のフィールド `f_tstate` (thread state) が、バグをフィックスするために削除されました: 論拠については bpo-14432 を参照してください。

## 3.4.3 の変更

### PEP 476: stdlib http クライアントが証明書の検証を行うのをデフォルトで有効化

`http.client` とこのモジュールを使っている例えば `urllib.request` や `xmlrpc.client` が、サーバをプラットフォームが持つ信頼ストアにある CA により署名された証明書で検証し、そのホスト名がリクエストされたホスト名かどうかのチェックをデフォルトで行うようになりました。これは多くのアプリケーションにとって大幅なセキュリティ改善になります。

以前の古い振る舞いが必要なアプリケーションでは、代わりとなるコンテキストを渡せます:

    import urllib.request
    import ssl

    # This disables all verification
    context = ssl._create_unverified_context()

    # This allows using a specific certificate for the host, which doesn't need
    # to be in the trust store
    context = ssl.create_default_context(cafile="/path/to/file.crt")

    urllib.request.urlopen("https://invalid-cert", context=context)