What’s New In Python 3.3

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

参考

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

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

新たな文法機能:

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

  • faulthandler (低水準のクラッシュのデバッグを補助する)
  • ipaddress (IPアドレスとマスクを表す高水準オブジェクト)
  • lzma (XZ / LZMA アルゴリズムを使用したデータ圧縮)
  • unittest.mock (テスト向けにシステムの一部をモックオブジェクトで置き換える)
  • venv (人気の virtualenv パッケージのような、Python virtual environments)

新たな組み込み機能:

実装の改善:

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

  • decimal モジュールのCによる高速化
  • email モジュールでのより良いユニコード処理 (暫定版)

セキュリティの改善:

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

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

PEP 405: 仮想環境

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

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

参考

PEP 405 - Python Virtual Environments
PEP written by Carl Meyer; implementation by Carl Meyer and Vinay Sajip

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

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

参考

PEP 420 - Implicit Namespace Packages
PEP written by Eric V. Smith; implementation by Eric V. Smith and Barry Warsaw

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

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

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

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

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

フィーチャー

  • struct モジュールの構文の全ての native 書式指定文字 をサポートするようになりました (『@』 プレフィクスが付いていても良いです)。 (訳注: format 参照。)
  • いくつかの制限はありますが、 cast() メソッドでフォーマット変更と C-contiguous 配列の形状 (shape) の変更を行うことが出来ます。
  • 任意の配列型で多次元のリスト表現がサポートされるようになっています。
  • 任意の配列型で多次元の比較がサポートされるようになっています。
  • 『B』, 『b』, 『c』 いずれかのフォーマットの hashable な (読み込み専用の) 型の1次元メモリビューもまた、 hashable です。 (Contributed by Antoine Pitrou in bpo-13411.)
  • 1 次元配列型での任意のスライスがサポートされています。たとえば負の step を与えて memoryview を逆順に並べ替えることが O(1) オーダで出来るようになりました。

API の変更

  • 最大 次元 は公式に 64 に制限されています。
  • 空の shape, 空の strides, 空の suboffsets を表現するのに以前は None を用いていましたが今ではこれは空のタプルです。
  • フォーマット 『B』 (unsigned bytes) での memoryview 要素へのアクセスは整数を返すようになりました (struct モジュールでの構文に従っています)。bytes オブジェクトが欲しければまずビューを 『c』 で cast() しなければなりません。
  • memoryview どうしの比較は被演算対象の論理構造を使って行うようになり、また、全ての配列要素は値で比較されます。struct モジュールの構文の全てのフォーマット文字でサポートされます。認識出来ないフォーマット文字でのビューは今でも許されていますが、ビューの指す中身によらずこれは常に等しくないとされます。
  • ほかの変更については、 ビルドならびに C API の変更C コードの移植 を参照してください。

(Contributed by Stefan Krah in bpo-10181.)

参考

PEP 3118 - Revising the Buffer Protocol

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

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

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

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

機能性

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

  • Python は今や非 BMP 面の文字を含む Unicode コードポイントの完全な範囲 (つまり U+0000 から U+10FFFF まで) を常にサポートします。narrow ビルド / wide ビルドという区別は今では存在していないため、Python は今ではいつでもかつての wide ビルドのように振る舞い、Windows でもこれは例外ではありません。
  • narrow ビルドとの決別は、それに付き物だった問題も解決しました。例えば:
    • len() は今では非 BMP 面文字について必ず 1 を返します。つまり len('\U0010FFFF') == 1 です;
    • サロゲートペアが文字列リテラル内で再結合されることはありません。つまり '\uDBFF\uDFFF' != '\U0010FFFF' です;
    • 非 BMP 面文字を指すインデクスやスライスは期待通りの値を返します。つまり '\U0010FFFF'[0] は今では '\uDBFF' ではなく '\U0010FFFF' を返します;
    • ほかの全ての標準ライブラリ関数が今では正しく非 BMP コードポイントを処理します。
  • sys.maxunicode の値は今やいつでも 1114111 (十六進で 0x10FFFF) です。後方互換性のために C API の PyUnicode_GetMax() 関数は今でも 0xFFFF0x10FFFF のどちらかを返すようになってはいますが、新しい Unicode API とともには使ってはいけません (see bpo-13054)。
  • ./configure スクリプトのフラグ --with-wide-unicode は削除されました。

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

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

  • 純粋な ASCII と Latin1 文字列 (U+0000-U+00FF) はコードポイントごとに 1 バイトを占めます;
  • BMP 文字列 (U+0000-U+FFFF) はコードポイントごとに 2 バイトを占めます;
  • 非 BMP 文字列 (U+10000-U+10FFFF) はコードポイントごとに 4 バイトを占めます。

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

