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 に追加された新しい文法機能はありません。

その他の新しい機能:

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

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

セキュリティの改善:

CPython の実装の改善:

以降は、たくさんのほかの小さな改善、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) となります。一般的にはこれこそがアプリケーションが望む振る舞いです。新たにプロセスを生成する際に、現在開いているファイルを起こした子プロセスでも開くことは、検出が困難なあらゆるバグや潜在的なセキュリティ問題を引き起こしかねません。

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

参考

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

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

  • Argument Clinic の導入、 inspectpydoc になされた他の変更の結果、多くの場合で 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 のインストレーションや仮想環境に対する自動ブートストラップを拒否していた場合には、手動でそれをブートストラップするのに使えます。

ensurepippip のバンドルされたコピーを含んでいて、これは 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.)

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

filecmp

clear_cache() 関数が追加されました。 filecmpos.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 パスワードベースの鍵導出関数2 を提供します。 (Contributed by Christian Heimes in bpo-18582.)

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

hmac

hmac は、 new()key 引数として bytearraybytes を許容するようになり、また、 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.)

HTMLParserstrict 引数が非推奨となりました。 (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.utilMAGIC_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 ブートストラップ NamespaceLoaderInspectLoader ABC に従うようになりました。つまりこれにより runpypython -m が名前空間パッケージに対して使えるようになりました。(Contributed by Brett Cannon in bpo-18058.) (訳注: 3.3 以降の名前空間パッケージについては What's New In Python 3.3 (PEP 420) 参照。)

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

importlib.machinery.ExtensionFileLoaderget_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

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

SocketHandlerDatagramHandler が Unix ドメインソケットをサポートするようになりました (portNone をセットすることで)。 (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 つ、 spawnforkserver が追加されました。これらはスレッドとプロセスのミックスをより堅牢にし、また、 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 が、ジェネレータ、 yieldyield 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_chatmap 引数に垂れ流すための 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

SMTPExceptionOSError のサブクラスになりました。これによって、とにかくエラーが起こったのだということにしか関心がないコードが、ソケット階層でのエラーと 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_1PROTOCOL_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 デフォルトの cafilecapath をセットするのに使うパスと環境変数から成る名前付きタプルを返します。デフォルトの検証にまつわる問題をデバッグするのに使えるでしょう。(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 インタプリタが tut-interactive で開始する際に 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 が最大出力行数、 placeholdermax_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() の複数回呼び出し内で使ったり、あるいは、まっさらから作り直すのではなく Requesturl を書き換えて使ったり出来ます。新たに 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

TestCase クラスに新規コンテキストマネージャ subTest() が追加されました。これは with ブロックを「サブテスト化」するコンテキストマネージャを生成します。このコンテキストマネージャにより、テストメソッドで例えばループ内で subTest コンテキストマネージャを呼び出すことで動的にサブテストを作れます。単一のテストメソッドでこれによる「個別に識別され」「個別にカウントされる」テスト群を不定数ぶん生成出来て、そしてそれらはいずれかが失敗したとしても全てが実行されます。例えば以下:

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

venvcshfish シェルの有効化スクリプトが追加されました。 (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:c89febab4648Lib/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 を使うように変換されていて、またこれの結果として pydocinspect が更新されました。

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

  • 新たな make ターゲットの coverage-report の追加。これは python をビルドし、テストスイートを実行し、 gcovlcov を用いて C 言語のコードベースのカバレッジレポートを HTML で生成します。

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

  • bz2lzmagzip モジュールの 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() は、複数のスレッドから並行して実行された時に多数のファイル記述子が使われることを避けるために、遅延オープンされる永続的なファイル記述子を使うようになりました。 (Contributed by Antoine Pitrou in bpo-18756.)

非推奨

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

Python API の非推奨項目

非推奨の機能

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

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

削除

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

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

API と機能の削除

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

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

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

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

  • PyLoaderPyPycLoaderimportlib から削除されました。 (Contributed by Taras Lyapun in bpo-15641.)

  • HTTPConnectionHTTPSConnectionstrict 引数は削除されました。 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() は削除されました: smSequenceMatcher であるとして、 x in sm.bjunkx 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.PathFindersys.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)

  • HTTPConnectionHTTPSConnection から 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 ソケットに対する readwrite 呼び出しで、以前のようなミステリアスな 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.requestxmlrpc.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)