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)
新しい組み込み機能:
I/O 例外階層 の手直し
実装の改善:
ライブラリモジュールの大幅な改善:
セキュリティの改善:
ハッシュのランダム化がデフォルトで有効になりました。
以降はユーザ向けの変更の包括的なリストになっています。
PEP 405: 仮想環境¶
仮想環境 (virtual environment) は隔離されたPython環境を作成する手助けをします。
一方で保守を容易にするために、システム全体のインストールを共有します。
仮想環境はそれ自身の site packages (つまりローカルにインストールされたライブラリ) を持ちつつ、任意でシステム全体の site packages と分離できます。
このコンセプトと実装は、人気のサードパーティパッケージである virtualenv
を元にしていますが、インタプリタコアとの統合による恩恵を受けています。
この PEP はプログラムからのアクセス用の venv
モジュールと、コマンドラインからのアクセスと管理向けの pyvenv スクリプトを追加します。Pythonインタプリタは仮想環境のディレクトリツリーの存在を示す pyvenv.cfg
をチェックします。
参考
- PEP 405 - Python Virtual Environments
- PEP written by Carl Meyer; implementation by Carl Meyer and Vinay Sajip
PEP 420: 暗黙的な名前空間パッケージ¶
__init__.py
マーカーファイルを必要としないパッケージディレクトリと、複数のモジュールパスをネイティブでサポートします(PEP 420 に記載された様々なサードパーティでの名前空間のアプローチに影響されています)
参考
- PEP 420 - Implicit Namespace Packages
- PEP written by Eric V. Smith; implementation by Eric V. Smith and Barry Warsaw
PEP 3118: 新たなメモリビューの実装とバッファプロトコルのドキュメント¶
PEP 3118 の実装が大幅に改善されました。
新しい memoryview 実装が、Py_buffer 構造体内にフィールドを動的にアロケートする際に多数のクラッシュの報告をもたらしていた全ての所有権問題、ライフタイム問題を包括的に解決しました。加えて、不連続もしくは多次元の入力に対してクラッシュしたり誤った結果を返していた多数の関数が修正されました。
memoryview オブジェクトに、 PEP-3118 準拠の getbufferproc() が追加されています (訳注: バッファオブジェクト構造体 (buffer object structure) 参照)。これはコンシューマの要求型をチェックします。多くの新機能が追加されており、これらのほとんどが不連続配列とサブオフセットを持つ配列に完全な一般化をもたらすものです。
ドキュメント が更新され、エキスポータ(提供側)とコンシューマ(利用側)両方についての責務をより明確に詳細化しています。 バッファ要求のフラグ が、基本フラグと組合せフラグでグループ分けされています。不連続配列と多次元の NumPy スタイル行列のメモリレイアウトについて説明されています。
特徴¶
struct モジュールの構文の全ての native フォーマット文字 をサポートするようになりました (‘@’ プレフィクスが付いていても良いです)。 (訳注:
format
参照。)いくつかの制限はありますが、
cast()
メソッドでフォーマット変更と C-contiguous 配列の形状 (shape) の変更を行うことが出来ます。任意の配列型で多次元のリスト表現がサポートされるようになっています。
任意の配列型で多次元の比較がサポートされるようになっています。
‘B’, ‘b’, ‘c’ いずれかのフォーマットの hashable な (読み込み専用の) 型の1次元メモリビューもまた、 hashable です。 (Contributed by Antoine Pitrou in bpo-13411.)
1 次元配列型での任意のスライスがサポートされています。たとえば負の step を与えて memoryview を逆順に並べ替えることが O(1) オーダで出来るようになりました。
API の変更¶
最大
次元
は公式に 64 に制限されています。空の
shape
, 空のstrides
, 空のsuboffsets
を表現するのに以前はNone
を用いていましたが今ではこれは空のタプルです。フォーマット ‘B’ (unsigned bytes) での memoryview 要素へのアクセスは整数を返すようになりました (struct モジュールでの構文に従っています)。bytes オブジェクトが欲しければまずビューを ‘c’ で
cast()
しなければなりません。memoryview どうしの比較は被演算対象の論理構造を使って行うようになり、また、全ての配列要素は値で比較されます。struct モジュールの構文の全てのフォーマット文字でサポートされます。認識出来ないフォーマット文字でのビューは今でも許されていますが、ビューの指す中身によらずこれは常に等しくないとされます。
ほかの変更については、 ビルドならびに C API の変更 と C コードの移植 を参照してください。
(Contributed by Stefan Krah in bpo-10181.)
参考
PEP 3118 - Revising the Buffer Protocol
PEP 393: 文字列の柔軟な表現¶
Unicode 文字列型が、複数の内部表現 (1、2 または 4 バイトで表現される Unicode 序数(ordinal) の最大値依存) を、表現される文字列内でサポートするように変更されました (訳注: 以前までは Python のビルド時に固定で決めていました)。このことは全てのシステムにおいて、一般のケースでは空間効率の良い表現をしながらも UCS-4 へのフルアクセスを与えます。既存の API との互換性のために複数の表現が並行で存在することになりますが、徐々にこの互換性はなくされていくはずです。
Python 側にはこの変更による不都合は何もないはずです。
C API 側では PEP 393 は完全に後方互換です。レガシーな API は最低 5 年は残されるはずです。レガシー API を使うアプリケーションはメモリ削減の効能が完全には得られないか、あるいは最悪の場合には少し余計なメモリを使うかもしれません。これは Python がそれぞれの文字列の二つのバージョン (レガシーなフォーマットと新しい効率的な格納方法) を維持する必要があるかもしれないからです
機能性¶
PEP 393 でなされた変更は以下の通りです:
Python は今や非 BMP 面の文字を含む Unicode コードポイントの完全な範囲 (つまり
U+0000
からU+10FFFF
まで) を常にサポートします。narrow ビルド / wide ビルドという区別は今では存在していないため、Python は今ではいつでもかつての wide ビルドのように振る舞い、Windows でもこれは例外ではありません。narrow ビルドとの決別は、それに付き物だった問題も解決しました。例えば:
len()
は今では非 BMP 面文字について必ず 1 を返します。つまりlen('\U0010FFFF') == 1
です;サロゲートペアが文字列リテラル内で再結合されることはありません。つまり
'\uDBFF\uDFFF' != '\U0010FFFF'
です;非 BMP 面文字を指すインデクスやスライスは期待通りの値を返します。つまり
'\U0010FFFF'[0]
は今では'\uDBFF'
ではなく'\U0010FFFF'
を返します;ほかの全ての標準ライブラリ関数が今では正しく非 BMP コードポイントを処理します。
sys.maxunicode
の値は今やいつでも1114111
(十六進で0x10FFFF
) です。後方互換性のために C API のPyUnicode_GetMax()
関数は今でも0xFFFF
か0x10FFFF
のどちらかを返すようになってはいますが、新しい Unicode API とともには使ってはいけません (see bpo-13054)。./configure
スクリプトのフラグ--with-wide-unicode
は削除されました。
性能およびリソース使用量¶
Unicode 文字列の記憶域サイズが文字列内のコードポイント最大値に依存するようになったということです:
純粋な ASCII と Latin1 文字列 (
U+0000-U+00FF
) はコードポイントごとに 1 バイトを占めます;BMP 文字列 (
U+0000-U+FFFF
) はコードポイントごとに 2 バイトを占めます;非 BMP 文字列 (
U+10000-U+10FFFF
) はコードポイントごとに 4 バイトを占めます。
結局のところほとんどのアプリケーションにとってのこれの効能は、文字列記憶のためのメモリ使用量が激減することで、これは以前の wide unicode ビルドと比較して顕著です。これは多くの場合、インターナショナルな文脈であってもなお純粋な ASCII が使われるであろうことに関係があります。(というのも多くの文字列が人間向けでない言語として格納されるからです。例えば XML フラグメンツや HTTP ヘッダ、JSON エンコードされたデータ、などなど。)同じ理由から、大きなアプリケーションで CPU キャッシュ活用効率を高めるであろうことも期待出来ます。Python 3.3 のメモリ使用は Python 3.2 の 2 倍から 3 倍小さく、また、Python 2.7 よりも少し良いことが Django ベンチマークでわかっています (詳細は PEP をみてください)。
参考
- PEP 393 - 文字列の柔軟な表現 (Flexible String Representation)
- PEP written by Martin von Löwis; implementation by Torsten Becker and Martin von Löwis.
PEP 397: Windows の Python ランチャ¶
Python 3.3 の Windows インストーラが、ランチャアプリケーションの py
をインストールするようになりました。これは Python をバージョンに依存しない方法で起動するのに使われます。
ランチャは *.py
ファイルをダブルクリックすると暗黙のうちに呼び出されます。システムにインストールされているのが単一の Python バージョンであれば、そのバージョンがファイルの実行に使われます。複数バージョンがインストールされていればデフォルトでは最新バージョンが使われますが、Python スクリプト内で Unix スタイルの「shebang 行 ( #!
)」を含めることでオーバライド出来ます。
ランチャは明示的にコマンドラインから py
アプリケーションとして使うことも出来ます。 py
の実行は暗黙にスクリプトを起動するバージョン選択のルールに従いますが、与えるコマンドライン引数により狙ったバージョンを選択出来ます (たとえば -3
は Python 2 もインストールされている際に Python 3 を要求し、 -2.6
はもっと新しいバージョンがインストールされている場合に特定の古いバージョンを要求します)。
ランチャに加え、Windows インストーラには新しくインストールする Python をシステムの PATH に追加するオプションが含まれるようになりました。 (Contributed by Brian Curtin in bpo-3561.)
参考
- PEP 397 - Python Launcher for Windows
- PEP written by Mark Hammond and Martin v. Löwis; implementation by Vinay Sajip.
ランチャのドキュメント: Windows の Python ランチャ
インストーラ PATH の調整: Python 実行ファイルを見つける
PEP 3151: OS および IO 例外階層の手直し¶
OS エラーが送出する例外の階層が単純化され、粒度が下げられました。
OSError
、IOError
、EnvironmentError
、WindowsError
、mmap.error
、socket.error
、そして select.error
の中から適切な例外の型を選ぶのに心配する必要はもうありません。
上記の例外の型は全てたった1つ OSError
になりました。
OSError
以外の名前は互換性のためにエイリアスとして残されています。
また、特定のエラー条件を捕捉するのが容易になりました。
errno
属性 (または args[0]
) の特定の定数を errno
モジュールから調べる代わりに、適切な OSError
派生クラスを捕捉することが出来ます。
利用可能な派生クラスは以下の通りです:
BlockingIOError
ChildProcessError
ConnectionError
FileExistsError
FileNotFoundError
InterruptedError
IsADirectoryError
NotADirectoryError
PermissionError
ProcessLookupError
TimeoutError
ConnectionError
自身には細かな派生クラスがあります:
新たな例外のおかげで errno
の一般的な使い方を避けることが出来ます。
例えば、Python 3.2 向けに書かれた以下のコード:
from errno import ENOENT, EACCES, EPERM
try:
with open("document.txt") as f:
content = f.read()
except IOError as err:
if err.errno == ENOENT:
print("document.txt file is missing")
elif err.errno in (EACCES, EPERM):
print("You are not allowed to read document.txt")
else:
raise
は errno
をインポートしたり手動で例外属性を調べたりせずに書くことが出来ます:
try:
with open("document.txt") as f:
content = f.read()
except FileNotFoundError:
print("document.txt file is missing")
except PermissionError:
print("You are not allowed to read document.txt")
参考
- PEP 3151 - Reworking the OS and IO Exception Hierarchy
- PEP written and implemented by Antoine Pitrou
PEP 380: サブジェネレータへの委譲構文¶
PEP 380 は yield from
式を追加します。これは ジェネレータ に、その操作の一部をほかのジェネレータに委譲するための式です。これによって yield
を含んでいるコードのセクションをほかのジェネレータに移動出来るでしょう。加えてサブジェネレータは値を伴って戻ることが出来、その戻り値は委譲した側のジェネレータで使えます。
yield from
式がデザインされた主たる動機はサブジェネレータへの委譲として使うことではありますが、実際には任意のサブイテレータに委譲することも出来ます。
単純なイテレータに対して、 yield from iterable
は本質的には for item in iterable: yield item
への単なる速記法です:
>>> def g(x):
... yield from range(x, 0, -1)
... yield from range(x)
...
>>> list(g(5))
[5, 4, 3, 2, 1, 0, 1, 2, 3, 4]
ですが普通のループとは違って yield from
ではサブジェネレータは、呼び出し側スコープから send()
されたり throw()
された値を直接受け取ることができ、また、外側のジェネレータに最終的な値を返せます:
>>> def accumulate():
... tally = 0
... while 1:
... next = yield
... if next is None:
... return tally
... tally += next
...
>>> def gather_tallies(tallies):
... while 1:
... tally = yield from accumulate()
... tallies.append(tally)
...
>>> tallies = []
>>> acc = gather_tallies(tallies)
>>> next(acc) # Ensure the accumulator is ready to accept values
>>> for i in range(4):
... acc.send(i)
...
>>> acc.send(None) # Finish the first tally
>>> for i in range(5):
... acc.send(i)
...
>>> acc.send(None) # Finish the second tally
>>> tallies
[6, 10]
この変更を推し進める一番本質にあったものは、たとえ send
メソッドや throw
メソッドとともに使われることを前提に設計されたジェネレータであっても、大きな関数を複数のサブ関数に分割するのと同じくらいに、ジェネレータを簡単に複数のサブジェネレータに分割出来るようにすることでした。
参考
- PEP 380 - サブジェネレータへの委譲構文
- PEP written by Greg Ewing; implementation by Greg Ewing, integrated into 3.3 by Renaud Blanch, Ryan Kelly and Nick Coghlan; documentation by Zbigniew Jędrzejewski-Szmek and Nick Coghlan
PEP 409: 例外コンテクストの抑制¶
PEP 409 は、チェインされた例外コンテキストの表示を無効にするための新構文を導入します。これを使えば例外翻訳して投げ直すようなアプリケーションで、エラーメッセージをわかりやすくすることが出来ます:
>>> class D:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr) from None
...
>>> D({}).x
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: x
元となる要因例外を抑制する from None
を後置しなければ、もとの例外はデフォルトで表示されます:
>>> class C:
... def __init__(self, extra):
... self._extra_attributes = extra
... def __getattr__(self, attr):
... try:
... return self._extra_attributes[attr]
... except KeyError:
... raise AttributeError(attr)
...
>>> C({}).x
Traceback (most recent call last):
File "<stdin>", line 6, in __getattr__
KeyError: 'x'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __getattr__
AttributeError: x
抑制することでデバッグ能力が失われるというわけではなくて、元々の例外コンテキストは利用可能なままです。(例えば介在するライブラリが有益な背後の詳細を不適切に隠してしまっているなど、必要な場合はあるでしょう。)
>>> try:
... D({}).x
... except AttributeError as exc:
... print(repr(exc.__context__))
...
KeyError('x',)
参考
- PEP 409 - 例外コンテクストの抑制
- PEP written by Ethan Furman; implemented by Ethan Furman and Nick Coghlan.
PEP 414: 明示的なユニコードリテラル¶
Unicode を意識する Python アプリケーションが Python 2 で Unicode リテラルを多用しているとしても Python 3 への移行を容易にするために、Python 3.3 では文字列リテラルへの “u
” 前置を再びサポートすることにしました。この前置は Python 3 自身では何らの意味も持ちはせず、Python 3 への移行において純粋な機械的変更を要する事項を単に減らすためだけのために提供されます。開発者はもっと重要な意味的変更 (たとえばバイナリとテキストの厳密な区別) に集中すべきなのです。
参考
- PEP 414 - 明示的なユニコードリテラル
- PEP written by Armin Ronacher.
PEP 3155: クラスと関数の正規名¶
関数オブジェクトとクラスオブジェクトは新たに __qualname__
属性を持つようになりました。これはモジュールのトップレベルからその定義までの「道のり (path)」を表現するものです。グローバルな関数とクラスについてはこれは __name__
と同じです。ほかの場合にはこれは、実際に定義されている場所についてや、グローバルスコープから如何にしてアクセス可能かについて、もっと良い情報を与えてくれます。
(束縛されていない) メソッドでの例:
>>> class C:
... def meth(self):
... pass
>>> C.meth.__name__
'meth'
>>> C.meth.__qualname__
'C.meth'
入れ子のクラスでの例:
>>> class C:
... class D:
... def meth(self):
... pass
...
>>> C.D.__name__
'D'
>>> C.D.__qualname__
'C.D'
>>> C.D.meth.__name__
'meth'
>>> C.D.meth.__qualname__
'C.D.meth'
入れ子の関数の例:
>>> def outer():
... def inner():
... pass
... return inner
...
>>> outer().__name__
'inner'
>>> outer().__qualname__
'outer.<locals>.inner'
それらオブジェクトの文字列表現も、この新しくてより正確な情報を含むように変更されています:
>>> str(C.D)
"<class '__main__.C.D'>"
>>> str(C.D.meth)
'<function C.D.meth at 0x7f46b9fe31e0>'
参考
- PEP 3155 - クラスと関数の正規名 (qualified name)
- PEP written and implemented by Antoine Pitrou.
PEP 412: キー共有辞書¶
オブジェクト属性を記憶するのに使われる辞書が、内部記憶域の一部 (キーとそれに対応するハッシュ値) を互いに共有出来るようになりました。これにより、組み込みでない型のインスタンスをたくさん作るプログラムのメモリ消費が少なくなります。
参考
- PEP 412 - キー共有辞書
- PEP written and implemented by Mark Shannon.
PEP 362: 関数シグニチャオブジェクト¶
新たに追加された関数 inspect.signature()
は、Python 呼び出し可能オブジェクト (callable) を調べることを簡単で直接的なものにしてくれます。幅広い callable をサポートしています:デコレートされているかどうかによらず関数、クラス、 functools.partial()
オブジェクト。新たに追加されたクラス群 inspect.Signature
, inspect.Parameter
, inspect.BoundArguments
は、アノテーション、デフォルト値、パラメータの種類、束縛されている引数などのような呼び出しシグニチャについての情報を保持し、これによって、デコレータを書いたりあるいは呼び出しシグニチャや引数を検証したり改訂したりするコードを書くことが、非常に単純になります。
参考
- PEP 362: - 関数シグニチャオブジェクト
- PEP written by Brett Cannon, Yury Selivanov, Larry Hastings, Jiwon Seo; implemented by Yury Selivanov.
PEP 421: sys.implementation の追加¶
sys
モジュールに新規属性が追加され、これは現在動作中のインタプリタ実装に固有の詳細を公開します。その sys.implementation
属性の手始めの集合として、 name
, version
, hexversion
, cache_tag
が定義されています。
sys.implementation
の真意は、標準ライブラリによって利用される実装固有の情報を一つの名前空間で一元管理することにあります。このことにより異なる Python 実装が単一の標準ライブラリのコードベースを共有することが、もっとずっと簡単になります。今時点での初期状態では sys.implementation
は実装固有データのごく一部を保持しているだけです。標準ライブラリの移植性がもっと高くなるように、徐々にこの比率が変わっていくでしょう。
標準ライブラリの移植性を改善した一例が cache_tag
です。Python 3.3 以降は sys.implementation.cache_tag
が PEP 3147 をサポートするために importlib
により使われます。組み込みのインポートシステムのために importlib
を使う全ての Python 実装が、モジュールのキャッシュの振る舞いを制御するのに cache_tag
を利用できます。
SimpleNamespace¶
sys.implementation
の実現に伴って Python に新たな型 types.SimpleNamespace
が導入されることとなりました。 dict
のようなマッピングベースの名前空間とは対照的に、 SimpleNamespace
は object
のような属性ベースです。ですが object
とは違って SimpleNamespace
インスタンスは書き込み可能です。つまり普通の属性アクセスを通じて名前空間に追加したり削除したり修正したりできます。
参考
- PEP 421 - sys.implementation の追加
- PEP written and implemented by Eric Snow.
インポート実装としての importlib の使用¶
bpo-2377 [Replace __import__ w/ importlib.__import__ (__import__ を importlib.__import__ で置き換える)]、 bpo-13959 [Re-implement parts of imp
in pure Python (imp
の一部をピュア Python で再実装する)]、 bpo-14605 [Make import machinery explicit (インポート機構を明示的なものにする)]、 bpo-14646 [Require loaders set __loader__ and __package__ (ローダーが __loader__ と __package__ をセットするのを必須とする)]。
__import__()
関数を importlib.__import__()
によって実現するようにしました。これは PEP 302 の「第二段階」を完了させるものです。この変更には複数の恩恵があります。まず最初にこれはインポートの機構を、C コードの奥深くで暗黙に秘密裏に行うのではなく、より透明化します。このことで、Python 3.3 をサポートする全ての Python VM で単一の実装を用いることが出来るようになり、インポートのセマンティクスにおける VM 固有の逸脱と決別する助けともなります。そしてこれはインポート機構の保守をより容易とし、将来起こりうる進化を促します。
一般のユーザにとっては、セマンティクスにおいて目に見える変化はないはずです。今時点でインポートを操作したりインポート呼び出しをプログラム的に行っている場合は、このドキュメントの Python コードの移植 でカバーしているコードの修正が必要になるかもしれません。
新たな API¶
この変更による一番大きな恩恵の一つは、インポート文の動作に何が介在するのかについて露になったことです。つまりかつては様々なインポータが暗黙で行っていたことが、今では完全に importlib
パッケージの一部として公開されています。
importlib.abc
で定義される抽象基底クラスは meta path finder と path entry finder の差異を正確に表現するように拡張されて、それぞれ順に importlib.abc.MetaPathFinder
と importlib.abc.PathEntryFinder
が導入されました。古い ABC である importlib.abc.Finder
は後方互換性のためだけに残されますが、何かのメソッドの必要性を強制したりはしません。
ファインダ (finder) の側面からは、 importlib.machinery.FileFinder
がモジュールのソースファイルおよびバイトコードファイルの検索に使われる機構を公開しています。以前はこのクラスは sys.path_hooks
の暗黙のメンバでした。
ローダ (loader) については、新規の抽象基底クラス importlib.abc.FileLoader
が、モジュールのコードを格納する機構としてのファイルシステムを使うローダを書く助けとなります。ソースファイルのローダ (importlib.machinery.SourceFileLoader
)、ソースを持たないバイトコードのためのローダ (importlib.machinery.SourcelessFileLoader
)、そして拡張モジュールのためのローダ (importlib.machinery.ExtensionFileLoader
) が今では直接的に利用出来ます。
ImportError
には属性 name
と path
が追加されて、これには提供すべき関連データがある場合にセットされます。インポート失敗時のメッセージも、これまでのようにモジュール名の末尾だけを与えるのではなく、モジュールの完全名を提供するようになりました。
importlib.invalidate_caches()
関数が sys.path_importer_cache
内にキャッシュされている全てのファインダの同名メソッドを呼び出すようになりました。これにより必要に応じて記憶されている状態をクリーンアップ出来ます。
目に見える変化¶
潜在的に必要となるかもしれないコード修正については、 Python コードの移植 セクションを参照してください。
importlib
によって公開されるものが拡がったことによる、インポートについてのほかの目に見える変化があります。最大の変化は sys.meta_path
と sys.path_hooks
が、インポートで使われる meta path finder と path entry hook の全てを格納するようになったことです。以前はファインダは直接的に公開されるのではなく、インポートの C コード内に暗黙のものとして隠されていました。このことによって、今では望めば要件に合うようファインダを取り除いたり順序を変えたりといったことが簡単に行えるようになっています。
もう一つの変化は、モジュール生成時に使われたローダを格納する __loader__
属性を、全てのモジュールが持つようになったことです。 PEP 302 はローダの実装においてこの属性をセットすることを必須とするよう更新されました。ですので今後サードパーティのローダが更新されれば、この属性の存在に依存出来るようになります。ですがそのときが来るまでは、インポート処理がモジュールのロードの後処理としてセットします。
さらにローダが PEP 366 よりの __package__
属性を設定することも期待出来るようになりました。繰り返しになりますがインポート処理自身が既にこれを全てのローダで importlib
より行っていて、また、インポート処理自身がこの属性をロードの後処理としてセットしています。
sys.path_hooks
にファインダが見つからない場合に、 sys.path_importer_cache
に None
が挿入されるようになりました。 imp.NullImporter
は sys.path_hooks
に直接的に公開されないため、これはファインダが見つからないことの表現値としては当てにならないものになりました。
全てのほかの変更は、Python 3.3 へのコードの更新の際に考慮すべきセマンティクスの変更に関係しています。ですのでそららについて、このドキュメントの Python コードの移植 セクションを読むべきです。
(Implementation by Brett Cannon)
その他の言語の変更¶
Python 言語コアに小さな変更がいくつか行われました:
Unicode name aliases と named sequences のサポートが追加されました。
unicodedata.lookup()
と'\N{...}'
の両方が name aliases の解決を行い、unicodedata.lookup()
は named sequences の解決も行います。(Contributed by Ezio Melotti in bpo-12753.)
Unicode データベースを UCD バージョン 6.1.0 にアップグレードしました。
range()
オブジェクトどうしの等値性比較が、それぞれの range オブジェクトによって生成されるシーケンスの等値性を反映して行われるようになりました (bpo-13201)。bytes
とbytearray
オブジェクトのメソッドcount()
,find()
,rfind()
,index()
,rindex()
が、第一引数に 0 から 255 の整数を受け付けるようになりました。(Contributed by Petri Lehtinen in bpo-12170.)
bytes
とbytearray
オブジェクトのメソッドrjust()
,ljust()
,center()
が、fill
引数としてbytearray
を受け付けるようになりました (Contributed by Petri Lehtinen in bpo-12380.)。list
とbytearray
に新規メソッドcopy()
,clear()
が追加されました (bpo-10516)。これに伴いMutableSequence
にもclear()
メソッドが追加されました (bpo-11388)。raw bytes リテラルとして
br"..."
だけでなくrb"..."
とも書けるようになりました。(Contributed by Antoine Pitrou in bpo-13748.)
dict.setdefault()
が与えられたキーのルックアップを一度しか行わないようになったので、組み込み型でのこれの使用はアトミックになります。(訳注: 外部観察可能な変化で説明すると、以前はこの呼び出しが、キーの2回の __hash__、__eq__ 呼び出しを引き起こしていたものが、1回になった。)(Contributed by Filip Gruszczyński in bpo-13521.)
関数呼び出しが関数シグニチャに合致しない場合のエラーメッセージがかなり改善されました。
(Contributed by Benjamin Peterson.)
細粒度のインポートロック¶
以前のバージョンの CPython では、常に大域的なインポートロックを当てにしていました。このことは意図せず頭痛の種を持ち込むこと繋がっていました。たとえば、モジュールをインポートすることで副作用として異なるスレッドでのコード実行を引き起こす際に起こる、デッドロックといったことです。不恰好な回避策がときどき採用されてきました。C API 関数 PyImport_ImportModuleNoBlock()
などです。
Python 3.3 ではモジュールのインポートでは、モジュール単位でのロックを採用しています。このことによって複数スレッドからの指定モジュールのインポートは (モジュールが不完全な初期化のまま曝されるのを防いで) 正しく直列化されて、前述の頭痛の種は取り除かれています。
(Contributed by Antoine Pitrou in bpo-9260.)
組み込みの関数と型¶
open()
に新規パラメータ opener が追加されました。背後のファイルオブジェクトのファイル記述子は opener を (file, flags) で呼び出して得られます。これは例えばos.O_CLOEXEC
のようなカスタムなフラグを用いるのに使えます。 /'x'
モードが追加されました。排他的作成として開きます。ファイルが既存の場合は失敗します。print()
: flush キーワード引数が追加されました。flush キーワード引数が真の場合ストリームは強制的にフラッシュされます。hash()
: ハッシュのランダム化がデフォルトで有効になりました。object.__hash__()
と環境変数PYTHONHASHSEED
を参照してください。str
型にcasefold()
メソッドが追加されました。文字列の casefold されたコピーを返します。casefold された文字列は、大文字小文字に関係ないマッチに使えます。例えば'ß'.casefold()
は'ss'
を返します。シーケンスについてのドキュメントを大幅に書き換えました。バイナリのシーケンスとテキストのシーケンスについての区別についてより良い説明を加え、また、個々の組み込みシーケンスに関して個別のドキュメントを提供しています (bpo-4966)。
新たなモジュール¶
faulthandler¶
この新規モジュール faulthandler
には、異常 (セグメンテーション違反のようなクラッシュ) 時、タイムアウト時、ユーザシグナルの発生時などのタイミングで Python traceback を明示的にダンプするための関数が含まれています。シグナル SIGSEGV
, SIGFPE
, SIGABRT
, SIGBUS
, SIGILL
に対するフォールトハンドラをインストールするには、 faulthandler.enable()
を呼び出してください。インタプリタ開始時点でも有効に出来ます。それには環境変数 PYTHONFAULTHANDLER
をセットするか、コマンドラインオプション -X
faulthandler
を与えます。
Linuxでのセグメンテーションフォールト時の例:
$ python -q -X faulthandler
>>> import ctypes
>>> ctypes.string_at(0)
Fatal Python error: Segmentation fault
Current thread 0x00007fb899f39700:
File "/home/python/cpython/Lib/ctypes/__init__.py", line 486 in string_at
File "<stdin>", line 1 in <module>
Segmentation fault
改良されたモジュール¶
abc¶
抽象メソッドで構成されるデスクリプタを含む抽象基底クラスのサポートが改善されています。抽象デスクリプタを宣言するために推奨されるアプローチは今後は、動的に更新されるプロパティとして __isabstractmethod__
を提供することです。この結果として、組み込みのデスクリプタが更新されました。
abc.abstractproperty
は非推奨となりました。代わりにabc.abstractmethod()
にproperty
を渡して使ってください。
abc.abstractclassmethod
は非推奨となりました。代わりにabc.abstractmethod()
にclassmethod
を渡して使ってください。
abc.abstractstaticmethod
は非推奨となりました。代わりにabc.abstractmethod()
にstaticmethod
を渡して使ってください。
(Contributed by Darren Dale in bpo-11610.)
abc.ABCMeta.register()
が登録されたサブクラスを返すようになりました。つまりクラスデコレータとして使うことができるようになったということです (bpo-10868)。
array¶
array
モジュールに型コード q
と Q
による 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.BZ2File
とbz2.decompress()
が (pbzip2 ツールで生成されたような) マルチストリームの入力を展開出来るようになりました。同時にbz2.BZ2File
は、'a'
(追記) モードを使ってこのタイプの圧縮ファイルを作るのに使えるようになりました。(Contributed by Nir Aides in bpo-1625.)
bz2.BZ2File
が、io.BufferedIOBase
API で規定されているメソッドや属性のうち、detach()
とtruncate()
を除くすべてを実装するようになりました。
codecs¶
mbcs
コーデックが、全ての Windows バージョンでエラーハンドラ replace
と ignore
を正しく処理するように書き換えられました。 mbcs
コーデックは以前は、エンコードでは replace
のみ、デコードでは ignore
のみでしたが、これにより全てのエラーハンドラがサポートされます。
新たに Windows のみ用のコーデック cp65001
が追加されました (bpo-13216)。これは Windows コードページ 65001 (Windows UTF-8, CP_UTF8
) です。例えばこれはコンソール出力のコードページが (例えば chcp 65001
コマンドを使って) cp65001 にセットされている場合に sys.stdout
で使われます。
マルチバイト CJK デコーダの再同期が高速になりました。これは不正なバイトシーケンスが最初のバイトであれば無視するだけです。例えば b'\xff\n'.decode('gb2312', 'replace')
は文字置き換えののちに \n
を返すようになっています。
漸増的 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.'
となっていました。
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__
メソッドで獲得したのかとは無関係に正しく動作するように設計されました。
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_THREADS
がFalse
にセットされます。
API の変更¶
C モジュールはマシンアーキテクチャに依存する以下のコンテキストの制限を持ちます:
32-bit 64-bit MAX_PREC
425000000
999999999999999999
MAX_EMAX
425000000
999999999999999999
MIN_EMIN
-425000000
-999999999999999999
コンテキストの雛形 (
DefaultContext
,BasicContext
,ExtendedContext
) ではEmax
とEmin
の絶対値が999999
に変更されました。decimal.py の
Decimal
コンストラクタは上記のコンテキスト制限に無知で、任意の指数や精度で正確に変換しようとします。C 版は内部の制限を持っていますので、次の規則が使われます: 可能ならば値は正確に変換され、そうでない場合InvalidOperation
が送出されて結果が NaN となります。後者のケースは丸めあるいは不正確な値を得るためにcreate_decimal()
を使うことでいつでも可能です。(—訳注: わかりにくい表現ですがコンテキストで InvalidOperation をトラップしていれば結果が NaN で受け取れて(そうでなければ InvalidOperation が投げられて)、その制御は create_decimal で明示的に行える、ということを言っています。—)decimal.py の
power()
関数は「always correctly-rounded (必ず適切に丸められる)」です。C 版ではこれの意味は関数exp()
とln()
に関してであり、最終的な結果においては「almost always correctly rounded (ほとんど必ず適切に丸められる)」となるだけです。C 版ではシグナルを含む辞書は
MutableMapping
です。速度的な理由によりflags
とtraps
はコンテキストが初期化された時点でのMutableMapping
を参照し続けます。新たなシグナル辞書をflags
にtraps
割り当てれば新しい値で更新はされるものの、コンテキストはそれら右辺の辞書を参照しません。Context
を pickle 化するとこれまでとは異なる出力をします。これは Python 版と C 版で共通の交換フォーマットを実現するためです。quantize()
メソッドのwatchexp
パラメータが非推奨となりました。
email¶
ポリシーフレームワーク¶
email パッケージに policy
フレームワークが追加されました。 Policy
は、 email パッケージがどのように振舞うのかを制御するための多数のメソッドとプロパティを持つオブジェクトです。Python 3.3 のための最初のポリシーは Compat32
で、これは Python 3.2 の email パッケージとの後方互換性を提供します。 policy
は、 parser
によって email メッセージが解析される際、あるいは Message
オブジェクトを生成する際、あるいは generator
を用いて email がシリアライズする際に指定出来ます。オーバライドしない限りは、 parser
に渡されたポリシーは全ての Message
オブジェクトと parser
が生成したサブオブジェクトに引き継がれます。デフォルトでは generator
は、シリアライズしようとする Message
オブジェクトのポリシーを使います。デフォルトのポリシーは compat32
です。
すべての policy
オブジェクトで実装される制御の最小限のセットは以下です:
max_line_length
Message
がシリアライズされる際に各行が持ちうる、linesep 文字(列)を含まない最大の行幅です。デフォルトでは 78 です。linesep
Message
がシリアライズされる際に各行を分割するのに使われる文字です。デフォルトは\n
です。cte_type
7bit
または8bit
。8bit
はBytes
generator
に対してのみ適用され、プロトコルが許す場所 (あるいはオリジナルの入力に含まれる場所) には非 ASCII が使われうることを示します。raise_on_defect
parser
が異常を検出した場合に、Message
オブジェクトのdefects
リストに追加するのではなく例外を送出するようにします。
新たな設定値を持つ新しいポリシーインスタンスは、ポリシーオブジェクトの clone()
メソッドを使って作られます。 clone
は任意の上記制御値をキーワード引数として受け取ります。この呼び出しで指定されない制御はデフォルトのまま残されます。ですので linesep 文字列として \r\n
を使うポリシーをこのようにして作れます:
mypolicy = compat32.clone(linesep='\r\n')
ポリシーは、あなたのアプリケーションが必要とするフォーマットでメッセージを生成するのを簡単にしてくれます。 generator
を呼び出す全ての場所で linesep='\r\n'
を指定するのを忘れないようにする代わりに、あなたのプログラムが Message
オブジェクトを作成するために使う parser
あるいは Message
がポリシーを要求する一箇所だけで指定すれば良いのです。もちろん一方ではメッセージを複数の形式で生成する必要があれば、 generator
呼び出しのたびにパラメータで指定する必要があります。もしくは、あなた固有のケースのためにカスタムなポリシーを作って、 generator
作成の際にそれを渡すことも出来ます。
新規ヘッダ API を伴った暫定ポリシー¶
ポリシーフレームワーク単品でもまったくもって価値があるものではありますが、その導入の主たる動機は、それを使わないコードに対しての後方互換を壊さないやり方で、email パッケージに新機能を実現する新しいポリシーを作れるようにすることでした。その新しいポリシーは新規 API を導入するものなので、私たちはそれらを Python 3.3 での 暫定ポリシー としてリリースしました。コアデベロッパが必要と判断すれば、後方互換性を破壊する (コードの破棄さえも含む) 変更が起こりえます。
その新規ポリシーは EmailPolicy
のインスタンス (訳注: email.policy.default
や email.policy.SMTP
など) です。これには以下の制御が追加されています:
header_factory
が、この新規ポリシーにより提供される新機能の要です。この新規ポリシーの一つが使われると、 Message
オブジェクトから抽出されたすべてのヘッダは header_factory
で生成されるオブジェクトであり、また、 Message
にヘッダをセットする場合のいつでも、それは header_factory
で生成されるオブジェクトになります。すべてのその種のヘッダオブジェクトは、ヘッダ名と同名の name
属性を持ちます。アドレスヘッダと日付ヘッダは、ヘッダの解析済み日付にアクセス出来るよう、追加の属性群を持ちます。以下のように使えます:
>>> m = Message(policy=SMTP)
>>> m['To'] = 'Éric <foo@example.com>'
>>> m['to']
'Éric <foo@example.com>'
>>> m['to'].addresses
(Address(display_name='Éric', username='foo', domain='example.com'),)
>>> m['to'].addresses[0].username
'foo'
>>> m['to'].addresses[0].display_name
'Éric'
>>> m['Date'] = email.utils.localtime()
>>> m['Date'].datetime
datetime.datetime(2012, 5, 25, 21, 39, 24, 465484, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000), 'EDT'))
>>> m['Date']
'Fri, 25 May 2012 21:44:27 -0400'
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
Unicode の display name が、メッセージがシリアライズされる際に自動的に utf-8
(訳注: 実行例の場合は「の MIME ヘッダエンコード」) でエンコードされ、ヘッダに直接アクセスすると Unicode で返ることに気付くと思います。つまり email.header
の decode_header()
関数や make_header()
関数を取り扱う必要性を取り除いてくれています。
アドレスを部品から組み立てることも出来ます:
>>> m['cc'] = [Group('pals', [Address('Bob', 'bob', 'example.com'),
... Address('Sally', 'sally', 'example.com')]),
... Address('Bonzo', addr_spec='bonz@laugh.com')]
>>> print(m)
To: =?utf-8?q?=C3=89ric?= <foo@example.com>
Date: Fri, 25 May 2012 21:44:27 -0400
cc: pals: Bob <bob@example.com>, Sally <sally@example.com>;, Bonzo <bonz@laugh.com>
Unicode へデコードするのは自動で行われます:
>>> m2 = message_from_string(str(m))
>>> m2['to']
'Éric <foo@example.com>'
メッセージ解析の際、グループと個々のアドレスにアクセスするのにヘッダオブジェクトの addresses
属性と groups
属性を使えます:
>>> m2['cc'].addresses
(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com'), Address(display_name='Bonzo', username='bonz', domain='laugh.com'))
>>> m2['cc'].groups
(Group(display_name='pals', addresses=(Address(display_name='Bob', username='bob', domain='example.com'), Address(display_name='Sally', username='sally', domain='example.com')), Group(display_name=None, addresses=(Address(display_name='Bonzo', username='bonz', domain='laugh.com'),))
要するに新規ポリシーのどれか一つを使うことは、ヘッダ操作をこのようなものにしてくれるということです: あなたのアプリケーションは Unicode 文字列でお仕事をし、email パッケージは Unicode のエンコード/デコードを透過的に行って RFC 標準 Content Transfer Encoding との相互変換をやってのける、と。
その他のAPIの変更¶
BytesHeaderParser
が parser
モジュールに追加されました。これは HeaderParser
を補足するものであり、また、 bytes API を完全にする (訳注: What’s New in Python 3.2 での email の変更内容参照) ものです。
新しいユーティリティ関数:
format_datetime()
:datetime
を与えると email ヘッダで使われる書式でフォーマットした文字列を生成します。
parsedate_to_datetime()
: email ヘッダからの日付文字列を渡すと、 aware な、または naive なdatetime
に変換します。オフセットが-0000
の場合に naive で返します。
localtime()
: 引数なしで呼び出すと、ローカルtimezone
を使った aware なdatetime
として現在ローカル時間を返します。aware なdatetime
を渡して呼び出すと、ローカルtimezone
を使った aware なdatetime
に変換します。
ftplib¶
ftplib.FTP
に新しいキーワード引数source_address
が追加されました。(host, port)
の形で指定し、これは外に向かうソケットを作成する際にbind()
呼び出し内でのソースアドレスとして用いられます。 (Contributed by Giampaolo Rodolà in bpo-8594.)FTP_TLS
クラスに、制御チャネルを平文に戻すためのccc()
関数が追加されました。これは、固定ポートで開くことなく非セキュア FTP で NAT を処理する方法を知っているファイアウォールを利用するのに有用となりえます。(Contributed by Giampaolo Rodolà in bpo-12139.)新規メソッド
ftplib.FTP.mlsd()
は機械で読めるディレクトリリスティングのフォーマットを提供し、ftplib.FTP.nlst()
とftplib.FTP.dir()
に取って代わるものとなりました。(Contributed by Giampaolo Rodolà in bpo-11072.)
functools¶
functools.lru_cache()
デコレータにキーワード引数 typed
を指定出来るようになりました (デフォルトは False
です)。これは異なった型の等値比較のキャッシュ値を別々のキャッシュスロットに置くかどうかを決めます。(Contributed by Raymond Hettinger in bpo-13227.)
hmac¶
タイミング解析によるダイジェストに対する サイドチャンネル攻撃 からの防御のために、 compare_digest()
関数が追加されました。(Contributed by Nick Coghlan and Christian Heimes in bpo-15061.)
http¶
http.server.BaseHTTPRequestHandler
がヘッダをバッファするようになり、 end_headers()
呼び出し時に一度に全てをまとめて書き出すようになりました。新規のメソッド flush_headers()
は、集積したヘッダを送信する場合の管理に直接使うことが出来ます。(Contributed by Andrew Schaaf in bpo-3709.)
http.server
が正当な HTML 4.01 strict
出力を生成するようになりました。 (Contributed by Ezio Melotti in bpo-13295.)
http.client.HTTPResponse
にメソッド readinto()
が追加されました。つまりこのクラスを io.RawIOBase
のように扱えるということです。 (Contributed by John Kuhn in bpo-13464.)
html¶
html.parser.HTMLParser
が壊れたマークアップをエラーなしで解析出来るようになりました。これによりコンストラクタの strict 引数と HTMLParseError
例外が撤廃されました。この壊れたマークアップを解析出来る能力は数多くのバグフィックスからの結果であり、それらは Python 2.7/3.2 の最新バグフィックスリリースでも利用可能です。(Contributed by Ezio Melotti in bpo-15114, and bpo-14538, bpo-13993, bpo-13960, bpo-13358, bpo-1745761, bpo-755670, bpo-13357, bpo-12629, bpo-1200313, bpo-670664, bpo-13273, bpo-12888, bpo-7311.)
html.entities
モジュールに、HTML5 名前付き文字参照と Unicode 文字(列) とを対応付ける html5
辞書が追加されました (例: html5['gt;'] == '>'
)。この辞書は既に HTMLParser
が使っています。 (Contributed by Ezio Melotti in bpo-11113 and bpo-15156.)
imaplib¶
IMAP4_SSL
コンストラクタが SSLContext パラメータを受け取るようになりました。これはセキュアなチャネルのパラメータを制御します。
(Contributed by Sijin Joseph in bpo-8808.)
inspect¶
getclosurevars()
関数が追加されました。この関数は、指定した関数の関数本体から参照されている現在束縛されている全ての名前と、それら名前が解決された場所 (訳注: globals, builtins など) を報告します。これにより、ステートフルなクロージャに依存するコードをテストするのに、正しい内部状態を検証するのが容易になります。
(Contributed by Meador Inge and Nick Coghlan in bpo-13062.)
getgeneratorlocals()
関数が追加されました。この関数は、指定したジェネレータのスタックフレーム内のローカル変数の、現在束縛されているものを報告します。これにより、ジェネレータをテストするのに、正しい内部状態を検証するのが容易になります。
(Contributed by Meador Inge in bpo-15153.)
io¶
open()
関数に排他的作成に使用する新たな 'x'
モードが追加されました。ファイルが既に存在する場合は FileExistsError
を送出します。
C11 fopen() の ‘x’ モードに基づいています。
(Contributed by David Townshend in bpo-12760.)
TextIOWrapper
のコンストラクタにオプショナルな引数 write_through が追加されました。 write_through が True
の場合、write()
の呼び出しはバッファされないことが保証されます。 TextIOWrapper
オブジェクトに書かれた全てのデータは直ちに下層のバイナリ buffer に処理されます。
itertools¶
accumulate()
がユーザ提供二項関数を渡すためのオプショナル引数 func
を受け付けるようになりました。
logging¶
basicConfig()
関数がオプショナルな handlers
引数をサポートするようになりました。これはルートロガーに追加するハンドラ群の イテラブル です。
SysLogHandler
クラスに、クラスレベル属性の append_nul
が追加されました。これは syslog レコードに NUL
(\000
) バイトを追加するかどうかを制御します。これはあるデーモンはこれで終端することが必要な一方でほかはメッセージの一部として NUL を通すという、デーモンによって振る舞いが異なることに対応するためです。
math¶
math
モジュールに新たな関数 log2()
が追加されました。x の 2 を底とする対数を返します。
(Written by Mark Dickinson in bpo-11888.)
mmap¶
read()
メソッドの他のファイルライクなオブジェクトとの互換性が増しました。引数が省略されるか None
の場合に、ファイルの現在位置からマッピングの末尾までのバイト列を返すようになっています。(Contributed by Petri Lehtinen in bpo-12021.)
multiprocessing¶
関数 multiprocessing.connection.wait()
が追加されました。これは複数の (接続やソケット、パイプのような) オブジェクトをタイムアウト付きでポーリングします。(Contributed by Richard Oudkerk in bpo-12328.)
プロセス間で (訳注: Connection.send()
と Connection.recv()
で) multiprocessing.Connection
オブジェクトを相互に転送出来るようになりました。 (Contributed by Richard Oudkerk in bpo-4892.)
multiprocessing.Process
がキーワード引数 daemon
を取るようになりました。これは親プロセスから daemon
フラグを継承するデフォルトの振る舞いをオーバライドします (bpo-6064)。
属性 multiprocessing.Process.sentinel
が追加されました。これを用いることで、ふさわしい OS プリミティブ (例えば POSIX システムでの select
) を使った一括での複数 Process
オブジェクト待ちが可能です。
map()
と itertools.starmap()
との関係と同じ、既存の multiprocessing.pool.Pool.map()
と map_async()
に対応する multiprocessing.pool.Pool.starmap()
と starmap_async()
が追加されました。 (Contributed by Hynek Schlawack in bpo-12708.)
nntplib¶
nntplib.NNTP
クラスがコンテキスト管理プロトコルをサポートするようになりました。with ブロックを抜ける際に無条件に NNTP 接続をクローズします (クローズ処理で発生する socket.error
は無視されます)。:
>>> from nntplib import NNTP
>>> with NNTP('news.gmane.org') as n:
... n.group('gmane.comp.python.committers')
...
('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')
>>>
(Contributed by Giampaolo Rodolà in bpo-9795.)
os¶
os
モジュールにpipe2()
関数が追加されました。これはフラグO_CLOEXEC
とO_NONBLOCK
を (論理和指定で) セットしたパイプをアトミックに作ることが出来ます。これはマルチスレッドプログラムでの競合状態を避けるために特に有用です。os
モジュールにsendfile()
関数が追加されました。これはあるファイル (またはソケット) 記述子からのコピーを、効率的な「ゼロコピー」で行います。「ゼロコピー」という言い回しは、これは二つの記述子間でのデータのコピー全てが完全にカーネルによって行われる、という事実について指しています。データコピーにユーザ空間のバッファは使われません。sendfile()
は例えばファイルのダウンロードのような、ディスク上のファイルとネットワークソケット間での効率的なデータコピーに使うことが出来ます。(Patch submitted by Ross Lagerwall and Giampaolo Rodolà in bpo-10882.)
シンボリックリンク攻撃や一時ファイル、一時ディレクトリにまつわる問題のような競合状態を避けるには、ファイル名の代わりにファイル記述子を操作することがより信頼出来ます (そして高速でもあります)。 Python 3.3 はファイル記述子で動作するよう既存関数の強化と新規関数の追加を行ないました。 (bpo-4761, bpo-10755 and bpo-14626)
os
モジュールの新規関数fwalk()
はwalk()
と似ていますが、これは訪問するディレクトリを指すファイル記述子も yield します。これは特にシンボリックリンクの競合を避けるために有用です。関数
access()
,chflags()
,chmod()
,chown()
,link()
,lstat()
,mkdir()
,mkfifo()
,mknod()
,open()
,readlink()
,remove()
,rename()
,replace()
,rmdir()
,stat()
,symlink()
,unlink()
,utime()
が、新たな 2 つのオプショナルなキーワード引数のどちらか、または両方をサポートするようになりました。 dir_fd (paths relative to directory descriptors) と follow_symlinks (not following symlinks) です。プラットフォームがそれらパラメータをサポートするかどうかはos.supports_dir_fd
とos.supports_follow_symlinks
を調べることでわかります。関数
chdir()
,chmod()
,chown()
,execve()
,listdir()
,pathconf()
,exists()
,stat()
,statvfs()
,utime()
が、パス引数としてファイル記述子をサポートするようになりました。これをプラットフォームがサポートするかどうかはos.supports_fd
を調べることでわかります。
access()
がキーワード引数effective_ids
を受け取るようになりました。これは実 uid/gid の代わりに実効 uid/gid を使ってアクセスチェックを行うように振る舞いを変更します。これをプラットフォームがサポートするかどうかはsupports_effective_ids
を調べることでわかります。os
モジュールに 2 つの関数が追加されました。getpriority()
とsetpriority()
です。これらはプロセスのナイス値/優先度 (niceness/priority) をos.nice()
と似た方法で取得・設定しますが、現在プロセスだけのものだけではなく全てのプロセスに対して使えるよう拡張されています。(Patch submitted by Giampaolo Rodolà in bpo-10784.)
新規関数
os.replace()
は変更先の上書きにおいてクロスプラットフォームな方法でファイル名変更を行えます。既存のos.rename()
では、変更先が既存のファイルの場合に POSIX では上書き、Windows ではエラーとなります。(Contributed by Antoine Pitrou in bpo-8828.)stat 系関数 (
stat()
,fstat()
,lstat()
) がファイルのタイムスタンプのナノ秒精度を読み取れるようになりました。これと対となるutime()
もファイルのタイムスタンプをナノ秒精度で書き出せるようになりました。 (Contributed by Larry Hastings in bpo-14127.)新規関数
os.get_terminal_size()
はファイル記述子が接続しているターミナルウィンドウのサイズを取得します。shutil.get_terminal_size()
も参照して下さい。 (Contributed by Zbigniew Jędrzejewski-Szmek in bpo-13609.)
Linux 拡張属性をサポートするための新たな関数 (bpo-12720):
getxattr()
,listxattr()
,removexattr()
,setxattr()
.スケジューラに対する新たなインターフェイス。これら関数はプロセスに対する OS による CPU 時間割り当てを制御します。新規関数:
sched_get_priority_max()
,sched_get_priority_min()
,sched_getaffinity()
,sched_getparam()
,sched_getscheduler()
,sched_rr_get_interval()
,sched_setaffinity()
,sched_setparam()
,sched_setscheduler()
,sched_yield()
,ファイルシステムを制御する新たな関数:
posix_fadvise()
: データへアクセスする意思を、パターンを指定して宣言します。これによりカーネルが最適化を行えるようになります。posix_fallocate()
: ファイルを割り当てるに十分なディスクスペースを確保します。sync()
: ディスクへの全ての書き込みを強制します。
追加された新たな POSIX 関数:
lockf()
: オープンされたファイル記述子に対して、POSIX ロックの適用、テスト、解除を行います。pread()
: ファイル記述子の指定オフセット位置から読み込みます。ファイルオフセットは変化しません。pwrite()
: ファイル記述子に対し、指定オフセット位置から書き出します。ファイルオフセットは変化しません。readv()
: ファイル記述子からデータを読みこんで複数の書き込み可能なバッファに書き込みます。truncate()
: path に対応するファイルを、サイズが最大で length バイトになるよう切り詰めます。waitid()
: 一つ以上の子プロセスの完了を待ちます。writev()
: buffers の内容をファイル記述子へ書き出します。 buffer は任意のバッファのシーケンスです。getgrouplist()
(bpo-9344): 指定したユーザが属するグループ ID のリストを返します。
times()
およびuname()
: 戻り値の型がタプルから属性名のついたタプルライクオブジェクトに変更されました。いくつかのプラットフォームにおいて、
lseek()
関数で使う追加の定数をサポートするようになりました。os.SEEK_HOLE
やos.SEEK_DATA
などです。新規の定数
RTLD_LAZY
,RTLD_NOW
,RTLD_GLOBAL
,RTLD_LOCAL
,RTLD_NODELETE
,RTLD_NOLOAD
,RTLD_DEEPBIND
が、それをサポートしているプラットフォームで利用可能になりました。これらはsys.setdlopenflags()
関数で使います。これら定数はctypes
モジュールとDLFCN
で定義されている同じような定数を置き換えるものです。(Contributed by Victor Stinner in bpo-13226.)クロスプラットフォームのサポートを簡単にするために、非 Windows 環境でも
os.symlink()
がキーワード引数target_is_directory
を受け付けるようになりました (単に無視します)。
pdb¶
Tab
キーでの補完がコマンド名だけでなくその引数に対しても使えるようになりました。例えば break
コマンドに対しては、関数、ファイル名が補完されます。
(Contributed by Georg Brandl in bpo-14210)
pickle¶
pickle.Pickler
オブジェクトに pickler ごとのリダクション関数を設定する、オプショナルな dispatch_table
属性が追加されました。
(Contributed by Richard Oudkerk in bpo-14166.)
sched¶
run()
が blocking パラメータを取るようになりました。 これを偽にセットすると、このメソッドは既に実行予定時間になっているイベント (もしあれば) を実行してすぐに戻ります。 これはscheduler
を非ブロッキングなアプリケーションで使いたい場合に有用です。 (Contributed by Giampaolo Rodolà in bpo-13449.) (—訳注: 原文の表現がわかりにくいですが、これはblocking=False
時はスケジュールされた時間になっているタスクがあれば通常は delayfunc を呼び出すところをそうせずに、一番早く次の予定時間に達するタスクの予定時間までの時間差を返します。—)scheduler
クラスをマルチスレッド環境で安全に使えるようになりました。 (Contributed by Josiah Carlson and Giampaolo Rodolà in bpo-8684.)scheduler
クラスのコンストラクタでのパラメータ timefunc と delayfunc が省略可能になりました。それぞれデフォルトで順にtime.time()
,time.sleep()
が使われます。 (Contributed by Chris Clark in bpo-13245.)enter()
とenterabs()
の argument パラメータが省略可能になりました。 (Contributed by Chris Clark in bpo-13245.)enter()
とenterabs()
が kwargs パラメータを受け付けるようになりました。 (Contributed by Chris Clark in bpo-13245.)
select¶
Solaris とその派生プラットフォームにおいて、新規クラス select.devpoll
が追加されました。これはハイパフォーマンスな非同期ソケットを /dev/poll
経由で提供するものです。 (Contributed by Jesús Cea Avión in bpo-6397.)
shlex¶
これまで pipes
モジュールにいて文書化もされてこなかったヘルパー関数 quote
が、 shlex
に移動の上で文書化されました。この quote()
は、文字列内でシェルによって何か特別な意味を与えられている全ての文字を適切にエスケープします。
shutil¶
新たな関数:
disk_usage()
: ディスクの利用状況について、トータル、使用中、空きの容量を返します。 (Contributed by Giampaolo Rodolà in bpo-12442.)chown()
: 指定された path のユーザ、グループの両方あるいは一方を変更します。ユーザ、グループは名前もしくは数値での ID (uid, gid) で指定します。(Contributed by Sandro Tosi in bpo-12191.)shutil.get_terminal_size()
: インタプリタが接続しているターミナルウィンドウのサイズを取得します。 (Contributed by Zbigniew Jędrzejewski-Szmek in bpo-13609.)
copy2()
とcopystat()
がファイルのタイムスタンプを、それをサポートするプラットフォームではナノ秒精度も維持するようになりました。また、Linux ではこれらは「拡張属性 (extended attributes)」もコピーするようになりました。 (Contributed by Larry Hastings in bpo-14127 and bpo-15238.)いくつかの関数がオプショナルな
symlinks
引数を取るようになりました。これが真の場合、シンボリックリンクの指す先を解決するのではなくシンボリックそのものに対しての操作をします (そうすることが必要であればシンボリックリンク作成もします)。(Contributed by Hynek Schlawack in bpo-12715.)ファイルシステムをまたがったファイルのコピーの際に、
move()
がシンボリックリンクを POSIX のmove
コマンドが行うのと同じやり方で扱うようになりました。つまりターゲットのファイルの中身をコピーするのではなくシンボリックリンクを再作成します。(Contributed by Jonathan Niehof in bpo-9993.) また、move()
はdst
引数を戻り値として返すようになりました。os.open()
とos.unlink()
が新パラメータdir_fd
をサポートしているプラットフォームでは、rmtree()
は今では シンボリックリンク攻撃に耐性を持ちます。 (Contributed by Martin von Löwis and Hynek Schlawack in bpo-4489.)
signal¶
signal
モジュールに新規関数が追加されました:pthread_sigmask()
: これを呼び出すスレッドにセットされているシグナルマスクを取り出したり変更したりします (Contributed by Jean-Paul Calderone in bpo-8407);pthread_kill()
: スレッドにシグナルを送ります;sigpending()
: 保留中のシグナルを調べます;sigwait()
: シグナルを待ちます;sigwaitinfo()
: シグナルを待ちますが、それについての詳細情報を返します;sigtimedwait()
:sigwaitinfo()
と似ていますがタイムアウト指定できます。
シグナルハンドラは wakeup ファイル記述子に以前は
\0
を書き込んでいましたが、シグナル番号を 1 バイト整数として書き込むようにしました。これにより、一つ以上のシグナルを待った上でどのシグナルが発生したのかあとから調べるといったことが出来ます。signal.signal()
とsignal.siginterrupt()
は RuntimeError ではなくOSError
を投げるようになりました: OSError は errno 属性を持っています。
smtpd¶
smtpd
モジュールが RFC 5321 (extended SMTP) と RFC 1870 (size extension) をサポートするようになりました。標準により、これら拡張を有効にするための必要十分条件はクライアントがセッションを EHLO
コマンドで開始することです。
(Initial ELHO
support by Alberto Trevino. Size extension by Juhana
Jauhiainen. Substantial additional work on the patch contributed by Michele
Orrù and Dan Boswell. bpo-8739)
smtplib¶
クラス SMTP
, SMTP_SSL
, LMTP
に新しいキーワード引数 source_address
が追加されました。 (host, port)
の形で指定し、これは外に向かうソケットを作成する際に bind()
呼び出し内でのソースアドレスとして用いられます。(Contributed by Paulo Scardine in bpo-11281.)
SMTP
がコンテキスト管理プロトコルをサポートするようになったので SMTP
のインスタンスを with
文で使えます。 (Contributed by Giampaolo Rodolà in bpo-11289.)
SMTP_SSL
コンストラクタと starttls()
メソッドが SSLContext パラメータを受け取るようになりました。これはセキュアなチャネルのパラメータを制御します。 (Contributed by Kasun Herath in bpo-8809.)
socket¶
socket
クラスが、前提となるプラットフォームがサポートしていれば従属的なデータを処理する追加のメソッドを公開しました:(Contributed by David Watson in bpo-6560, based on an earlier patch by Heiko Wundram)
socket
クラスが Linux で (https://lwn.net/Articles/253425) PF_CAN プロトコルファミリ (https://en.wikipedia.org/wiki/Socketcan) をサポートしました。(Contributed by Matthias Fuchs, updated by Tiago Gonçalves in bpo-10141.)
socket
クラスが PF_RDS プロトコルファミリ (https://en.wikipedia.org/wiki/Reliable_Datagram_Sockets および https://oss.oracle.com/projects/rds/) をサポートするようになりました。socket
クラスが OS X でPF_SYSTEM
プロトコルファミリをサポートするようになりました。 (Contributed by Michael Goderbauer in bpo-13777.)Unix システムにおいて新規関数
sethostname()
により、呼び出しプロセスが十分な特権を持っていればホスト名をセット出来ます。(Contributed by Ross Lagerwall in bpo-10866.)
socketserver¶
BaseServer
がオーバライド可能な service_actions()
メソッドを持つようになり、これは serve_forever()
によりサービスループ内で呼び出されます。 ForkingMixIn
がこれをゾンビ化した子プロセスのクリーンアップに使っています。 (Contributed by Justin Warkentin in bpo-11109.)
sqlite3¶
sqlite3.Connection
の新規のメソッド set_trace_callback()
を使うと sqlite3 により処理されるすべての sql コマンドの足跡 (トレース) をキャプチャ出来ます。(Contributed by Torsten Landschoff in bpo-11688.)
ssl¶
ssl
モジュールに新たに 2 つの乱数生成関数が追加されました:RAND_bytes()
: 暗号学的に強固な擬似乱数バイト列を生成します。RAND_pseudo_bytes()
: 擬似乱数バイト列を生成します。
(Contributed by Victor Stinner in bpo-12049.)
ssl
モジュールがより粒度の細かい例外階層を公開するようになり、これにより様々な種類のエラーを調べることが容易になります。 (Contributed by Antoine Pitrou in bpo-11183.)load_cert_chain()
が password 引数を受け付けるようになりました。これは秘密鍵が暗号化されている場合に使われます。 (Contributed by Adam Simpkins in bpo-12803.)ディフィー・ヘルマン鍵共有の、通常のものと楕円曲線ベースのもの両方が
load_dh_params()
メソッドとset_ecdh_curve()
メソッドを通じてサポートされるようになりました。(Contributed by Antoine Pitrou in bpo-13626 and bpo-13627.)SSL ソケットに新規メソッド
get_channel_binding()
が追加されました。これは SCRAM-SHA-1-PLUS (訳注: RFC 5802 など参照) のようなある種の認証メカニズムの実装で拡張されることを想定したものです。(Contributed by Jacek Konieczny in bpo-12551.)compression()
メソッドが追加されたので、SSL ソケットで使われている SSL 圧縮アルゴリズムを問い合わせることが出来ます。また、新規の属性OP_NO_COMPRESSION
で圧縮を無効に出来ます。(Contributed by Antoine Pitrou in bpo-13634.)ssl.SSLContext.set_npn_protocols()
による Next Protocol Negotiation 拡張のサポートが追加されました。 (Contributed by Colin Marc in bpo-14204.)属性
library
とreason
が追加されたので、SSL のエラーは以前よりもっと簡単に調べることが出来るようになりました。(Contributed by Antoine Pitrou in bpo-14837.)get_server_certificate()
関数が IPv6 をサポートするようになりました。 (Contributed by Charles-François Natali in bpo-11811.)新規属性
OP_CIPHER_SERVER_PREFERENCE
は SSLv3 サーバソケットに対し、暗号の優先順位をクライアントのものではなくサーバのものを使うようにします。 (bpo-13635)
stat¶
ドキュメントされていなかった tarfile.filemode
関数が stat.filemode()
に移動されました。これはファイルモードを ‘-rwxrwxrwx’ 形式の文字列に変換するのに使えます。
(Contributed by Giampaolo Rodolà in bpo-14807.)
struct¶
struct
モジュールが新たに ssize_t
(コード n
)、 size_t
(コード N
) をサポートするようになりました。 (Contributed by Antoine Pitrou in bpo-3163.)
subprocess¶
POSIX プラットフォームにおいて、コマンド文字列として bytes オブジェクトを渡せるようになりました。 (Contributed by Victor Stinner in bpo-8513.)
新規定数 DEVNULL
は、プラットフォームに依存しない方法で出力を抑制するのに使えます。 (Contributed by Ross Lagerwall in bpo-5870.)
sys¶
sys
モジュールに、スレッドの実装に関する情報が格納された 構造体シーケンス を保持する thread_info
が追加されました。 (bpo-11223)
tarfile¶
tarfile
が lzma
モジュールにより lzma
エンコーディングをサポートするようになりました (Contributed by Lars Gustäbel in bpo-5689.)。
tempfile¶
tempfile.SpooledTemporaryFile
の truncate()
メソッドが size
引数を受け取るようになりました。
(Contributed by Ryan Kelly in bpo-9957.)
threading¶
いずれもかつてインスタンスを返すファクトリ関数であった threading.Condition
, threading.Semaphore
, threading.BoundedSemaphore
, threading.Event
, threading.Timer
がクラスになったので、サブクラス化出来るようになりました。 (Contributed by Éric Araujo in bpo-10968.)
threading.Thread
コンストラクタがキーワード引数 daemon
を取るようになりました。これは親スレッドから daemon
フラグを継承するデフォルトの振る舞いをオーバライドします (bpo-6064)。
かつての非公開関数 _thread.get_ident
が公開関数 threading.get_ident()
として利用可能となっています。これは標準ライブラリにおいて多数の _thread
モジュールへの直接アクセスを取り除く結果になりました。 _thread.get_ident
を使っているサードパーティのコードも同じように、新しく公開化されたインターフェイスに乗り換えるべきです。
time¶
PEP 418 が time
モジュールに新たな関数を追加しました:
get_clock_info()
: クロックの情報を取得します。monotonic()
: 単調なクロック (逆行しない)、システムクロックの更新の影響を受けません。perf_counter()
: 短期間の計測のために利用可能な最高の解像度を持つパフォーマンスカウンタです。process_time()
: 現在のプロセスの system と user CPU 時間の和です。
その他の新たな関数:
関数
clock_getres()
,clock_gettime()
,clock_settime()
と、これに使われる定数群CLOCK_xxx
の追加。 (Contributed by Victor Stinner in bpo-10278.)
クロスプラットフォーム間での一貫性を改善するために、 sleep()
が負の値を渡すと ValueError
を投げるように変更されています。以前から POSIX システムではエラーでしたが、Windows の場合に無限に sleep していました。
types¶
新規クラス types.MappingProxyType
の追加: 読み出し専用のマッピングのプロキシです。 (bpo-14386)
新規関数 types.new_class()
と types.prepare_class()
は PEP 3115 準拠の動的な型の生成サポートを提供します。(bpo-14588)
unittest¶
メソッド assertRaises()
, assertRaisesRegex()
, assertWarns()
, assertWarnsRegex()
が、コンテキストマネージャとして使われる際にキーワード引数 msg を受け付けるようになりました。 (Contributed by Ezio Melotti and Winston Ewert in bpo-10775.)
unittest.TestCase.run()
が TestResult
オブジェクトを返すようになりました。
urllib¶
Request
クラスが get_method()
で使われる method 引数を受け付けるようになりました。これはどの HTTP メソッドが使われるべきかを指定します。例えば以下は 'HEAD'
リクエストを送信します:
>>> urlopen(Request('https://www.python.org', method='HEAD'))
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 の変更は以下の通りです:
新しい PEP 3118 関連の関数:
PEP 393 により追加された新たな Unicode 型、マクロ、関数:
高水準 API:
低水準 API:
PyUnicode_READY
PyUnicode_FromKindAndData()
PyUnicode_AsUCS4()
,PyUnicode_AsUCS4Copy()
PyUnicode_DATA
,PyUnicode_1BYTE_DATA
,PyUnicode_2BYTE_DATA
,PyUnicode_4BYTE_DATA
PyUnicode_Kind
列挙型でのPyUnicode_KIND
:PyUnicode_WCHAR_KIND
,PyUnicode_1BYTE_KIND
,PyUnicode_2BYTE_KIND
,PyUnicode_4BYTE_KIND
PyUnicode_READ
,PyUnicode_READ_CHAR
,PyUnicode_WRITE
PyUnicode_MAX_CHAR_VALUE
PyArg_ParseTuple
がc
フォーマットとしてbytearray
を許容するようになりました (bpo-12380)。
非推奨¶
サポートされないオペレーティングシステム¶
保守する者がいないため OS/2 ならびに VMS はもはやサポートされません。
保守の負担のため WIndows 2000 および COMSPEC
を command.com
に設定している Windows プラットフォームはもはやサポートされません。
3.2 で非推奨だった OSF のサポートが完全に削除されました。
非推奨の Python モジュール、関数、メソッド¶
object 型そのものの
object.__format__()
に空でない文字列が渡すことは非推奨となりました。Python 3.4 ではこれはTypeError
となります (bpo-9856)。PEP 393 により、
unicode_internal
コーデックは非推奨となりました。UTF-8, UTF-16 (utf-16-le
またはutf-16-be
), あるいは UTF-32 (utf-32-le
またはutf-32-be
) を使ってください。ftplib.FTP.nlst()
およびftplib.FTP.dir()
:ftplib.FTP.mlsd()
を使ってくださいplatform.popen()
:subprocess
モジュールを使ってください。 古い関数を subprocess モジュールで置き換える を是非お読みください (bpo-11377)。bpo-13374:
os
モジュールにある Windows のバイト列 API は非推奨となりました。ANSI コードページに依存しないようにしてあらゆるファイル名をサポートするために、バイト列文字列のファイル名ではなく Unicode ファイル名を使ってください。bpo-13988:
xml.etree.cElementTree
モジュールは非推奨です。利用できる際はいつでも自動的にアクセラレータを使用します。time.clock()
の振る舞いがプラットフォーム依存のため、今後は要件に応じて新たに追加されたtime.perf_counter()
またはtime.process_time()
を使ってください。これらの振る舞いは良く定義されています(well defined)。os.stat_float_times()
関数は非推奨です。abc
モジュール:abc.abstractproperty
は非推奨となりました。代わりにabc.abstractmethod()
にproperty
を渡して使ってください。abc.abstractclassmethod
は非推奨となりました。代わりにabc.abstractmethod()
にclassmethod
を渡して使ってください。abc.abstractstaticmethod
は非推奨となりました。代わりにabc.abstractmethod()
にstaticmethod
を渡して使ってください。
importlib
パッケージ:バイトコードファイルとしての
importlib.abc.SourceLoader.path_stats()
によりコンパイル時点の修正時刻とソースファイルサイズの両方を格納するようになったので、importlib.abc.SourceLoader.path_mtime()
は非推奨となりました。
C API の非推奨の関数ならびに型¶
PEP 393 で Py_UNICODE
は非推奨になり、Python 4 で削除されます。この型を使用している全ての関数は非推奨です。
型 Py_UNICODE
および Py_UNICODE*
を使用しているユニコード関数ならびにメソッド:
PyUnicode_FromUnicode
:PyUnicode_FromWideChar()
またはPyUnicode_FromKindAndData()
を使用してくださいPyUnicode_AS_UNICODE
,PyUnicode_AsUnicode()
,PyUnicode_AsUnicodeAndSize()
:PyUnicode_AsWideCharString()
を使用してくださいPyUnicode_AS_DATA
:PyUnicode_READ
およびPyUnicode_WRITE
とともにPyUnicode_DATA
を使用してくださいPyUnicode_GET_SIZE
,PyUnicode_GetSize()
:PyUnicode_GET_LENGTH
またはPyUnicode_GetLength()
を使用してくださいPyUnicode_GET_DATA_SIZE
:PyUnicode_GET_LENGTH(str) * PyUnicode_KIND(str)
を使用してください (既存の文字列でのみうまくいきます)PyUnicode_AsUnicodeCopy()
:PyUnicode_AsUCS4Copy()
またはPyUnicode_AsWideCharString()
を使用してくださいPyUnicode_GetMax()
Py_UNICODE* 文字列を操作する関数ならびにマクロ:
Py_UNICODE_strlen
:PyUnicode_GetLength()
またはPyUnicode_GET_LENGTH
を使用してくださいPy_UNICODE_strcat
:PyUnicode_CopyCharacters()
またはPyUnicode_FromFormat()
を使用してくださいPy_UNICODE_strcpy
,Py_UNICODE_strncpy
,Py_UNICODE_COPY
:PyUnicode_CopyCharacters()
またはPyUnicode_Substring()
を使用してくださいPy_UNICODE_strcmp
:PyUnicode_Compare()
を使用してくださいPy_UNICODE_strncmp
:PyUnicode_Tailmatch()
を使用してくださいPy_UNICODE_strchr
,Py_UNICODE_strrchr
:PyUnicode_FindChar()
を使用してくださいPy_UNICODE_FILL
:PyUnicode_Fill()
を使用してくださいPy_UNICODE_MATCH
エンコーダ:
PyUnicode_Encode()
:PyUnicode_AsEncodedObject()
を使用してくださいPyUnicode_EncodeUTF7()
PyUnicode_EncodeUTF8()
:PyUnicode_AsUTF8()
またはPyUnicode_AsUTF8String()
を使用してくださいPyUnicode_EncodeUTF32()
PyUnicode_EncodeUTF16()
PyUnicode_EncodeUnicodeEscape:()
PyUnicode_AsUnicodeEscapeString()
を使用してくださいPyUnicode_EncodeRawUnicodeEscape:()
PyUnicode_AsRawUnicodeEscapeString()
を使用してくださいPyUnicode_EncodeLatin1()
:PyUnicode_AsLatin1String()
を使用してくださいPyUnicode_EncodeASCII()
:PyUnicode_AsASCIIString()
を使用してくださいPyUnicode_EncodeCharmap()
PyUnicode_TranslateCharmap()
PyUnicode_EncodeMBCS()
: (CP_ACP
code_page とともに)PyUnicode_AsMBCSString()
またはPyUnicode_EncodeCodePage()
を使用してくださいPyUnicode_EncodeDecimal()
,PyUnicode_TransformDecimalToASCII()
非推奨の機能¶
array
モジュールの 'u'
書式化コードは非推奨となりました。Python 4 ではほかの (Py_UNICODE
) API と一緒に削除されるでしょう。
Python 3.3 への移植¶
このセクションでは前述の変更とバグフィックスにより必要となるかもしれないコードの変更を列挙します:
Python コードの移植¶
ハッシュのランダム化がデフォルトで有効になりました。これを無効にするには環境変数
PYTHONHASHSEED
を0
にセットして下さい。object.__hash__()
メソッドも参照して下さい。bpo-12326: Linux では、
sys.platform
はもはやメジャーバージョン番号を含みません。 これは今では常に ‘linux’ です。以前はこれは Python のビルドに使われた Linux バージョンに依存した'linux2'
や'linux3'
でした。sys.platform == 'linux2'
などとするのではなく、sys.platform.startswith('linux')
とするか、古い Python バージョンのサポートが不要であれば直接的にsys.platform == 'linux'
として下さい。bpo-13847, bpo-14180:
time
およびdatetime
: タイムスタンプが範囲外の場合に、ValueError
ではなくOverflowError
を送出するようになりました。また、C 関数のgmtime()
あるいはlocaltime()
が失敗した場合にはOSError
を送出するようになりました。インポートで使われるデフォルトのファインダが、特定のディレクトリに何が含まれるのかについてのキャッシュを利用するようになっています。実行中に Python ソースファイルやバイトコードファイルを作ったら、キャッシュをクリアしてファインダが新しく作られたファイルに気付けるように、
importlib.invalidate_caches()
を呼ぶ必要があることに注意してください。ImportError
がインポートを試みたモジュール名として完全名を使うようになっています。ImportError のメッセージをチェックする doctest は、モジュール名をその末尾の名前ではなく完全な名前を使うように更新する必要があります。__import__()
の引数 index のデフォルトが -1 ではなく 0 となり、また、もはや負の値はサポートされません。デフォルト値が -1 で残されたのは(訳注: つまり絶対、相対インポートの両方を試みるようにしたのは) PEP 328 を実装した際の過失でした。絶対インポートに先立って相対インポートを実行する振る舞いがまだ必要なのであれば、index を 1 にして相対インポートを実行して、その後で index 0 のインポートをするようにしてください。そうなのですが、__import__()
を直接呼び出すのではなく、importlib.import_module()
を使うことが望ましいやり方です。__import__()
の index に、トップレベルモジュールに対して 0 でなく 1 を与えることは今では許されません。例えば__import__('sys', level=1)
はエラーです。sys.meta_path
とsys.path_hooks
にデフォルトでファインダが含まれるようになったので、これらリストの操作でlist.append()
してきたのであれば、今後はおそらくほとんどはlist.insert()
が相応しいでしょう。ファインダが見つからない場合に
sys.path_importer_cache
にNone
が挿入されるようになったので、ファインダを持たないパスの辞書エントリをクリアするには、後方互換性を保つためにはimp.NullImporter
を値に持つエントリとNone
を値に持つエントリ の両方を 削除する必要があります。古い Python バージョンと比較して、暗黙のファインダを使うことを示すのにsys.path_importer_cache
にNone
を再挿入するという追加のオーバヘッドが必要となりますが、意味的には何の変更もないはずです。importlib.abc.Finder
がfind_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
は入力文字列に既に存在していなければASCII
非ASCII
セクション間に以前と同じく空白を追加するので、make_header
を使ってヘッダを構築するコードは変更なしで動作するはずです。email.utils.formataddr()
は非 ASCII の display name に対し正しい content transfer encoding の扱いをするようになっています。かつての、フォーマット後文字列内に非 ASCII Unicode を維持してしまう誤った振る舞いに依存するすべてのコードは、変更の必要があります。 (bpo-1690608)poplib.POP3.quit()
メソッドもほかの全てのpoplib
のメソッドと同じく、今ではプロトコルエラーを送出し得ます。quit
がpoplib.error_proto
エラーを送出しないことをあてにしていたコードは、quit
でのエラーが特定のアプリケーションにとって問題となるようであれば、修正の必要があるかもしれません (bpo-11291)。Python 2.4 から非推奨となっていた、
email.parser.Parser
へのstrict
引数はついに削除されました。非推奨となっていたメソッド
unittest.TestCase.assertSameElements
は削除されました。非推奨となっていた変数
time.accept2dyear
は削除されました。非推奨となっていた
Context._clamp
属性がdecimal
モジュールから削除されました。以前に既にこれは公開属性clamp
に置き換えられていました (bpo-8540 参照)。文書化されていなかった内部ヘルパクラス
SSLFakeFile
がsmtplib
モジュールより削除されました。この機能はずっと以前からsocket.socket.makefile()
によって直接的に提供されています。Windows では
time.sleep()
に負値を与えた場合に無限に眠っていましたが、今ではこれは例外を送出します。POSIX ではこれは以前より常に例外です。定数
ast.__version__
は削除されました。AST バージョンに依拠して何かしらの決定をする必要があるのであれば、sys.version_info
を使ってください。threading
モジュールの、非公開クラスをサブクラス化するファクトリ関数を迂回していたコードは、今では公開クラスになったので修正の必要があります。threading モジュール内の文書化されていなかったデバッグ機構を削除してコードを単純化しました。このことが製品コードに影響することがあってはなりませんが、これと連携していたアプリケーションデバッグフレームワークのケースがありうるので、言及しておきます (bpo-13550)。
C コードの移植¶
バッファ API 変更の一環で、文書化されてこなかった
Py_buffer
構造体のメンバsmalltable
が削除され、また、PyMemoryViewObject
のレイアウトが変更されました。memoryobject.h
あるいはobject.h
での関係する部分に依存する全ての拡張は、再ビルドが必要です。PEP 393 により、
Py_UNICODE
型とこの型を使う全ての関数は非推奨となりました (ただし最低 5 年は利用可能なまま保たれます)。Unicode オブジェクトの構築とアクセスに低水準 Unicode API をこれまで使っていて、PEP 393 によって提供されるメモリフットプリント削減の恩恵を受けたければ、新しい Unicode API に乗り換える必要があります。一方で
PyUnicode_Concat()
、PyUnicode_Join()
あるいはPyUnicode_FromFormat()
といった高水準関数のみを使ってきたのであれば、あなたのコードは自動的に新しい Unicode 表現に便乗できます。PyImport_GetMagicNumber()
は失敗時に -1 を返すようになりました。__import__()
の level 引数に負値を渡すことはもはや有効ではないので、対応するPyImport_ImportModuleLevel()
でも同じです。このことはPyImport_ImportModuleEx()
に使われる level の値が -1 ではなく 0 を使うようになったことも意味しています。
C 拡張のビルド¶
C 拡張のファイル名として認められる範囲が狭められました。滅多に使われてこなかった命名は取りやめられました: POSIX では、
xxxmodule.so
,xxxmodule.abi3.so
,xxxmodule.cpython-*.so
命名は今後xxx
モジュールの実装とは認識されません。これまでそのようなファイルを作ってきたのであれば、別の命名に乗り換えてください (つまりmodule
文字列をファイル名から取り除いてください)。(implemented in bpo-14040.)