参考

PEP 393 - 文字列の柔軟な表現 (Flexible String Representation)
PEP written by Martin von Löwis; implementation by Torsten Becker and Martin von Löwis.

PEP 397: Windows の Python ランチャ

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

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

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

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

参考

PEP 397 - Python Launcher for Windows
PEP written by Mark Hammond and Martin v. Löwis; implementation by Vinay Sajip.

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

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

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

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

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

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

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

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

from errno import ENOENT, EACCES, EPERM

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

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

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

参考

PEP 3151 - Reworking the OS and IO Exception Hierarchy
PEP written and implemented by Antoine Pitrou

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

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

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

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

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

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

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

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

参考

PEP 380 - サブジェネレータへの委譲構文
PEP written by Greg Ewing; implementation by Greg Ewing, integrated into 3.3 by Renaud Blanch, Ryan Kelly and Nick Coghlan; documentation by Zbigniew Jędrzejewski-Szmek and Nick Coghlan

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

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

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

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

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

During handling of the above exception, another exception occurred:

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

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

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

参考

PEP 409 - 例外コンテクストの抑制
PEP written by Ethan Furman; implemented by Ethan Furman and Nick Coghlan.

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

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

参考

PEP 414 - 明示的なユニコードリテラル
PEP written by Armin Ronacher.

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

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

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

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

入れ子のクラスでの例:

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

入れ子の関数の例:

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

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

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

参考

PEP 3155 - クラスと関数の正規名 (qualified name)
PEP written and implemented by Antoine Pitrou.

PEP 412: キー共有辞書

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

参考

PEP 412 - キー共有辞書
PEP written and implemented by Mark Shannon.

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

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

参考

PEP 362: - 関数シグニチャオブジェクト
PEP written by Brett Cannon, Yury Selivanov, Larry Hastings, Jiwon Seo; implemented by Yury Selivanov.

PEP 421: sys.implementation の追加

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

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

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

SimpleNamespace

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

参考

PEP 421 - sys.implementation の追加
PEP written and implemented by Eric Snow.

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

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

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

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

新たな API

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

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

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

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

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

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

目に見える変化

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

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

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

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

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

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

(Implementation by Brett Cannon)

その他の言語変更

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

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

    (Contributed by Ezio Melotti in bpo-12753.)

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

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

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

    (Contributed by Petri Lehtinen in bpo-12170.)

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

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

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

    (Contributed by Antoine Pitrou in bpo-13748.)

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

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

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

    (Contributed by Benjamin Peterson.)

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

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

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

(Contributed by Antoine Pitrou in bpo-9260.)

組み込みの関数と型

  • open() に新規パラメータ opener が追加されました。背後のファイルオブジェクトのファイル記述子は opener を (file, flags) で呼び出して得られます。これは例えば os.O_CLOEXEC のようなカスタムなフラグを用いるのに使えます。 / 'x' モードが追加されました。排他的作成として開きます。ファイルが既存の場合は失敗します。
  • print(): flush キーワード引数が追加されました。flush キーワード引数が真の場合ストリームは強制的にフラッシュされます。
  • hash(): ハッシュのランダム化がデフォルトで有効になりました。 object.__hash__() と環境変数 PYTHONHASHSEED を参照してください。
  • str 型に casefold() メソッドが追加されました。文字列の casefold されたコピーを返します。casefold された文字列は、大文字小文字に関係ないマッチに使えます。例えば 'ß'.casefold()'ss' を返します。
  • シーケンスについてのドキュメントを大幅に書き換えました。バイナリのシーケンスとテキストのシーケンスについての区別についてより良い説明を加え、また、個々の組み込みシーケンスに関して個別のドキュメントを提供しています (bpo-4966)。

新たなモジュール

faulthandler

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

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

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

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

ipaddress

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

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

lzma

新たに追加された lzma モジュールは LZMA アルゴリズムを用いたデータの圧縮と解凍を提供します。.xz および .lzma ファイル形式もサポートされています。

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

改良されたモジュール

abc

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

(Contributed by Darren Dale in bpo-11610.)

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

array

array モジュールに型コード qQ による long long 型サポートが追加されました。

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

base64

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

binascii

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

bz2

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

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

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

    (Contributed by Nadeem Vawda in bpo-5863.)

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

    (Contributed by Nir Aides in bpo-1625.)

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

codecs

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

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

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

(bpo-12016)

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

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

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

(bpo-12100)

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

collections

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

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

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

contextlib

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

(bpo-13585)

crypt

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

(bpo-10924)

curses

  • curses モジュールが ncursesw ライブラリとリンクしている場合に、 Unicode 文字列や Unicode 文字が渡されれば Unicode 関数 (例えば waddwstr())、それ以外の場合はバイト列用関数 (例えば waddstr()) を呼び出すようにしました。
  • Unicode 文字列をエンコードするのに utf-8 ではなく locale のエンコーディングを使うようになりました。(—訳注: bpo-12567 に対応した説明と思います。とすればこれは ワイド文字を受け取らない C 関数に渡す 際に Unicode をエンコードする際の話。このときに以前は暗黙で utf-8 でエンコードしていたのは「誤りである」ということのようです。 —)
  • curses.window クラスに属性 curses.window.encoding が追加されました。
  • curses.window クラスに get_wch() メソッドが追加されました。これはワイド文字を一つ取得します。
  • curses モジュールに関数 unget_wch() が追加されました。これはワイド文字をプッシュし、次に get_wch() を呼び出した時にその値が返るようにします。

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

datetime

  • naive な datetime インスタンスと aware な datetime インスタンスの等価比較で、 TypeError を投げずに False を返すようになりました。 (bpo-15006).
  • 新規メソッド datetime.datetime.timestamp(): datetime インスタンスに対応する POSIX タイムスタンプを返します。
  • datetime.datetime.strftime() メソッドが 1000 年よりも前の書式化をサポートしました。(—訳注: What’s New in Python 3.2 での変更も参照してみてください。—)
  • datetime.datetime.astimezone() メソッドを引数なしで呼び出せるようになりました。これは datetime インスタンスをシステムのタイムゾーンに変換します。

decimal

bpo-7652 - decimal 算術演算の、高速なネイティブ 実装の統合
C-module and libmpdec written by Stefan Krah.

decimal モジュールの新しい C バージョンは高速な libmpdec と統合します。それは任意精度で正しい丸めを行う 10 進浮動小数点数算術演算を行います。libmpdec は IBM の「General Decimal Arithmetic Specification」に従っています。

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

以下の表は説明のためのものです。ベンチマークは http://www.bytereef.org/mpdecimal/quickstart.html にあります。

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

フィーチャー

  • FloatOperation シグナル により、float と Decimal の混合の厳密なセマンティクスを有効に出来ます。(—訳注: 使用例が クイックスタートチュートリアル にあります。—)
  • Python がスレッド無しでコンパイルされている場合、C 版は自動的にコストがかかるスレッドローカルなコンテキスト機構を使用不可にします。この場合、 HAVE_THREADSFalse にセットされます。

API の変更

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

      32-bit 64-bit
    MAX_PREC 425000000 999999999999999999
    MAX_EMAX 425000000 999999999999999999
    MIN_EMIN -425000000 -999999999999999999
  • コンテキストの雛形 (DefaultContext, BasicContext, ExtendedContext) では EmaxEmin の絶対値が 999999 に変更されました。

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

  • decimal.py の power() 関数は「always correctly-rounded (必ず適切に丸められる)」です。C 版ではこれの意味は関数 exp()ln() に関してであり、最終的な結果においては「almost always correctly rounded (ほとんど必ず適切に丸められる)」となるだけです。

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

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

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

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

email

ポリシーフレームワーク

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

その他のAPIの変更

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

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

  • format_datetime(): datetime を与えると email ヘッダで使われる書式でフォーマットした文字列を生成します。
  • parsedate_to_datetime(): email ヘッダからの日付文字列を渡すと、 aware な、または naive な datetime に変換します。オフセットが -0000 の場合に naive で返します。
  • localtime(): 引数なしで呼び出すと、ローカル timezone を使った aware な datetime として現在ローカル時間を返します。aware な datetime を渡して呼び出すと、ローカル timezone を使った aware な datetime に変換します。

ftplib

  • ftplib.FTP に新しいキーワード引数 source_address が追加されました。 (host, port) の形で指定し、これは外に向かうソケットを作成する際に bind() 呼び出し内でのソースアドレスとして用いられます。 (Contributed by Giampaolo Rodolà in bpo-8594.)
  • FTP_TLS クラスに、制御チャネルを平文に戻すための ccc() 関数が追加されました。これは、固定ポートで開くことなく非セキュア FTP で NAT を処理する方法を知っているファイアウォールを利用するのに有用となりえます。(Contributed by Giampaolo Rodolà in bpo-12139.)
  • 新規メソッド ftplib.FTP.mlsd() は機械で読めるディレクトリリスティングのフォーマットを提供し、 ftplib.FTP.nlst()ftplib.FTP.dir() に取って代わるものとなりました。(Contributed by Giampaolo Rodolà in bpo-11072.)

functools

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

gc

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

hmac

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

http

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

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

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

html

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

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

imaplib

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

(Contributed by Sijin Joseph in bpo-8808.)

inspect

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

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

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

(Contributed by Meador Inge in bpo-15153.)

io

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

(Contributed by David Townshend in bpo-12760.)

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

itertools

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

logging

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

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

math

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

(Written by Mark Dickinson in bpo-11888.)

mmap

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

multiprocessing

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

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

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

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

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

nntplib

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

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

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

os

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

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

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

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

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

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

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

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

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

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

  • Linux 拡張属性をサポートするための新たな関数 (bpo-12720): getxattr(), listxattr(), removexattr(), setxattr().
  • スケジューラに対する新たなインターフェイス。これら関数はプロセスに対する OS による CPU 時間割り当てを制御します。新規関数: sched_get_priority_max(), sched_get_priority_min(), sched_getaffinity(), sched_getparam(), sched_getscheduler(), sched_rr_get_interval(), sched_setaffinity(), sched_setparam(), sched_setscheduler(), sched_yield(),
  • ファイルシステムを制御する新たな関数:
    • posix_fadvise(): データへアクセスする意思を、パターンを指定して宣言します。これによりカーネルが最適化を行えるようになります。
    • posix_fallocate(): ファイルを割り当てるに十分なディスクスペースを確保します。
    • sync(): ディスクへの全ての書き込みを強制します。
  • 追加された新たな POSIX 関数:
    • lockf(): オープンされたファイル記述子に対して、POSIX ロックの適用、テスト、解除を行います。
    • pread(): ファイル記述子の指定オフセット位置から読み込みます。ファイルオフセットは変化しません。
    • pwrite(): ファイル記述子に対し、指定オフセット位置から書き出します。ファイルオフセットは変化しません。
    • readv(): ファイル記述子からデータを読みこんで複数の書き込み可能なバッファに書き込みます。
    • truncate(): path に対応するファイルを、サイズが最大で length バイトになるよう切り詰めます。
    • waitid(): 一つ以上の子プロセスの完了を待ちます。
    • writev(): buffers の内容をファイル記述子へ書き出します。 buffer は任意のバッファのシーケンスです。
    • getgrouplist() (bpo-9344): 指定したユーザが属するグループ ID のリストを返します。
  • times() および uname(): 戻り値の型がタプルから属性名のついたタプルライクオブジェクトに変更されました。
  • いくつかのプラットフォームにおいて、 lseek() 関数で使う追加の定数をサポートするようになりました。 os.SEEK_HOLEos.SEEK_DATA などです。
  • 新規の定数 RTLD_LAZY, RTLD_NOW, RTLD_GLOBAL, RTLD_LOCAL, RTLD_NODELETE, RTLD_NOLOAD, RTLD_DEEPBIND が、それをサポートしているプラットフォームで利用可能になりました。これらは sys.setdlopenflags() 関数で使います。これら定数は ctypes モジュールと DLFCN で定義されている同じような定数を置き換えるものです。(Contributed by Victor Stinner in bpo-13226.)
  • クロスプラットフォームのサポートを簡単にするために、非 Windows 環境でも os.symlink() がキーワード引数 target_is_directory を受け付けるようになりました (単に無視します)。

pdb

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

(Contributed by Georg Brandl in bpo-14210)

pickle

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

(Contributed by Richard Oudkerk in bpo-14166.)

pydoc

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

re

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

(Contributed by Serhiy Storchaka in bpo-3665.)

sched

  • run()blocking パラメータを取るようになりました。 これを偽にセットすると、このメソッドは既に実行予定時間になっているイベント (もしあれば) を実行してすぐに戻ります。 これは scheduler を非ブロッキングなアプリケーションで使いたい場合に有用です。 (Contributed by Giampaolo Rodolà in bpo-13449.) (—訳注: 原文の表現がわかりにくいですが、これは blocking=False 時はスケジュールされた時間になっているタスクがあれば通常は delayfunc を呼び出すところをそうせずに、一番早く次の予定時間に達するタスクの予定時間までの時間差を返します。—)
  • scheduler クラスをマルチスレッド環境で安全に使えるようになりました。 (Contributed by Josiah Carlson and Giampaolo Rodolà in bpo-8684.)
  • scheduler クラスのコンストラクタでのパラメータ timefuncdelayfunc が省略可能になりました。それぞれデフォルトで順に time.time(), time.sleep() が使われます。 (Contributed by Chris Clark in bpo-13245.)
  • enter()enterabs()argument パラメータが省略可能になりました。 (Contributed by Chris Clark in bpo-13245.)
  • enter()enterabs()kwargs パラメータを受け付けるようになりました。 (Contributed by Chris Clark in bpo-13245.)

select

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

shlex

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

shutil

  • 新たな関数:
    • disk_usage(): ディスクの利用状況について、トータル、使用中、空きの容量を返します。 (Contributed by Giampaolo Rodolà in bpo-12442.)
    • chown(): 指定された path のユーザ、グループの両方あるいは一方を変更します。ユーザ、グループは名前もしくは数値での ID (uid, gid) で指定します。(Contributed by Sandro Tosi in bpo-12191.)
    • shutil.get_terminal_size(): インタプリタが接続しているターミナルウィンドウのサイズを取得します。 (Contributed by Zbigniew Jędrzejewski-Szmek in bpo-13609.)
  • copy2()copystat() がファイルのタイムスタンプを、それをサポートするプラットフォームではナノ秒精度も維持するようになりました。また、Linux ではこれらは「拡張属性 (extended attributes)」もコピーするようになりました。 (Contributed by Larry Hastings in bpo-14127 and bpo-15238.)
  • いくつかの関数がオプショナルな symlinks 引数を取るようになりました。これが真の場合、シンボリックリンクの指す先を解決するのではなくシンボリックそのものに対しての操作をします (そうすることが必要であればシンボリックリンク作成もします)。(Contributed by Hynek Schlawack in bpo-12715.)
  • ファイルシステムをまたがったファイルのコピーの際に、 move() がシンボリックリンクを POSIX の move コマンドが行うのと同じやり方で扱うようになりました。つまりターゲットのファイルの中身をコピーするのではなくシンボリックリンクを再作成します。(Contributed by Jonathan Niehof in bpo-9993.) また、 move()dst 引数を戻り値として返すようになりました。
  • os.open()os.unlink() が新パラメータ dir_fd をサポートしているプラットフォームでは、 rmtree() は今では シンボリックリンク攻撃に耐性を持ちます。 (Contributed by Martin von Löwis and Hynek Schlawack in bpo-4489.)

signal

  • signal モジュールに新規関数が追加されました:
    • pthread_sigmask(): これを呼び出すスレッドにセットされているシグナルマスクを取り出したり変更したりします (Contributed by Jean-Paul Calderone in bpo-8407);
    • pthread_kill(): スレッドにシグナルを送ります;
    • sigpending(): 保留中のシグナルを調べます;
    • sigwait(): シグナルを待ちます;
    • sigwaitinfo(): シグナルを待ちますが、それについての詳細情報を返します;
    • sigtimedwait(): sigwaitinfo() と似ていますがタイムアウト指定できます。
  • シグナルハンドラは wakeup ファイル記述子に以前は \0 を書き込んでいましたが、シグナル番号を 1 バイト整数として書き込むようにしました。これにより、一つ以上のシグナルを待った上でどのシグナルが発生したのかあとから調べるといったことが出来ます。
  • signal.signal()signal.siginterrupt() は RuntimeError ではなく OSError を投げるようになりました: OSError は errno 属性を持っています。

smtpd

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

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

smtplib

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

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

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

socket

socketserver

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

sqlite3

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

ssl

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

    (Contributed by Victor Stinner in bpo-12049.)

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

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

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

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

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

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

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

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

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

stat

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

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

struct

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

subprocess

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

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

sys

sys モジュールに、スレッドの実装に関する情報が格納された 構造体シーケンス を保持する thread_info が追加されました。 (bpo-11223)

tarfile

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

tempfile

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

textwrap

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

threading

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

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

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

time

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

  • get_clock_info(): クロックの情報を取得します。
  • monotonic(): 単調なクロック (逆行しない)、システムクロックの更新の影響を受けません。
  • perf_counter(): 短期間の計測のために利用可能な最高の解像度を持つパフォーマンスカウンタです。
  • process_time(): 現在のプロセスの system と user CPU 時間の和です。

その他の新たな関数:

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

types

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

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

unittest

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

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

urllib

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

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

(bpo-1673007)

webbrowser

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

xml.etree.ElementTree

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

zlib

新規属性 zlib.Decompress.eof が追加されました。これにより適切に作られたストリームなのか不完全だったり切り捨てられたものなのかを区別することが出来ます。 (Contributed by Nadeem Vawda in bpo-12646.)

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

最適化

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

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

    • メモリフットプリントはテキストに依存して 1/2 から 1/4 になりました
    • ASCII 文字列を UTF-8 にエンコードするのに文字をエンコードする必要はなくなりました、UTF-8 表現は ASCII 表現と共有されます
    • UTF-8 エンコーダが最適化されました
    • 単一の ASCII 文字を繰り返して ASCII 文字列の部分列を得るのは 4 倍速くなりました
  • UTF-8 が2倍から4倍速くなりました。UTF-16 のエンコーディングが最大で10倍速くなりました。

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

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

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

非推奨

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

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

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

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

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

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

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

Py_UNICODE および Py_UNICODE* を使用しているユニコード関数ならびにメソッド:

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

エンコーダ:

非推奨の機能

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

Python 3.3 への移植

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

Python コードの移植

  • ハッシュのランダム化がデフォルトで有効になりました。これを無効にするには環境変数 PYTHONHASHSEED0 にセットして下さい。 object.__hash__() メソッドも参照して下さい。
  • bpo-12326: Linux では、 sys.platform はもはやメジャーバージョン番号を含みません。 これは今では常に 『linux』 です。以前はこれは Python のビルドに使われた Linux バージョンに依存した 'linux2''linux3' でした。 sys.platform == 'linux2' などとするのではなく、 sys.platform.startswith('linux') とするか、古い Python バージョンのサポートが不要であれば直接的に sys.platform == 'linux' として下さい。
  • bpo-13847, bpo-14180: time および datetime: タイムスタンプが範囲外の場合に、 ValueError ではなく OverflowError を送出するようになりました。また、C 関数の gmtime() あるいは localtime() が失敗した場合には OSError を送出するようになりました。
  • インポートで使われるデフォルトのファインダが、特定のディレクトリに何が含まれるのかについてのキャッシュを利用するようになっています。実行中に Python ソースファイルやバイトコードファイルを作ったら、キャッシュをクリアしてファインダが新しく作られたファイルに気付けるように、 importlib.invalidate_caches() を呼ぶ必要があることに注意してください。
  • ImportError がインポートを試みたモジュール名として完全名を使うようになっています。ImportError のメッセージをチェックする doctest は、モジュール名をその末尾の名前ではなく完全な名前を使うように更新する必要があります。
  • __import__() の引数 index のデフォルトが -1 ではなく 0 となり、また、もはや負の値はサポートされません。デフォルト値が -1 で残されたのは(訳注: つまり絶対、相対インポートの両方を試みるようにしたのは) PEP 328 を実装した際の過失でした。絶対インポートに先立って相対インポートを実行する振る舞いがまだ必要なのであれば、index を 1 にして相対インポートを実行して、その後で index 0 のインポートをするようにしてください。そうなのですが、 __import__() を直接呼び出すのではなく、 importlib.import_module() を使うことが望ましいやり方です。
  • __import__() の index に、トップレベルモジュールに対して 0 でなく 1 を与えることは今では許されません。例えば __import__('sys', level=1) はエラーです。
  • sys.meta_pathsys.path_hooks にデフォルトでファインダが含まれるようになったので、これらリストの操作で list.append() してきたのであれば、今後はおそらくほとんどは list.insert() が相応しいでしょう。
  • ファインダが見つからない場合に sys.path_importer_cacheNone が挿入されるようになったので、ファインダを持たないパスの辞書エントリをクリアするには、後方互換性を保つためには imp.NullImporter を値に持つエントリと None を値に持つエントリ の両方を 削除する必要があります。古い Python バージョンと比較して、暗黙のファインダを使うことを示すのに sys.path_importer_cacheNone を再挿入するという追加のオーバヘッドが必要となりますが、意味的には何の変更もないはずです。
  • importlib.abc.Finderfind_module() 実装を強制することで行われていた抽象化は撤廃されています。そのメソッドを実装するサブクラスに依存していたならば、メソッドの存在を先にチェックするようにしてください。ですが、 path entry finders とともに動作させるのに、 find_loader() を最初にチェックしたくなるかもしれません。
  • pkgutil は、内部的に importlib を使うように変更されました。このことは、 PEP 302 インポートエミュレーションの古い振る舞いが本物のインポートシステムの振る舞いに合わせるのに失敗していた数多くの特殊ケースの問題を取り除きます。インポートエミュレーションそのものはまだ存在しますが、今では非推奨です。 pkgutil.iter_importers() 関数と pkgutil.walk_packages() 関数は標準インポートフックを特別に扱うので、ファインダの iter_modules() メソッドは標準ではないにも関わらず、まだサポートされます。
  • email.header.decode_header() によってなされる解析に長い間存在していた RFC 非準拠のバグ (bpo-1079) が修正されました。エンコードされたヘッダを Unicode に変換するための標準的なイディオム (str(make_header(decode_header(h))) を使うコードからは変化はみえません。ですが、 decode_header から返される個々のタプル要素を見ているコードでは、 ASCII セクションの前後の空白が ASCII 内に含まれるようになったことがわかります。 make_header は入力文字列に既に存在していなければ ASCIIASCII セクション間に以前と同じく空白を追加するので、 make_header を使ってヘッダを構築するコードは変更なしで動作するはずです。
  • email.utils.formataddr() は非 ASCII の display name に対し正しい content transfer encoding の扱いをするようになっています。かつての、フォーマット後文字列内に非 ASCII Unicode を維持してしまう誤った振る舞いに依存するすべてのコードは、変更の必要があります。 (bpo-1690608)
  • poplib.POP3.quit() メソッドもほかの全ての poplib のメソッドと同じく、今ではプロトコルエラーを送出し得ます。 quitpoplib.error_proto エラーを送出しないことをあてにしていたコードは、 quit でのエラーが特定のアプリケーションにとって問題となるようであれば、修正の必要があるかもしれません (bpo-11291)。
  • Python 2.4 から非推奨となっていた、 email.parser.Parser への strict 引数はついに削除されました。
  • 非推奨となっていたメソッド unittest.TestCase.assertSameElements は削除されました。
  • 非推奨となっていた変数 time.accept2dyear は削除されました。
  • 非推奨となっていた Context._clamp 属性が decimal モジュールから削除されました。以前に既にこれは公開属性 clamp に置き換えられていました (bpo-8540 参照)。
  • 文書化されていなかった内部ヘルパクラス SSLFakeFilesmtplib モジュールより削除されました。この機能はずっと以前から socket.socket.makefile() によって直接的に提供されています。
  • Windows では time.sleep() に負値を与えた場合に無限に眠っていましたが、今ではこれは例外を送出します。POSIX ではこれは以前より常に例外です。
  • 定数 ast.__version__ は削除されました。AST バージョンに依拠して何かしらの決定をする必要があるのであれば、 sys.version_info を使ってください。
  • threading モジュールの、非公開クラスをサブクラス化するファクトリ関数を迂回していたコードは、今では公開クラスになったので修正の必要があります。
  • threading モジュール内の文書化されていなかったデバッグ機構を削除してコードを単純化しました。このことが製品コードに影響することがあってはなりませんが、これと連携していたアプリケーションデバッグフレームワークのケースがありうるので、言及しておきます (bpo-13550)。

C コードの移植

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

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

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

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

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

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

C 拡張のビルド

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

    (implemented in bpo-14040.)

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

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

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

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

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