What's New in Python 2.6¶
- 著者:
A.M. Kuchling (amk at amk.ca)
この記事では、2008 年 10 月 1 日にリリースされた Python 2.6 の新機能を説明します。 リリース日程は PEP 361 に記載されています。
Python 2.6 の主要なテーマは、言語を大幅に再設計する Python 3.0 への移行準備です。
可能な限り古い機能や構文を削除せず、既存コードとの互換性を保ちながら 3.0 の新機能や新構文を取り入れています。
それができない場合にも、future_builtins モジュールへ互換性のための関数を追加し、3.0 でサポートされなくなる使い方を警告する -3 オプションを設けるなど、できる限りの対応を行っています。
multiprocessing や json といった、いくつか重要な新しいパッケージが標準ライブラリに追加されましたが、Python 3.0 に何らかも関係しない新機能はあまり多くはありません。
Python 2.6 ではさらに、たくさんの改善とバグフィックスがソースコードのありとあらゆる場所に見られます。Python 2.5 から 2.6 の変更ログを手繰ってみると、低く見積もっても、適用されたパッチは 259、フィックスされたバグは 612 にのぼります。
このドキュメントは新機能の完全な詳細を提供するのではなくて、簡易な概要を提供することを目的にしています。完全な詳細が知りたければ、 Python 2.6 のドキュメントを参照してください。設計と実装の根拠を理解したい場合は、新機能に関する PEP を参照してください。可能な限り、 "What’s New in Python" は各変更の bug や patch に対してリンクしています。
Python 3.0¶
Python 2.6 と 3.0 の開発サイクルは同期していました。両バージョンのアルファ、ベータリリースは同じ日にリリースされています。3.0 の開発は 2.6 の多くの機能に影響を与えました。
Python 3.0 は、2.x シリーズとの互換性を破壊する、広範囲な再設計です。これは、Python 3.0 で動作させるためには既存のコードに何らかの変換が必要なことを意味しています。しかしながら、必ずしも全ての 3.0 での変更が互換性を破壊するわけではありません。新機能が既存のコードの破壊を引き起こさないケースにおいては、それらは 2.6 にバックポートされました。これらについてはこのドキュメントの適切な場所に記載しています。3.0 由来の機能の一部としては以下があります:
オブジェクトを複素数に変換する
__complex__()メソッド。例外の捕捉の、これまでとは別の文法の追加:
except TypeError as exc。組み込みの
reduce()関数と同じ関数としてfunctools.reduce()を追加。
Python 3.0 では組み込み関数がいくつか追加され、一部の既存の組み込み関数の意味も変わります。
bin() のように 3.0 で新設された関数は、そのまま Python 2.6 に追加されましたが、既存の組み込み関数は変更されていません。
代わりに future_builtins モジュールに、3.0 の意味で動作する版が用意されています。
3.0 と互換性のあるコードを書く場合は、必要に応じて from future_builtins import hex, map などと書けます。
新しいコマンドラインオプション -3 を指定すると、Python 3.0 で削除される機能への警告が有効になります。
このオプションでコードを実行すれば、3.0 への移植にどの程度の作業が必要かを調べられます。
オプションの値は、Python コードからは真偽値の変数 sys.py3kwarning、C 拡張からは Py_Py3kWarningFlag で確認できます。
開発プロセスに関する変更¶
2.6 の開発の間で、Python 開発プロセスは 2 つの重要な変更を経験しました: SourceForge の課題トラッカーから、カスタイマイズした Roundup インストレーションに乗り換えました。また、ドキュメントは LaTeX から reStructuredText に変換しました。
新しい課題トラッカー: Roundup¶
もう随分長いこと Python 開発者たちは、SourceForge のバグトラッカーにイライラを高め続けてきました。SourceForge がホストするソリューションには全くカスタマイズの余地がなく、たとえば課題のライフサイクルをカスタマイズ出来ませんでした。
そこで Python Software Foundation のインフラストラクチャ委員会は課題追跡システムを公募し、ボランティアに各種製品をセットアップして SourceForge から一部のバグやパッチを取り込むよう依頼しました。 Jira、Launchpad、Roundup、Trac の 4 製品が検討され、最終的に Jira と Roundup の 2 つに絞られました。 Jira は商用製品で、フリーソフトウェアプロジェクトには無償のホスティング環境を提供します。 Roundup はオープンソースのプロジェクトで、管理するボランティアとホスト用サーバーが必要です。
ボランティアへの呼び掛けののち、新しい Roundup インストレーションが https://bugs.python.org にセットアップされました。Roundup の一つのインストレーションは複数のトラッカーをホスト出来るため、このサーバは今では Jython と Python ウェブサイトのための課題トラッカーもホストしています。間違いなく将来はほかのものもホストするでしょう。可能な場所では、"What's New in Python" のこのエディションでは、それぞれの変更についてのバグ/パッチの Roundup アイテムにリンクします。
Python のバグトラッカーのホスティングは、南アフリカのステレンボッシュにある Upfront Systems が親切に提供しています。
Martin von Löwis は SourceForge から既存のバグやパッチを取り込むために多大な労力を費やしました。
取り込み用のスクリプトは https://svn.python.org/view/tracker/importer/ にあり、SourceForge から Roundup へ移行したいほかのプロジェクトにも役立つかもしれません。
参考
- https://bugs.python.org
Python のバグトラッカー。
- https://bugs.jython.org:
Jython のバグトラッカー。
- https://roundup.sourceforge.io/
Roundup のダウンロードとドキュメント。
- https://svn.python.org/view/tracker/importer/
Martin von Löwis の変換スクリプト。
新しいドキュメンテーションフォーマット: Sphinx を使っての reStructuredText¶
Python のドキュメンテーションは、そのプロジェクトの開始した 1989 年頃より LaTeX を使って書かれてきました。1980 年代と 1990 年代初期は、ほとんどのドキュメンテーションはあとで学習するために印刷されるもので、オンラインで見るものではありませんでした。LaTeX はとても魅惑的な印刷をしてくれるものですから、非常に大変広く広く使われていましたが、一方では、学んだマークアップの基礎的なルールで直裁的に、書いたらそれっきり、というものでもありました。
こんにちにおいてもなお、印刷を命題とする出版において LaTeX は健在といえど、プログラミングの道具立ての風景は変わりました。わたしたちはもはやドキュメンテーションの紙束をプリントアウトはしません。代わりにオンラインでブラウズします。ですから HTML は、サポートすべき最も重要なフォーマットになりました。悲しいかな、 LaTeX から HTML への変換は気が狂うほどに複雑で、Fred L. Drake Jr.、彼は長らく Python ドキュメンテーションのエディターを務めていますが、彼はその変換処理の保守に多大な時間を浪費していたのです。ときおり人々はドキュメンテーションを SGML に変換して、それから XML にすればいいでしょ、と持ちかけるのですが、良い変換を達成することにとらわれて、誰一人として仕事を完遂させようと時間を捧げることはしませんでした。
2.6 の開発中、Georg Brandl は文書を処理する新しいツール群の構築に多大な労力を費やしました。 その成果は Sphinx というパッケージで、https://www.sphinx-doc.org/ から入手できます。
Sphinx は HTML 出力に集中し、人を惹きつけるスタイルでモダンな HTML を生成します。印刷出力は LaTeX への変換を経由することで健在です。入力のフォーマットは reStructuredText です。これはカスタムな拡張とディレクティブをサポートしているマークアップ文法で、Python コミュニティでは広く使われています。
Sphinx は執筆に使えるスタンドアロンのパッケージです。そして 2 ダースに届かんばかりのプロジェクト (Sphinx ウェブサイトのリスト) が Sphinx をドキュメンテーションツールとして採用しました。
参考
- Documenting Python
Python ドキュメントの書き方について書いています。
- Sphinx
Sphinx ツールチェインのドキュメントとコードです。
- Docutils
縁の下の力持ちになっている reStructuredText のパーサとツールセットです。
PEP 343: "with" ステートメント¶
Python 2.5 では、 'with' 文が from __future__ import with_statement ディレクティブで有効に出来るオプションの機能として追加されました。2.6 では 'with' 文は特別に有効化する必要なく、もういつでもそこにあります。このセクションの残りの部分は "What's New in Python 2.5" の対応するセクションからの丸々コピーですので、2.5 で 'with' 文に馴染んでいるなら読み飛ばしてもらって結構です。
'with' ステートメントは、以前なら後片付けが実行されるのを確実にするために try...finally ブロックを使ったであろうようなコードを、より単純明快にします。このセクションでは、このステートメントの普通の使い方を説明します。続くセクションでは実装の詳細を調べ、このステートメントとともに使うためにオブジェクトをどうやって書けば良いかをお見せします。
'with' ステートメントは基本構造が以下となる制御フロー構造です:
with expression [as variable]:
with-block
式を評価した結果は、コンテキスト管理プロトコルに対応するオブジェクトである必要があります (つまり、__enter__() メソッドと __exit__() メソッドを備えている必要があります)。
with-block を実行する前にオブジェクトの __enter__() が呼ばれるため、そこで準備のコードを実行できます。
値を返すこともでき、variable が指定されていればその名前に束縛されます。
(variable に代入されるのは expression の結果では ない 点に注意してください。)
with-block の実行が終わると、ブロックが例外を送出した場合も含めて、オブジェクトの __exit__() メソッドが呼ばれるので、そこで後始末のコードを実行できます。
いくつかの Python 標準オブジェクトが既にコンテキスト管理プロトコルをサポートしていて、 'with' とともに使えます。ファイルオブジェクトがその一例です:
with open('/etc/passwd', 'r') as f:
for line in f:
print line
... more processing code ...
このステートメントが実行し終わったあかつきには、 f のファイルオブジェクトは、たとえ for ループが道半ばにして例外と成り果てても、自動的にクローズされます。
注釈
この場合、__enter__() が self を返すので、f は open() が作ったオブジェクトそのものです。
threading モジュールのロック・条件変数でも 'with' ステートメントの恩恵にあずかれます:
lock = threading.Lock()
with lock:
# コードのクリティカルセクション
...
ブロックが実行される前にロックが獲得されて、ブロックが完了するやいなや必ず解放されます。
decimal モジュールの localcontext() 関数を使うと、演算に求める精度や丸め方法を保持する現在の十進数コンテキストを、簡単に保存・復元できます。
from decimal import Decimal, Context, localcontext
# デフォルトの精度である 28 桁で表示
v = Decimal('578')
print v.sqrt()
with localcontext(Context(prec=16)):
# このブロック内のコードはすべて 16 桁の精度を使う。
# ブロックを抜けると元のコンテキストに戻る。
print v.sqrt()
コンテキストマネージャを書く¶
中身を紐解いてみれば、 'with' ステートメントはけっこう入り組んでいます。ほとんどの人にとっては、既存のオブジェクトを 'with' とともに使うだけのことでその詳細を知る必要は無いので、それで良いならこのセクションの残りの部分は読み飛ばして結構です。新しいオブジェクトの作者は基礎となる実装の詳細について知る必要があるので、このまま読み進めるべきです。
コンテキスト管理プロトコルの高度な説明はこんなです:
式を評価した結果は、「コンテキストマネージャー」と呼ばれるオブジェクトである必要があります。 コンテキストマネージャーには
__enter__()と__exit__()の両メソッドが必要です。コンテキストマネージャーの
__enter__()メソッドが呼ばれ、その戻り値が VAR に代入されます。as VAR節がなければ、値は単に捨てられます。BLOCK 内のコードが実行されます。
BLOCK が例外を送出した場合、コンテキストマネージャーの
__exit__()が例外の詳細を表す 3 つの引数で呼ばれます。 これはtype, value, tracebackというsys.exc_info()と同じ値で、例外がなければNoneにもなります。 メソッドの戻り値で例外を再送出するかどうかが決まり、偽の値なら再送出し、Trueなら抑制します。 例外を抑制すべき場合はまれです。 抑制すると、with文を含むコードの作者は、何か問題が起きたことを知る手段を失うからです。BLOCK が例外を送出しなかった場合も
__exit__()メソッドは呼ばれますが、type、value、traceback はすべてNoneになります。
例を通じて考えましょう。枝葉末節を含んだ完璧なコードを提示しようとは思いませんが、データベースのためにトランザクションをサポートするのに必要となるメソッドの書き方についてスケッチしてみようと思います。
(データベース用語に不慣れな方へ:データベースへの変更のセットは、トランザクションという単位でグループ化されています。トランザクションは「コミット」される、その意味は、全ての変更がデータベースに書き込まれることです、もしくは「ロールバック」される、この場合全ての変更が捨てられてデータベースが変更されません、この 2 つのいずれかになりえます。詳しくはなにかデータベースの著述を読んで下さい。)
データベース接続を表現するオブジェクトがあると仮定しましょう。私たちの目標は、そのオブジェクトのユーザがこのように書けるようになることです:
db_connection = DatabaseConnection()
with db_connection as cursor:
cursor.execute('insert into ...')
cursor.execute('delete from ...')
# ... その他の操作 ...
ブロック内のコードが問題なく実行されたらトランザクションをコミットし、例外が起きたらロールバックする必要があります。
ここでは DatabaseConnection の基本的なインターフェースを次のように想定します。
class DatabaseConnection:
# データベースのインターフェース
def cursor(self):
"新しいトランザクションを開始し、カーソルオブジェクトを返す"
def commit(self):
"現在のトランザクションをコミットする"
def rollback(self):
"現在のトランザクションをロールバックする"
__enter__() メソッドは、新しいトランザクションを開始するだけなので簡単です。
この用途では、作成したカーソルオブジェクトを返すと便利なので、メソッドの戻り値にします。
利用者は with 文に as cursor を追加して、カーソルを変数名に束縛できます。
class DatabaseConnection:
...
def __enter__(self):
# 新しいトランザクションを開始するコード
cursor = self.cursor()
return cursor
__exit__() メソッドは処理の大部分を担うため、最も複雑になります。
このメソッドは例外が発生したかどうかを確認する必要があります。
例外がなければトランザクションをコミットし、例外があればロールバックします。
下記のコード内では実行がメソッドの末尾まで落ちていって、なのでデフォルトの None 返却になります。 None は偽なので、例外は自動的に再送出されます。望むならもっと明示的に、コメントでマークした部分で return 文を書いてもよろしいです:
class DatabaseConnection:
...
def __exit__(self, type, value, tb):
if tb is None:
# 例外がないのでコミット
self.commit()
else:
# 例外が発生したのでロールバック。
self.rollback()
# return False
contextlib モジュール¶
contextlib モジュールは、 'with' ステートメントで使えるオブジェクトを書く際に便利ないくつかの関数とデコレータを提供しています。
このデコレーターは @contextmanager といい、新しいクラスを定義する代わりに、一つのジェネレータ関数を書けるようにします。
ジェネレータは値をちょうど一つだけ yield する必要があります。
yield までのコードは __enter__() メソッドとして実行され、yield した値がその戻り値になります。
with 文に as 節があれば、その変数に値が束縛されます。
yield より後のコードは __exit__() メソッド内で実行されます。
ブロック内で発生した例外は、yield 文から送出されます。
このデコレータを使って、前セクションの私たちのデータベースの例はこのように書けます:
from contextlib import contextmanager
@contextmanager
def db_transaction(connection):
cursor = connection.cursor()
try:
yield cursor
except:
connection.rollback()
raise
else:
connection.commit()
db = DatabaseConnection()
with db_transaction(db) as cursor:
...
contextlib モジュールには nested(mgr1, mgr2, ...) 関数もあり、この関数はたくさんのコンテキストマネージャを組み合わせることができて、入れ子の 'with' を書く必要性をなくしてくれます。この例では、単一の 'with' でデータベーストランザクション開始とスレッドのロック獲得の両方をやってのけています:
lock = threading.Lock()
with nested (db_transaction(db), lock) as (cursor, locked):
...
Finally, the closing() function returns its argument so that it can be
bound to a variable, and calls the argument's .close() method at the end
of the block.
import urllib, sys
from contextlib import closing
with closing(urllib.urlopen('http://www.yahoo.com')) as f:
for line in f:
sys.stdout.write(line)
参考
- PEP 343 - "with" ステートメント
PEP は Guido van Rossum と Nick Coghlan によって書かれ、Mike Bland、 Guido van Rossum、Neal Norwitz により実装されました。この PEP は '
with' ステートメントによって生成されるコードを見せてくれるので、このステートメントがどうやって動作するのかを知るのに役立ちます。
contextlib モジュールについてのドキュメント。
PEP 366: メインモジュールからの明示的相対インポート¶
Python のオプション -m で、モジュールをスクリプトとして実行出来ます。パッケージ内のモジュールを実行する際に、相対インポートが正しく動作していませんでした。
Python 2.6 では、この問題の修正として module.__package__ 属性が追加されました。
この属性があれば、相対インポートは __name__ ではなく、この属性の値を基準に行われます。
PEP 302 形式のインポーターは、必要に応じて __package__ を設定できます。
-m オプションを実装する runpy モジュールもこれを設定するようになり、パッケージ内から実行するスクリプトで相対インポートが正しく動作するようになりました。
PEP 370: ユーザごとの site-packages ディレクトリ¶
Python の実行時、モジュール検索パス sys.path には通常、パスの末尾が "site-packages" のディレクトリが含まれます。
このディレクトリは、マシンや特定のサイトの Python 環境の全ユーザーが利用できる、ローカルにインストールしたパッケージを置くためのものです。
Python 2.6 ではユーザ固有のサイトディレクトリのための決まりを導入しました。ディレクトリはプラットフォームに依存して変わります。
Unix と Mac OS X:
~/.local/Windows:
%APPDATA%/Python
このディレクトリ内にはバージョン固有のサブディレクトリが入ります。Unix/Mac OS では lib/python2.6/site-packages のように、Windows では Python26/site-packages のように。
デフォルトのディレクトリが適さなければ、環境変数で上書きできます。
PYTHONUSERBASE は、この機能に対応するすべての Python バージョンで使うルートディレクトリを設定します。
Windows では APPDATA 環境変数でアプリケーション固有のデータ用ディレクトリを変更できます。
Python 環境の site.py を変更することもできます。
この機能は Python 起動時に -s オプションを付けるか、環境変数 PYTHONNOUSERSITE をセットすることで完全に無効に出来ます。
参考
- PEP 370 - ユーザごとの
site-packagesディレクトリ PEP 著と実装 Christian Heimes.
PEP 371: multiprocessing パッケージ¶
新しい multiprocessing により、Python プログラムが新たなプロセスを作成して何か計算を実行させて結果を返させることが出来ます。親と子のプロセスはキューとパイプを使って通信し、ロックとセマフォを使って同期し、単純なデータの配列を共有出来ます。
multiprocessing モジュールは当初、スレッドの代わりにプロセスを使って threading を完全に再現するものとして始まりました。
Python 2.6 までの開発過程でその目標は撤回されましたが、全体的な使い方は今も似ています。
中心となるのは Process クラスで、呼び出し可能オブジェクトとその引数を渡します。
start() メソッドでサブプロセス内の実行を開始した後、is_alive() で実行中かどうかを確認し、join() で終了を待てます。
ここに、サブプロセスが階乗を計算する例を示します。その計算をする関数はヘンテコリンに書かれていて、入力が 4 の倍数だととっても時間がかかるように仕組んであります。
import time
from multiprocessing import Process, Queue
def factorial(queue, N):
"階乗を計算する。"
# N が 4 の倍数なら、この関数は大幅に時間がかかる。
if (N % 4) == 0:
time.sleep(.05 * N/4)
# 結果を計算
fact = 1L
for i in range(1, N+1):
fact = fact * i
# 結果をキューへ入れる
queue.put(fact)
if __name__ == '__main__':
queue = Queue()
N = 5
p = Process(target=factorial, args=(queue, N))
p.start()
p.join()
result = queue.get()
print 'Factorial', N, '=', result
Queue が factorial の結果を通信して返すのに使われています。 Queue オブジェクトはグローバル変数に格納されています。子プロセスは、子プロセスが作成された時点のその変数の値を使うことになります; Queue なので、親子はそのオブジェクトを通信のために使うことが出来ます。(プロセス作成後に親がグローバル変数 queue を差し替えても、子の値は左右されませんし、逆もしかりです。)
Pool と Manager は、より高水準のインターフェースを提供します。
Pool は一定数のワーカープロセスを作成します。
apply() や apply_async() で 1 件、map() や map_async() で複数の要求を追加して、ワーカーへ処理を分配できます。
次のコードは Pool を使って 5 個のワーカープロセスへ要求を分配し、結果のリストを取得します。
from multiprocessing import Pool
def factorial(N, dictionary):
"Compute a factorial."
...
p = Pool(5)
result = p.map(factorial, range(1, 1000, 10))
for v in result:
print v
これは以下のような出力をします:
1
39916800
51090942171709440000
8222838654177922817725562880000000
33452526613163807108170062053440751665152000000000
...
もう一つの高水準のインターフェース Manager は、Python のデータ構造の本体を保持できる独立したサーバープロセスを作ります。
ほかのプロセスはプロキシオブジェクトを介して、そのデータ構造にアクセスして変更できます。
次の例では dict() メソッドで共有辞書を作り、ワーカープロセスがそこへ値を挿入します。
(ロックは自動的には行われませんが、この例では問題になりません。
Manager には、共有ロックを作る Lock()、RLock()、Semaphore() メソッドもあります。)
import time
from multiprocessing import Pool, Manager
def factorial(N, dictionary):
"階乗を計算する。"
# 結果を計算
fact = 1L
for i in range(1, N+1):
fact = fact * i
# 結果を辞書に格納
dictionary[N] = fact
if __name__ == '__main__':
p = Pool(5)
mgr = Manager()
d = mgr.dict() # 共有辞書を作成
# プールを使ってタスクを実行
for N in range(1, 1000, 10):
p.apply_async(factorial, (N, d))
# プールを閉じ、タスクの追加を終了する。
p.close()
# タスクの終了を待つ
p.join()
# 結果を出力
for k, v in sorted(d.items()):
print k, v
これはこんな出力をするでしょう:
1 1
11 39916800
21 51090942171709440000
31 8222838654177922817725562880000000
41 33452526613163807108170062053440751665152000000000
51 15511187532873822802242430164693032110632597200169861120000...
参考
multiprocessing モジュールについてのドキュメント。
- PEP 371 - multiprocessing パッケージの追加
PEP 著 Jesse Noller と Richard Oudkerk; 実装 Richard Oudkerk と Jesse Noller.
PEP 3101: 進化版文字列フォーマッティング¶
Python 3.0 では % 演算子に加え、より強力な文字列書式化メソッド format() が導入されます。
str.format() のサポートは Python 2.6 にも移植されました。
2.6 では、8 ビット文字列と Unicode 文字列の両方に .format() メソッドがあり、文字列をテンプレートとして扱い、書式化する引数を受け取ります。
テンプレートでは波括弧 ({、}) を特殊文字として使います。
>>> # 位置引数 0 を文字列へ埋め込む。
>>> "User ID: {0}".format("root")
'User ID: root'
>>> # 名前を指定したキーワード引数を使う
>>> "User ID: {uid} Last seen: {last_login}".format(
... uid="root",
... last_login = "5 Mar 2008 07:20")
'User ID: root Last seen: 5 Mar 2008 07:20'
波括弧自身は二重に書くことでエスケープ出来ます:
>>> "Empty dict: {{}}".format()
"Empty dict: {}"
フィールド名は、位置引数に対応する整数による {0}, {1}, …、またはキーワード引数に対応する名前です。属性を読み出したり辞書のキーにアクセスするような合成フィールド名(compound field names)も与えることが出来ます:
>>> import sys
>>> print 'Platform: {0.platform}\nPython version: {0.version}'.format(sys)
Platform: darwin
Python version: 2.6a1+ (trunk:61261M, Mar 5 2008, 20:29:41)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)]'
>>> import mimetypes
>>> 'Content-type: {0[.mp4]}'.format(mimetypes.types_map)
'Content-type: video/mp4'
[.mp4] のように辞書スタイルの記法を使う際は文字列の周りを引用符で囲む必要はありません; .mp4 をキーに値のルックアップされます。数値で始まる文字列は整数に変換されます。フォーマット文字列内でこれ以上複雑な表現は書けません。
ここまでは、結果文字列に置き換えられるフィールドを指定する方法について見てきました。フォーマッティングではさらに、コロンに続けて書式指定子を追加することでコントロール可能です。例えば:
>>> # フィールド 0: 左揃え、15 文字幅まで埋める
>>> # フィールド 1: 右揃え、6 文字幅まで埋める
>>> fmt = '{0:15} ${1:>6}'
>>> fmt.format('Registration', 35)
'Registration $ 35'
>>> fmt.format('Tutorial', 50)
'Tutorial $ 50'
>>> fmt.format('Banquet', 125)
'Banquet $ 125'
書式指定子として、ネストによる他フィールド参照が使えます:
>>> fmt = '{0:{1}}'
>>> width = 15
>>> fmt.format('Invoice #1234', width)
'Invoice #1234 '
>>> width = 35
>>> fmt.format('Invoice #1234', width)
'Invoice #1234 '
望みの幅内でのフィールドの整列を指定可能です:
文字 |
効果 |
|---|---|
< (デフォルト) |
左寄せ |
> |
右寄せ |
^ |
中央寄せ |
= |
(数値型についてのみ) 符号のあとにパディング |
書式指定子には体裁のタイプも含めることが出来ます。値をどのようにフォーマットするかです。たとえば浮動小数点数は普通の数値に、あるいは指数形式でフォーマット出来ます:
>>> '{0:g}'.format(3.75)
'3.75'
>>> '{0:e}'.format(3.75)
'3.750000e+00'
たくさんの体裁のタイプを利用出来ます。2.6 ドキュメントの complete list を調べてみてください。以下はその一部です:
|
2進数。出力される数値は2を基数とします。 |
|
文字。数値を対応するユニコード文字に変換します。 |
|
10進数。出力される数値は10を基数とします。 |
|
8進数。出力される数値は8を基数とします。 |
|
16進数。出力される数値は16を基数とします。 10進で9を超える数字には小文字が使われます。 |
|
指数表現です。指数を示す 'e' を使った科学的記数法で表示します。 |
|
汎用フォーマット。数値が大き過ぎない限りは固定小数点表現をしますが、大きい値では 'e' 指数表現に切り替えます。 |
|
数値です。現在のロケールに合わせて、数値分割文字が挿入されることを除き、 |
|
パーセンテージです。数値は 100 倍され、固定小数点数フォーマット ( |
クラスや型は __format__() メソッドを定義して、書式化の方法を制御できます。
このメソッドは、書式指定子という一つの引数を受け取ります。
def __format__(self, format_spec):
if isinstance(format_spec, unicode):
return unicode(str(self))
else:
return str(self)
単一の値を書式化する組み込み関数 format() もあります。
指定された書式指定子を渡して、型の __format__() メソッドを呼び出します。
>>> format(75.6564, '.2f')
'75.66'
PEP 3105: print を関数にする¶
print 文は Python 3.0 では print() 関数になります。 print() が関数になることで、 def print(...) やなにかほかの場所からの新しい関数をインポートするなどの方法で置き換え可能になります。
Python 2.6 では __future__ インポートで 言語構文としての print を取り除き、関数形式のものを代わりに使えるように出来ます。たとえば:
>>> from __future__ import print_function
>>> print('# of entries', len(dictionary), file=sys.stderr)
この新しい関数のシグネチャは以下の通りです:
def print(*args, sep=' ', end='\n', file=None)
パラメータは以下のとおりです:
args: 出力される値を指定する位置引数リスト。
sep: 引数リスト args を出力するのに使われる区切り文字。
end: 引数リスト args を全て出力したあとに出力するテキスト。
file: 出力が送られるファイルオブジェクト。
参考
- PEP 3105 - print を関数にする
Georg Brandl 著の PEP。
PEP 3110: 例外処理の変更¶
Python プログラマが時折やらかしてしまう誤りの一つにこんなのがあります:
try:
...
except TypeError, ValueError: # 誤り!
...
このコードの作者はきっと TypeError 例外と ValueError 例外の両方とっつかまえてやろうと思ったのでしょうが、このコードは実際にはちょっと違ったことをします: TypeError を捕捉したらこれを "ValueError" というローカル名の例外オブジェクトに束縛します…。 ValueError 例外は決して捕捉されません。正しくは、例外のタプルで指定します:
try:
...
except (TypeError, ValueError):
...
こんなことが起こってしまうのは、ここではカンマの使用が曖昧だからです: それ、解析木内で 2 つのノードを示すのかな、タプルな単一ノードかしら?
Python 3.0 はカンマからワード "as" に置き換えてこの曖昧さをなくします。例外を捕捉して例外オブジェクトを exc に記憶するには、こう書かなければなりません:
try:
...
except TypeError as exc:
...
Python 3.0 は "as" の使用のみをサポートするようになるので、最初の例は 2 つの異なる例外を捕捉するものとして翻訳されます。Python 2.6 ではカンマも "as" もサポートするので、既存のコードはそのまま動作します。新たに 2.6 で実行される Python コードを書くならば、 "as" の使用を勧めます。
参考
- PEP 3110 - Python 3000 での例外の捕捉
PEP 著と実装 Collin Winter.
PEP 3112: バイトリテラル¶
Python 3.0 は Unicode を言語の基本文字列型として採用し、8 ビットリテラルは異なった記法で指示します。それには b'string' とするか、 bytes のコンストラクタを用います。前方互換のために、Python 2.6 は str 型に対する別名として bytes を追加のうえで、 b'' 記法もサポートします。
2.6 の str 型は 3.0 の bytes 型とは色んな意味で違います; 一番顕著なのは、コンストラクタがまったく異なることです。3.0 での bytes([65, 66, 67]) は 3 つのバイトで ABC を構築しますが、2.6 での bytes([65, 66, 67]) は引数のリストを str() で文字列化した 12 バイト文字列を返します。
2.6 での bytes の主な使いみちはオブジェクトの型のテストに isinstance(x, bytes) とすることでしょう。またこれは、 2.x コードが文字列として ASCII 文字と 8 ビットバイトのどちらを意図しているのか知ることが出来ない 2to3 コンバータの助けになります; あなたは今や bytes と str の区別を、あなたの意図を正確に表現するのに使えます。そして結果のコードは Python 3.0 で正しいものに修正されるでしょう。
全ての文字列リテラルを Unicode 文字列としてしまう __future__ インポートもあります。これは Unicode 文字を含むのに \u エスケープシーケンスを使えることを意味します。
from __future__ import unicode_literals
s = ('\u751f\u3080\u304e\u3000\u751f\u3054'
'\u3081\u3000\u751f\u305f\u307e\u3054')
print len(s) # 12 個の Unicode 文字
C レベルでは、Python 3.0 で 8 ビット文字列型の名前が、Python 2.x の PyStringObject から PyBytesObject に変わります。
Python 2.6 は #define によって PyBytesObject()、PyBytes_Check()、PyBytes_FromStringAndSize() など、文字列に関連するすべての関数やマクロの名前を使えるようにしています。
bytes 型のインスタンスは単に文字列と同じで immutable です。 bytearray 型が、バイト列を mutable シーケンスとして格納するものとして新しく追加されました:
>>> bytearray([65, 66, 67])
bytearray(b'ABC')
>>> b = bytearray(u'\u21ef\u3244', 'utf-8')
>>> b
bytearray(b'\xe2\x87\xaf\xe3\x89\x84')
>>> b[0] = '\xe3'
>>> b
bytearray(b'\xe3\x87\xaf\xe3\x89\x84')
>>> unicode(str(b), 'utf-8')
u'\u31ef \u3244'
バイト配列は、startswith()、endswith()、find()、rfind() など、文字列型のほとんどのメソッドに対応します。
また append()、pop()、reverse() など、リストのメソッドの一部にも対応します。
>>> b = bytearray('ABC')
>>> b.append('d')
>>> b.append(ord('e'))
>>> b
bytearray(b'ABCde')
対応する C API もあります。 PyByteArray_FromObject(), PyByteArray_FromStringAndSize() や色々その他関数です。
参考
- PEP 3112 - Python 3000 でのバイトリテラル
PEP 著 Jason Orendorff; 2.6 へのバックポート Christian Heimes.
PEP 3116: 新しい I/O ライブラリ¶
Python の組み込みファイルオブジェクトには多数のメソッドがありますが、ファイル風オブジェクトがそのすべてに対応するとは限りません。
ファイルを模したオブジェクトは通常 read() と write() に対応しますが、例えば readline() はないかもしれません。
Python 3.0 では io に階層化された I/O ライブラリが導入され、バッファリングやテキスト処理が基本的な読み書き操作から分離されます。
io モジュールによって提供される抽象基底クラスには 3 つのレベルがあります:
RawIOBaseは生の I/O 操作として、read()、readinto()、write()、seek()、tell()、truncate()、close()を定義します。 このクラスのメソッドの多くは、通常一つのシステムコールに対応します。 オブジェクトがどの操作に対応するかを調べるreadable()、writable()、seekable()メソッドもあります。Python 3.0 はこのクラスのファイルとソケットに対する具象実装を持っていますが、Python 2.6 はファイル、ソケットオブジェクトのこの方法での再構築はしていません。
BufferedIOBaseは、データをメモリにバッファリングしてシステムコールの回数を減らし、I/O 処理を効率化する抽象基底クラスです。RawIOBaseのすべてのメソッドに対応し、基盤となる生の I/O オブジェクトを保持するraw属性が加わります。There are five concrete classes implementing this ABC.
BufferedWriterandBufferedReaderare for objects that support write-only or read-only usage that have aseek()method for random access.BufferedRandomobjects support read and write access upon the same underlying stream, andBufferedRWPairis for objects such as TTYs that have both read and write operations acting upon unconnected streams of data. TheBytesIOclass supports reading, writing, and seeking over an in-memory buffer.TextIOBase: 文字列の読み書きの機能を提供し (Python 3.0 の文字列は Unicode であることを思い出してください)、universal newlines に対応します。TextIOBaseはreadline()メソッドを定義し、オブジェクトの反復にも対応します。具象実装は 2 つあります。
TextIOWrapperはバッファ付き I/O オブジェクトをラップし、テキスト I/O の全メソッドに対応するとともに、元のオブジェクトへアクセスするbuffer属性を追加します。StringIOはすべてをメモリ内に保持し、ディスクには何も書き込みません。(Python 2.6 の
io.StringIOは Python だけで実装されているため、かなり低速です。 当面は既存のStringIOやcStringIOモジュールを使い続けるとよいでしょう。 いずれ Python 3.0 のioは高速化のために C で書き直され、その実装が 2.x にも移植されるかもしれません。)
Python 2.6 では根底にある実装が io モジュールのクラスの上に組み立てられるようには再構築されていません (訳注: Python HowTo の移植ガイドにも触れられている通り、2.7 も同じです)。このモジュールは 3.0 への前方互換のコードを書くのを容易にするために、また、開発者たちがバッファリング I/O とテキスト I/O を自身で書く労力を省くために提供されています。
参考
- PEP 3116 - 新しい I/O
PEP 著: Daniel Stutzbach, Mike Verdone, Guido van Rossum. 実装: Guido van Rossum, Georg Brandl, Walter Doerwald, Jeremy Hylton, Martin von Loewis, Tony Löwis, ほか.
PEP 3118: 改訂版バッファプロトコル¶
バッファプロトコルは Python 型にその内部表現へのポインタをやりとりさせる、C レベル API です。例えば、メモリマップドファイルは文字のバッファとして見ることが出来ます。そしてこれは re のようなほかのモジュールが、それを文字列として扱って検索するようなことを許します。
バッファプロトコルの主なユーザは NumPy のような数値演算パッケージで、それらは呼び出し元がより遅い API を経由することなく直接的に行列にデータを書き込むことが出来るように、行列の内部表現を曝しています。この PEP は NumPy 開発の経験を踏まえてバッファプロトコルを更新するもので、行列の形状を表明したり、メモリ領域をロックしたりするような多数の新機能を追加します。
最重要の新規 C API 関数は PyObject_GetBuffer(PyObject *obj, Py_buffer *view, int flags) で、これはオブジェクトを受け取って、フラグをセットし、 Py_buffer 構造体にオブジェクトのメモリ表現についての情報を埋めます。オブジェクトはこの操作を、外部の呼び出し元がその内容を修正している間所定のメモリをロックするのに使えます。ですので対応する操作 PyBuffer_Release(Py_buffer *view) があり、これで外部呼出し元が処理を終えたことを表明します。
PyObject_GetBuffer() への flags 引数は返されるメモリについての制約条件を指定します。いくつかの例として:
PyBUF_WRITABLEは、メモリが書き込み可能である必要があることを示します。PyBUF_LOCKrequests a read-only or exclusive lock on the memory.PyBUF_C_CONTIGUOUSとPyBUF_F_CONTIGUOUSは、それぞれ C 連続 (最後の次元が最も速く変化) と Fortran 連続 (最初の次元が最も速く変化) の配列配置を要求します。
PyArg_ParseTuple() のための 2 つの新しい書式化コード s* と z* は、パラメータとしてロックされたバッファオブジェクトを返します。
参考
- PEP 3118 - 改訂版バッファプロトコル
PEP 著: Travis Oliphant, Carl Banks; 実装: Travis Oliphant.
PEP 3119: 抽象基底クラス¶
Java などのオブジェクト指向言語には、クラスが特定のメソッド群やアクセスプロトコルを備えると宣言するインターフェースがあります。
抽象基底クラス (ABC) は、それに相当する Python の機能です。
ABC のサポートは、ABCMeta というメタクラスを含む abc モジュール、組み込みの isinstance() と issubclass() によるそのメタクラスの特別な扱い、そして Python 開発者が広く役立つと考える基本的な ABC 群からなります。
将来の Python では、さらに ABC が追加されるでしょう。
あるクラスについて、辞書風のアクセスに対応するかを知りたいとします。
しかし「辞書風」という表現は曖昧です。
おそらく obj[1] で要素を取得できるという意味ですが、obj[2] = value で設定できることも含むでしょうか。
keys()、values()、items() メソッドがあるという意味でしょうか。
iterkeys() などの反復版や、copy() と update() はどうでしょうか。
iter() でオブジェクトを反復できるでしょうか。
Python 2.6 の collections モジュールには、これらの違いを表す ABC がいくつもあります。
Iterable はクラスが __iter__() を定義することを、Container は __contains__() メソッドを定義し、x in y 式に対応することを示します。
要素の取得・設定と keys()、values()、items() からなる基本的な辞書インターフェースは、MutableMapping ABC が定義します。
あなた自身のクラスを特定の ABC から派生して、ABC のインターフェイスをサポートすることを示せます:
import collections
class Storage(collections.MutableMapping):
...
あるいは、目的の ABC を継承せずにクラスを書き、ABC の register() メソッドでそのクラスを登録することもできます。
import collections
class Storage:
...
collections.MutableMapping.register(Storage)
自分で書くクラスなら、ABC を継承する方が明快でしょう。
register() は、既存の型やクラスにも当てはまる新しい ABC を書いた場合や、サードパーティーのクラスが ABC を実装すると宣言したい場合に便利です。
例えば PrintableType ABC を定義したなら、次のようにできます。
# Python の型を登録
PrintableType.register(int)
PrintableType.register(float)
PrintableType.register(str)
クラスは ABC が規定するセマンティクスに従うべきですが、Python はそれをチェックは出来ません;その ABC の要求を理解してコードを適切に実装するのはクラスの作者任せです。
オブジェクトが特定のインターフェイスをサポートするかどうかをチェックするのには、今やこう書けます:
def func(d):
if not isinstance(d, collections.MutableMapping):
raise ValueError("Mapping object expected, not %r" % d)
これからはたくさんのこのようなチェックをしなければならないのだ、この例のように、などとは思わないように。Python は至極ダックタイピングな流儀なのであって明示的な型チェックは決してされませんし、コードは単純にオブジェクトのメソッドを、それらメソッドがそこにあるはずで、なければ例外になるのを信じて呼ぶだけです。ABC についてのチェックには分別を持ち、それが絶対的に必要な場合にだけそうするようにしましょう。
あなた自身の ABCs を書くには、クラス定義内のメタクラスとして abc.ABCMeta を使います:
from abc import ABCMeta, abstractmethod
class Drawable():
__metaclass__ = ABCMeta
@abstractmethod
def draw(self, x, y, scale=1.0):
pass
def draw_doubled(self, x, y):
self.draw(x, y, scale=2.0)
class Square(Drawable):
def draw(self, x, y, scale):
...
上の Drawable ABC の draw_doubled() メソッドは、オブジェクトを 2 倍の大きさで描画し、Drawable のほかのメソッドを使って実装できます。
そのため、この ABC を実装するクラスは draw_doubled() を自分で実装する必要はありませんが、実装しても構いません。
一方、draw() については ABC 側で汎用的な実装を提供できないので、実装が必要です。
draw() のように実装が必須のメソッドには @abstractmethod デコレーターを付けられます。
すると、そのメソッドを定義しないクラスに対して Python が例外を送出します。
ただし例外が送出されるのは、メソッドがないサブクラスのインスタンスを実際に作ろうとしたときだけです。
>>> class Circle(Drawable):
... pass
...
>>> c = Circle()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: Can't instantiate abstract class Circle with abstract methods draw
>>>
抽象データ属性を @abstractproperty を使って宣言出来ます:
from abc import abstractproperty
...
@abstractproperty
def readonly(self):
return self._x
サブクラスは readonly プロパティを定義する必要があります。
参考
- PEP 3119 - 抽象基底クラスの導入
PEP は Guido van Rossum と Talin によって著され、Guido van Rossum により実装されています。Python 2.6 へのバックポートは Benjamin Aranguren と Alex Martelli により行われました。
PEP 3127: 整数リテラルのサポートと文法¶
Python 3.0 は octal (基数 8: 8 進数) 整数リテラルの構文を変更し、先行するゼロの代わりに "0o" または "0O" (「ゼロオー」)としています。また、 binary (基数 2: 2 進数) 整数リテラルのサポートを追加し、これは "0b" または "0B" で指示します。
Python 2.6 は先行するゼロの形式での 8 進数サポートをやめませんが、 "0o" と "0b" は追加サポートします:
>>> 0o21, 2*8 + 1
(17, 17)
>>> 0b101111
47
ビルトイン関数 oct() はまだ先行ゼロ形式での表現を返します。新しいビルトイン関数 bin() は数値の 2 進数表現を返します:
>>> oct(42)
'052'
>>> future_builtins.oct(42)
'0o52'
>>> bin(173)
'0b10101101'
組み込みの int() と long() は、8 進数または 2 進数を指定した場合や、base がゼロ (文字列から基数を判断する指定) の場合に、接頭辞 "0o" と "0b" を受け付けるようになりました。
>>> int ('0o52', 0)
42
>>> int('1101', 2)
13
>>> int('0b1101', 2)
13
>>> int('0b1101', 0)
13
参考
- PEP 3127 - 整数リテラルのサポートと文法
PEP 著 Patrick Maupin、2.6 へのバックポートは Eric Smith による。
PEP 3129: クラスデコレータ¶
デコレータが拡張されて関数だけでなクラスにも使えるようになりました。今やこのように書くのは合法です:
@foo
@bar
class A:
pass
これは次と等価です:
class A:
pass
A = foo(bar(A))
参考
- PEP 3129 - クラスデコレータ
PEP 著 Collin Winter.
PEP 3141: 数値の型階層¶
Python 3.0 では Scheme の numeric tower に触発された、いくつかの数値型のための抽象基底クラスを追加しています。これらのクラスは numbers モジュール として 2.6 にバックポートされています。
最も一般的な ABC は Number です。
操作を何も定義せず、isinstance(obj, Number) でオブジェクトが数かどうかを確認できるようにするためだけに存在します。
Complex は Number のサブクラスです。
複素数には加算、減算、乗算、除算、べき乗という基本演算を行え、実部や虚部、共役複素数を取得できます。
Python の組み込み複素数型は Complex の実装です。
Real はさらに Complex を継承し、実数だけで行える操作を追加します。
floor()、trunc()、丸め、N で割った剰余、切り捨て除算、比較です。
Rational は Real を継承し、numerator と denominator プロパティを持ち、浮動小数点数へ変換できます。
Python 2.6 では fractions モジュールに、単純な有理数クラス Fraction が加わりました。
(numbers.Rational との名前の衝突を避けるため、Rational ではなく Fraction という名前になっています。)
Integral は Rational を継承し、<< と >> による左右のシフト、& や | などのビット演算ができ、配列のインデックスやスライスの境界にも使えます。
Python 3.0 では、この PEP によって既存の round()、math.floor()、math.ceil() の定義が少し変わり、新しい math.trunc() が加わります。
この新しい関数は Python 2.6 にも移植されました。
math.trunc() はゼロに向かって丸め、引数とゼロの間にある最も近い Integral を返します。
参考
- PEP 3141 - 数値の型階層
PEP 著: Jeffrey Yasskin.
Guile マニュアルの Scheme's numerical tower 。
R5RS Scheme 仕様の Scheme の数値データ型。
fractions モジュール¶
数値型階層を埋めるべく、 fractions モジュールが有理数クラスを提供しています。有理数は分子(numerator)と分母(denominator)で構成される分数としてその値を格納し、浮動小数点数では近似しか出来ない 2/3 のような数を正確に表現出来ます。
Fraction のコンストラクターは、分数の分子と分母になる 2 つの Integral 値を受け取ります。
>>> from fractions import Fraction
>>> a = Fraction(2, 3)
>>> b = Fraction(2, 5)
>>> float(a), float(b)
(0.66666666666666663, 0.40000000000000002)
>>> a+b
Fraction(16, 15)
>>> a/b
Fraction(5, 3)
浮動小数点数を有理数へ変換するため、float 型に as_integer_ratio() メソッドが加わりました。
同じ浮動小数点数の値になる分数の分子と分母を返します。
>>> (2.5) .as_integer_ratio()
(5, 2)
>>> (3.1415) .as_integer_ratio()
(7074029114692207L, 2251799813685248L)
>>> (1./3) .as_integer_ratio()
(6004799503160661L, 18014398509481984L)
1./3 のような浮動小数点数で近似にしかならない値は、近似して単純化されたりはしないことに注意してください; その分数は浮動小数点数に 正確に 合うように試みられます。
fractions モジュールは、ずっと長い間 Python の Demo/classes/ ディレクトリにいた Sjoerd Mullender による実装に基いています。この実装が Jeffrey Yasskin によって大幅に更新されました。
その他の言語変更¶
Python 言語コアに小さな変更がいくつか行われました:
__main__.pyを含んだディレクトリ名と zip アーカイブ名をインタプリタに渡して直接実行出来るようになりました。そのディレクトリと zip アーカイブは自動的に sys.path エントリの先頭に追加されます。(Suggestion and initial patch by Andy Chu, subsequently revised by Phillip J. Eby and Nick Coghlan; bpo-1739468.)hasattr()は、エラーが起きたら__getattr__()が何らかの形で失敗したのだとみなし、すべてのエラーを捕捉・無視してhasattr()の戻り値をFalseにしていました。 しかしKeyboardInterruptやSystemExitにこの考え方を適用すべきではありません。 Python 2.6 のhasattr()は、これらの例外を無視しなくなりました。 (Benjamin Peterson が修正しました。bpo-2196。)**構文を使ってキーワード引数を許容する関数を呼び出すのに、もう Python 辞書を使う必要はありません; 任意のマッピングプロトコルをサポートするオブジェクトで今では動作します:>>> def f(**kw): ... print sorted(kw) ... >>> ud=UserDict.UserDict() >>> ud['a'] = 1 >>> ud['b'] = 'string' >>> f(**ud) ['a', 'b']
(Contributed by Alexander Belopolsky; bpo-1686487.)
同時に、
*args引数のあとでキーワード引数を与える関数呼び出しも今では合法です。:>>> def f(*args, **kw): ... print args, kw ... >>> f(1,2,3, *(4,5,6), keyword=13) (1, 2, 3, 4, 5, 6) {'keyword': 13}
以前はこれは構文エラーになっていました。 (Contributed by Amaury Forgeot d'Arc; bpo-3473.)
新しいビルトイン
next(iterator, [default])は指定したイテレータより次のアイテムを返します。 iterator が使い果たされている場合、 default 引数が与えられていれがこれを、そうでなければStopIteration例外を起こします。 (Backported in bpo-2719.)タプルに、リスト型の
index()とcount()に対応するindex()とcount()メソッドが加わりました。>>> t = (0,1,2,3,4,0,1,2) >>> t.index(3) 3 >>> t.count(0) 2
(Contributed by Raymond Hettinger)
ビルトイン型が拡張スライス構文をサポートするために改善されています。色々な
(start, stop, step)組み合わせを受け付けます。以前はこれのサポートは限定的で、ものによっては動作しませんでした。 (Implemented by Thomas Wouters.)プロパティに
@getter、@setter、@deleterという 3 つのデコレーターが加わりました。 既存のプロパティに取得・設定・削除の関数を追加するための便利な書き方を提供します。 次のように使います。class C(object): @property def x(self): return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x class D(C): @C.x.getter def x(self): return self._x * 2 @x.setter def x(self, value): self._x = value / 2
組み込み集合型のいくつかのメソッドが、複数のイテラブルを受け付けるようになりました。
intersection()、intersection_update()、union()、update()、difference()、difference_update()が該当します。>>> s=set('1234567890') >>> s.intersection('abc123', 'cdf246') # すべての入力の共通部分 set(['2']) >>> s.difference('246', '789') set(['1', '0', '3', '5'])
(Contributed by Raymond Hettinger.)
たくさんの浮動小数点数機能が追加されました。
float()関数は文字列nanを IEEE 754 非数 (Not A Number) 値に変換し、+infと-infは正あるいは負の無限大に変換します。これは IEEE 754 セマンティクスのあらゆるプラットフォームで動作します。 (Contributed by Christian Heimes; bpo-1635.)mathモジュールのisinf()とisnan()は、それぞれ浮動小数点数の引数が無限大か NaN であれば真を返します。 (bpo-1640)浮動小数点数を 16 進表記文字列に変換する変換関数が追加されています (bpo-3008)。これら関数は 10 進と 2 進との間の変換で起こる丸め誤差を持ち込まずに浮動小数点数と文字列表現の相互変換をします。浮動小数点数は文字列表現を返す
hex()メソッドを持ち、また、float.fromhex()メソッドが文字列から浮動小数点数に戻します:>>> a = 3.75 >>> a.hex() '0x1.e000000000000p+1' >>> float.fromhex('0x1.e000000000000p+1') 3.75 >>> b=1./3 >>> b.hex() '0x1.5555555555555p-2'
数に関する繊細さ: 符号付ゼロ (-0 と +0) をサポートするシステムで 2 つの浮動小数点数から複素数を作る際に、
complex()コンストラクタがゼロの符号を維持するようになりました。 (Fixed by Mark T. Dickinson; bpo-1507.)親クラスから
__hash__()を継承するクラスは、__hash__ = Noneと設定してハッシュ可能でないことを示せます。 するとhash(obj)はTypeErrorを送出し、クラスはHashableABC を実装しているとはみなされなくなります。オブジェクトの同一性ではなく値を比較する
__cmp__()や__eq__()を定義した場合は、この設定を行ってください。 すべてのオブジェクトのデフォルトのハッシュメソッドはid(obj)をハッシュ値に使います。 親から継承した__hash__()を簡単に取り除く方法がないため、Noneの代入で上書きできるようになりました。 C レベルでは、拡張モジュールはtp_hashにPyObject_HashNotImplemented()を設定できます。 (Nick Coghlan と Amaury Forgeot d'Arc が修正しました。bpo-2235。)GeneratorExit例外がExceptionではなくBaseExceptionのサブクラスになっています。except Exception:をする例外ハンドラが意図せずGeneratorExit捕捉してしまうことがなくなります。 (Contributed by Chad Austin; bpo-1537.)ジェネレータオブジェクトに、その基盤となる元のコードオブジェクトを参照する
gi_code属性が加わりました。 (Collin Winter による貢献です。bpo-1473257。)ビルトイン関数
compile()が位置引数だけでなくキーワード引数も受け付けるようになりました。 (Contributed by Thomas Wouters; bpo-1444529.)complex()コンストラクタが括弧で囲まれた複素数表現文字列を受け付けるようになっています。complex(repr(cplx))で元に戻せるということです。例えばcomplex('(3+4j)')は今では値(3+4j)を返します。 (bpo-1491866)文字列の
translate()メソッドが変換表の引数にNoneを受け付け、恒等変換として扱うようになりました。 これにより、文字の削除だけを行いやすくなります。 (Bengt Richter が提案し、Raymond Hettinger が実装しました。bpo-1193128。)組み込みの
dir()が、受け取ったオブジェクトに__dir__()メソッドがあるかを調べるようになりました。 このメソッドは有効な属性名の文字列のリストを返す必要があり、オブジェクト側でdir()の結果を制御できます。__getattr__()や__getattribute__()を持つオブジェクトは、これを使って対応する擬似的な属性を示せます。 (bpo-1591665)インスタンスメソッドオブジェクトに、それを構成するオブジェクトと関数を表す新しい属性名が加わりました。
im_selfは__self__、im_funcは__func__という名前でも使えます。 古い名前は Python 2.6 では引き続きサポートされますが、3.0 ではなくなります。目立たない変更:
locals()関数をclassステートメント内で使う際、結果の辞書はもはや自由変数を返しません。(この場合、自由変数はclassステートメント内で参照される変数で、クラスの属性ではありません。)
最適化¶
warningsモジュールが C で書き直されました。これにより警告をパーサから発行出来、また、インタプリタの起動が高速化しています。 (Contributed by Neal Norwitz and Brett Cannon; bpo-1631171.)型オブジェクトがメソッドのキャッシュを持つようになっています。これは個別のクラスについての正しいメソッド実装を見つけるのに必要な仕事を減らします。いったんキャッシュされれば、インタプリタは呼び出さなければならない正しいメソッドを知るために基底クラス群を横断しなくてもよくなります。基底クラスやクラス自身が修正されれば、Python の動的な振る舞いの面においても正しくあり続けなければならないので、キャッシュはクリアされます。 (Original optimization implemented by Armin Rigo, updated for Python 2.6 by Kevin Jacobs; bpo-1700288.)
デフォルトではこの変更は、Python コアに含まれる型のみに適用されます。拡張モジュールは必ずしもこのキャッシュに互換ではなく、拡張モジュールはメソッドキャッシュを有効にするために、モジュールの
tp_flagsフィールドに明示的にPy_TPFLAGS_HAVE_VERSION_TAGを追加しなければなりません。(このメソッドキャッシュに対して互換であるためには、拡張モジュールのコードは、それが実装するどんな型についてもtp_dictメンバに直接アクセスしたり修正したりしてはなりません。ほとんどのモジュールはこれをしていませんが、Python インタプリタがそれを検知することは出来ません。 bpo-1878 にいくらかの議論がありますので参照してください。)キーワード引数を使う関数呼び出しが、素早くポインタで比較することで顕著に高速化しています。これは常に文字列丸ごとを比較する時間を省きます。 (Contributed by Raymond Hettinger, after an initial implementation by Antoine Pitrou; bpo-1819.)
structモジュールの全ての関数が C で書き換えられました。「Need For Speed スプリント」での作業の成果です。 (Contributed by Raymond Hettinger.)いくつかの標準ビルトイン型が、その型オブジェクトにビットをセットするようになりました。これは、オブジェクトがそれら型のサブクラスの一つであるかどうかのチェックするのを高速化します。 (Contributed by Neal Norwitz.)
Unicode 文字列の空白や改行の検出が高速化され、
split()は約 25%、splitlines()は約 35% 高速になりました。 (Antoine Pitrou による貢献です。) Unicode 文字列のデータに pymalloc を使うことで、メモリ使用量も減りました。with文が__exit__()メソッドをスタックに格納するようになり、少し高速になりました。 (Jeffrey Yasskin による実装です。)メモリ使用を減らすために、一番作られたオブジェクトをガーベージコレクトする際に、ガーベージコレクタが内部のフリーリストをクリアするようになりました。これはオペレーティングシステムにすぐに返されます。
インタプリタの変更¶
ほかの Python 実装のために、2 つのコマンドラインオプションが予約されました。
-J は、基盤となる JVM に渡すオプションなど、Jython 固有のオプションのために予約されました。
-X は CPython、Jython、IronPython など、特定の Python 実装に固有のオプションのためのものです。
Python 2.6 でどちらかを使うと、現在そのオプションは使われていないというメッセージが出ます。
Python インタプリタに -B スイッチを渡すか、インタプリタ実行前に環境変数 PYTHONDONTWRITEBYTECODE をセットするかのどちらかで、 .pyc や .pyo が作られないようにすることが出来るようになりました。この設定は Python プログラムから sys.dont_write_bytecode 変数として利用可能で、Python コードはこの変数を変更してインタプリタの振る舞いを変えることが出来ます。 (Contributed by Neal Norwitz and Georg Brandl.)
標準入力、標準出力、標準エラー出力に使うエンコーディングを、インタプリタ起動前に環境変数 PYTHONIOENCODING を設定することで指定出来るようになりました。値は <encoding> または <encoding>:<errorhandler> 形式の文字列でなければなりません。 encoding 部分はエンコーディングの名前で、例えば utf-8 や latin-1 です; 省略可能な errorhandler 部分はエンコーディングによって処理出来ない文字に対して何をするのかを指定するもので、 "error", "ignore", "replace" のどれかです。 (Contributed by Martin von Löwis.)
新しいモジュールと改良されたモジュール¶
全てのリリースに置いて、 Python の標準ライブラリはたくさんの改良とバグ修正がされてきました。ここでは一部の注目に値する変更を、モジュール名で辞書順ソートしてリストアップしています。もっと完全な変更リストが見たければ、ソースツリー内の Misc/NEWS ファイルか、全ての完全な詳細が入っている Subversion のログを参照してください。
asyncoreとasynchatの活発な保守が再開され、多数のパッチやバグ修正が適用されました。 (保守担当は Josiah Carlson です。パッチの一例は bpo-1736190 を参照してください。)bsddbにも新たに Jesús Cea Avión が保守担当として加わり、単独のパッケージとしても利用できるようになりました。 Web ページは www.jcea.es/programacion/pybsddb.htm です。 Python よりはるかに頻繁にリリースされるため、Python 3.0 では標準ライブラリから削除する計画です。bsddb.dbshelveは、プロトコル 1 に限定せず、利用できる最も高い pickle プロトコルを使うようになりました。 (W. Barnes による貢献です。)cgiモジュールが、HTTP POST リクエストのクエリー文字列からも変数を読むようになりました。 これにより、"/cgi-bin/add.py?category=1" のようにクエリー文字列を含む URL をフォームの送信先にできます。 (Alexandre Fiori と Nubis による貢献です。bpo-1817。)parse_qs()とparse_qsl()がcgiからurlparseモジュールへ移されました。cgiに残っている版は、2.6 ではPendingDeprecationWarningを出します (bpo-600362)。cmathモジュールに大掛かりな改訂が行われました。Mark Dickinson と Christian Heimes による貢献です。5 つの新しい関数が追加されました:polar()は複素数を極形式に変換し、その絶対値と偏角を返します。rect()は逆の変換を行い、絶対値と偏角の組から対応する複素数を返します。phase()は、複素数の偏角 (角度とも呼びます) を返します。isnan()は、引数の実部または虚部が NaN なら True を返します。isinf()は、引数の実部または虚部が無限大なら True を返します。
これらの改訂で
cmathの数値的な信頼性も向上しました。 すべての関数で、可能な限り結果の実部と虚部の誤差が数 ulp (最下位桁の単位) 以内になります。 詳細は bpo-1381 を参照してください。asinh()、atanh()、atan()の分岐切断も修正されました。そのモジュールのテストは大変拡大しました; およそ 2000 の新たなテストケースが数学関数群を鍛え上げます。
IEEE 754 プラットフォームでは
cmathモジュールは、IEEE 754 の特殊値と浮動小数点例外を、C99 標準の付録 'G' での一貫性のある方法で処理するようになりました。collectionsモジュールに新しいデータ型が加わりました。namedtuple(typename, fieldnames)は、フィールドへインデックスだけでなく名前でもアクセスできる、標準のタプルのサブクラスを作るファクトリー関数です。 例えば次のようになります。>>> var_type = collections.namedtuple('variable', ... 'id name type size') >>> # 名前はスペースまたはカンマで区切る。 >>> # 'id, name, type, size' でもよい。 >>> var_type._fields ('id', 'name', 'type', 'size') >>> var = var_type(1, 'frequency', 'int', 4) >>> print var[0], var.id # 同じ意味 1 1 >>> print var[2], var.type # 同じ意味 int int >>> var._asdict() {'size': 4, 'type': 'int', 'id': 1, 'name': 'frequency'} >>> v2 = var._replace(name='amplitude') >>> v2 variable(id=1, name='amplitude', type='int', size=4)
標準ライブラリのうちタプルを返していた箇所のいくつかが、
namedtuple()のインスタンスを返すよう変更されました。 例えばdecimal.Decimal.as_tuple()は、sign、digits、exponentフィールドを持つ名前付きタプルを返します。(Contributed by Raymond Hettinger.)
collectionsのもう一つの変更は、dequeに省略可能な maxlen パラメーターが加わったことです。 指定すると、deque の要素数は maxlen 以下に制限されます。 満杯の deque に要素を追加すると、古い要素が捨てられます。>>> from collections import deque >>> dq=deque(maxlen=3) >>> dq deque([], maxlen=3) >>> dq.append(1); dq.append(2); dq.append(3) >>> dq deque([1, 2, 3], maxlen=3) >>> dq.append(4) >>> dq deque([2, 3, 4], maxlen=3)
(Contributed by Raymond Hettinger.)
CookieモジュールのMorselが、httponly属性に対応しました。 一部のブラウザーでは、この属性を設定したクッキーに JavaScript からアクセスしたり、変更したりすることができません。 (Arvin Schnell による貢献です。bpo-1638033。)cursesモジュールのウィンドウに新しいchgat()メソッドが加わり、1 行のうち指定した文字数の表示属性を変更できます。 (Fabian Kreutz による貢献です。)# y=0,x=21 から行末までを # 太字にする。 stdscr.chgat(0, 21, curses.A_BOLD)
curses.textpadのTextboxが、上書きモードに加えて挿入モードでの編集にも対応しました。Textboxインスタンスを作る際、insert_mode に真の値を渡すと挿入モードになります。datetimeモジュールのstrftime()が、オブジェクトのマイクロ秒の値を左側のゼロ埋めで 6 桁にする書式コード%fに対応しました。 (Skip Montanaro による貢献です。bpo-1158。)decimalモジュールが General Decimal Specification のバージョン 1.66 に更新されました。 新機能にはexp()やlog10()などの基本的な数学関数のメソッドがあります。>>> Decimal(1).exp() Decimal("2.718281828459045235360287471") >>> Decimal("2.7182818").ln() Decimal("0.9999999895305022877376682436") >>> Decimal(1000).log10() Decimal("3")
Decimalオブジェクトのas_tuple()メソッドが、sign、digits、exponentフィールドを持つ名前付きタプルを返すようになりました。(Implemented by Facundo Batista and Mark Dickinson. Named tuple support added by Raymond Hettinger.)
difflibのSequenceMatcherは、一致箇所を表すためにa、b、size属性を持つ名前付きタプルを返すようになりました。 (Raymond Hettinger による貢献です。)ftplib.FTPのコンストラクターとconnect()メソッドに、タイムアウトを秒単位で指定する省略可能なtimeoutパラメーターが加わりました。 (Facundo Batista が追加しました。) また、FTPのstorbinary()とstorlines()に省略可能な callback が加わり、各データブロックの送信後に、そのブロックを引数として呼ばれます。 (Phil Schwartz による貢献です。bpo-1221598。)組み込み関数
reduce()がfunctoolsモジュールでも利用できるようになりました。 Python 3.0 では組み込みから削除され、reduce()はfunctoolsからだけ利用できますが、現時点では 2.x で組み込みから削除する予定はありません。 (Christian Heimes によるパッチです。bpo-1739906。)可能な場合には、
getpassモジュールはプロンプトメッセージ出力とパスワードの読み取りに/dev/ttyを使うようになりました。利用出来ない場合は標準エラー出力と標準入力が使われます。端末に入力パスワードがエコーされるかもしれない場合、プロンプト表示の前に警告が出力されます。 (Contributed by Gregory P. Smith.)glob.glob()関数が、Unicode パスが使われるかディレクトリ内に Unicode ファイル名がマッチすると Unicode ファイル名を返すようになりました。 (bpo-1001604)heapqモジュールの新しい関数merge(iter1, iter2, ...)は、任意の数のソートされたデータを返すイテラブルを取り、全てのイテラブルの内容をソートされた順に返す新しいジェネレータを返します (---訳注: 誤解を招く表現なので補足しておきますが、入力のイテレータはソート済みであることを「仮定」し、出力のジェネレータは「入力が主張している」順序に従うだけです。入力がソートされていなくても並べ替えられるわけではありません。リファレンスにはここはきちんと書かれています。---)。例えば:>>> list(heapq.merge([1, 3, 5, 9], [2, 8, 16])) [1, 2, 3, 5, 8, 9, 16]
もう一つの新しい関数
heappushpop(heap, item)は、heap に item を追加してから、最小の要素を取り除いて返します。heappush()とheappop()を順に呼ぶより効率的です。heapqは以前使っていた「以下(<=)」比較ではなく「より小さい(<)」比較だけを使って実装されています。これによりheapqに格納する型の要件がlist.sort()メソッドに合致します。 (Contributed by Raymond Hettinger.)httplib.HTTPConnectionとHTTPSConnectionのコンストラクターに、タイムアウトを秒単位で指定する省略可能なtimeoutパラメーターが加わりました。 (Facundo Batista が追加しました。)getmoduleinfo()やgetargs()など、inspectのほとんどの関数が名前付きタプルを返すようになりました。 戻り値はタプルとして振る舞うだけでなく、属性としても各要素にアクセスできます。 (Raymond Hettinger による貢献です。)このモジュールには
isgenerator()、isgeneratorfunction()、isabstract()などの新しい関数も加わりました。itertoolsモジュールにいくつかの関数が追加されています。izip_longest(iter1, iter2, ...[, fillvalue])はそれぞれの要素群からタプルを生成します; イテラブルの要素数がほかのものより短ければ欠落値として fillvalue が埋められます。例えば:>>> tuple(itertools.izip_longest([1,2,3], [1,2,3,4,5])) ((1, 1), (2, 2), (3, 3), (None, 4), (None, 5))
product(iter1, iter2, ..., [repeat=N])は与えたイテラブルの直積 (Cartesian product)、つまりそれぞれのイテラブルから返るその要素たちの全てのありうる組み合わせを含むタプルの集合を返します。:>>> list(itertools.product([1,2,3], [4,5,6])) [(1, 4), (1, 5), (1, 6), (2, 4), (2, 5), (2, 6), (3, 4), (3, 5), (3, 6)]
省略可能 repeat キーワード引数が与えられると、イテラブルが一つであればこれが N 個、複数あればそのセットが N 回与えられたとみなします。単一のイテラブルに対しては N 要素タプルのリストで返ります:
>>> list(itertools.product([1,2], repeat=3)) [(1, 1, 1), (1, 1, 2), (1, 2, 1), (1, 2, 2), (2, 1, 1), (2, 1, 2), (2, 2, 1), (2, 2, 2)]
2 つのイテラブルであれば 2N 要素タプルのリストで返ります:
>>> list(itertools.product([1,2], [3,4], repeat=2)) [(1, 3, 1, 3), (1, 3, 1, 4), (1, 3, 2, 3), (1, 3, 2, 4), (1, 4, 1, 3), (1, 4, 1, 4), (1, 4, 2, 3), (1, 4, 2, 4), (2, 3, 1, 3), (2, 3, 1, 4), (2, 3, 2, 3), (2, 3, 2, 4), (2, 4, 1, 3), (2, 4, 1, 4), (2, 4, 2, 3), (2, 4, 2, 4)]
combinations(iterable, r)は、入力 iterable の要素からなる長さ r の部分列を返します (---訳注: 数学の初等組み合わせ論の「組合せ (combination)」 ---):>>> list(itertools.combinations('123', 2)) [('1', '2'), ('1', '3'), ('2', '3')] >>> list(itertools.combinations('123', 3)) [('1', '2', '3')] >>> list(itertools.combinations('1234', 3)) [('1', '2', '3'), ('1', '2', '4'), ('1', '3', '4'), ('2', '3', '4')]
permutations(iter[, r])は入力 iterable の長さ r の順列を返します。 r が指定されなければ、イテラブルが生成する全要素数がデフォルトで使われます (---訳注: 数学の初等組み合わせ論の「順列 (sequence without repetition)」または群論や組合せ論の「置換 (permutation)」。リファレンスでは訳出で置換も順列も両方出てきていますが、高校教育で習う用語で「順列」が伝わりやすいのでここでは「順列」としています。 ---):>>> list(itertools.permutations([1,2,3,4], 2)) [(1, 2), (1, 3), (1, 4), (2, 1), (2, 3), (2, 4), (3, 1), (3, 2), (3, 4), (4, 1), (4, 2), (4, 3)]
itertoolsの既存の関数itertools.chain(*iterables)に、Python 2.6 で新しいコンストラクターが加わりました。itertools.chain.from_iterable(iterable)は、ほかのイテラブルを返す単一のイテラブルを受け取ります。chain()は、最初のイテラブルの全要素、次のイテラブルの全要素という順に返します。>>> list(itertools.chain.from_iterable([[1,2,3], [4,5,6]])) [1, 2, 3, 4, 5, 6]
(All contributed by Raymond Hettinger.)
loggingのFileHandlerと、そのサブクラスWatchedFileHandler、RotatingFileHandler、TimedRotatingFileHandlerのコンストラクターに、省略可能な delay パラメーターが加わりました。 delay が真なら、最初のemit()呼び出しまでログファイルを開く処理を遅らせます。 (Vinay Sajip による貢献です。)TimedRotatingFileHandlerのコンストラクターには utc パラメーターも加わりました。 真なら、午前 0 時の判定やファイル名の生成に UTC を使い、そうでなければローカル時刻を使います。いくつかの新しい関数が
mathモジュールに追加されました:isinf()とisnan()は与えられた浮動小数点数が、順に、(正または負の) 無限大であるかどうか、非数 (NaN=Not a Number) であるかどうかを返します。copysign()は IEEE 754 数の符号ビットをコピーします。 x の絶対値と y の符号ビットを組み合わせたものを返します。例えばmath.copysign(1, -0.0)は -1.0 を返します。 (Contributed by Christian Heimes.)factorial()は階乗を計算します。 (Contributed by Raymond Hettinger; bpo-2138.)fsum()はイテラブルからの数列を、部分和の計算を通じて精度の損失を避けながら積み上げた合計の計算をします。 (Contributed by Jean Brouwers, Raymond Hettinger, and Mark Dickinson; bpo-2819.)log1p()は 1+x の自然対数 (底 e の対数) を返します。trunc()は数をゼロに向かって丸め、引数とゼロの間にある最も近いIntegralを返します。 PEP 3141 の数値型階層 の移植の一部として追加されました。
mathモジュールは、特に浮動小数点例外と IEEE 754 の特殊値の処理において、プラットフォーム間に渡る振る舞いの一貫性をさらに高めるように改善されました。可能な場合にはいつでもこのモジュールは 754 の特殊値について、C99 標準の勧告に従います。例えば、
sqrt(-1.)は今ではほとんど全てのプラットフォームでValueErrorとなるはずで、sqrt(float('NaN'))は全ての IEEE 754 プラットフォームで NaN を返すはずです。C99 標準の付録 'F' で 'divide-by-zero' または 'invalid' を伝えることを勧告している箇所では Python はValueErrorを投げます。C99 標準の付録 'F' で 'overflow' を伝えることを勧告している箇所では Python はOverflowErrorを投げます。 (See bpo-711019 and bpo-1640.)(Contributed by Christian Heimes and Mark Dickinson.)
mmapオブジェクトに、文字列の末尾から逆向きに部分文字列を検索するrfind()メソッドが加わりました。find()にも、検索を終了するインデックスを指定する end パラメーターが加わりました。 (John Lenton による貢献です。)operatorモジュールにmethodcaller()関数が加わりました。 名前と必要に応じて引数群を受け取り、渡された引数に対して指定した名前の関数を呼び出す呼び出し可能オブジェクトを返します。 例えば次のように使います。>>> # lambda s: s.replace('old', 'new') と同じ >>> replacer = operator.methodcaller('replace', 'old', 'new') >>> replacer('old wine in old bottles') 'new wine in new bottles'
(Contributed by Georg Brandl, after a suggestion by Gregory Petrosyan.)
attrgetter()がドットを含む名前を受け付け、対応する属性の検索を行うようになりました。>>> inst_name = operator.attrgetter( ... '__class__.__name__') >>> inst_name('') 'str' >>> inst_name(help) '_Helper'
(Contributed by Georg Brandl, after a suggestion by Barry Warsaw.)
osモジュールがいくつか新しくシステムコールをラップしています。開いたファイルについて、fchmod(fd, mode)はモードを変更し、fchown(fd, uid, gid)は所有権を変更し、lchmod(path, mode)はシンボリックリンクのモードを変更します。 (Contributed by Georg Brandl and Christian Heimes.)chflags()とlchflags()は、対応するシステムコールが利用可能な場合のラッパーで、ファイルのフラグを変更します。 フラグ値の定数はstatにあり、変更禁止を示すUF_IMMUTABLEや、データの追加だけを許すUF_APPENDなどがあります。 (M. Levinson による貢献です。)os.closerange(low, high)は効率よく全ての low から high のファイルデスクリプタをクローズします。全てのエラーは無視されます。それと high はクローズ対象ではないです。この関数は既にsubprocessモジュールがプロセスを開始するのを高速化するために使われています。 (Contributed by Georg Brandl; bpo-1663329.)os.environオブジェクトのclear()は、キーを消去するだけでなく、os.unsetenv()で環境変数自体も削除するようになりました。 (Martin Horcicka による貢献です。bpo-1181。)os.walk()関数にfollowlinksパラメータが追加されています。これを真にすると、シンボリックリンクが指す相手のディレクトリを渡り歩くようになります。後方互換のためにこのパラメータのデフォルトは偽です。なお、親ディレクトリを指すシンボリックリンクなど参照が循環していると、無限再帰に陥りますので注意してください。 (bpo-1273829)os.pathのsplitext()は、先頭のピリオドで分割しないよう変更されました。 これにより Unix のドットファイルでより適切な結果が得られます。 例えばos.path.splitext('.ipython')は、('', '.ipython')ではなく('.ipython', '')を返します。 (bpo-1115886)新規関数
os.path.relpath(path, start='.')は、与えられればstartからの、与えられなければカレントディレクトリからの、目的地pathへの相対パスを返します。 (Contributed by Richard Barran; bpo-1339796.)Windows において、
os.path.expandvars()が "%var%" 形式の記述に環境変数を展開し、 "~user" にユーザのホームディレクトリのパスを展開するようになりました。 (Contributed by Josiah Carlson; bpo-957650.) (---訳注: "~user" は実在した仕様かわかりません。2.7 に該当する実装もコメントも docstring もリファレンスもありませんし、当然この振る舞いは現在実在していません。---)pdbモジュールで提供される Python デバッガに新たなコマンドが追加されました: "run" はデバッグ対象の Python プログラムを再起動します。またオプションとして、対象プログラムに与えるコマンドライン引数を渡せます。 (Contributed by Rocky Bernstein; bpo-1393667.)トレースバックのデバッグを開始するのに使われる
pdb.post_mortem()が、トレースバックが与えられない場合にsys.exc_info()からの戻り値のトレースバックを使うようになりました。 (Contributed by Facundo Batista; bpo-1106316.)pickletoolsにoptimize()関数が加わりました。 pickle を含む文字列を受け取り、不要なオペコードを取り除き、同じデータ構造を表すより短い pickle を返します。 (Raymond Hettinger による貢献です。)pkgutilにget_data()関数が加わり、インストール済みの Python パッケージに含まれるリソースファイルの内容を返します。 例えば次のようになります。>>> import pkgutil >>> print pkgutil.get_data('test', 'exception_hierarchy.txt') BaseException +-- SystemExit +-- KeyboardInterrupt +-- GeneratorExit +-- Exception +-- StopIteration +-- StandardError ...
(Contributed by Paul Moore; bpo-2439.)
pyexpatのParserオブジェクトでbuffer_sizeを設定し、文字データを保持するバッファの大きさを変更できるようになりました。 (Achim Gaedke による貢献です。bpo-1137。)queueに、要素を異なる順序で取り出すキューが加わりました。PriorityQueueは要素をヒープに格納して優先度順に取り出し、LifoQueueは最後に追加した要素を最初に取り出すので、スタックとして振る舞います。 (Raymond Hettinger による貢献です。)randomのRandomオブジェクトを 32 ビットシステムで pickle 化し、64 ビットシステムで復元できるようになりました。 その逆も可能です。 残念ながら、この変更によって Python 2.6 のRandomオブジェクトを以前の Python で正しく復元できなくなりました。 (Shawn Ligocki による貢献です。bpo-1727780。)新たな
triangular(low, high, mode)は、三角分布 (triangular distribution) に従う乱数を生成します。 mode は分布内の最頻値で、返却値は high を含まない low と high の間です。 (Contributed by Wladmir van der Laan and Raymond Hettinger; bpo-1681432.)reモジュールによって実行される長い正規表現検索が届けられるシグナルをチェックするようになり、これにより多大な時間を要する検索を中断出来るようになります。 (Contributed by Josh Hoyt and Ralf Schmitt; bpo-846388.) (---訳注: 原文を忠実に訳すとわかりにくいですが、単に C のレベルでシグナルハンドラを仕掛けたので Python が割り込める、というのがここで言っていることです。本質的には「長い」や「時間のかかる」はあまり関係ないです。---)正規表現モジュールは、小さな正規表現固有仮想マシン用のバイトコードをコンパイルすることで実装されています。信頼出来ないコードにより、悪意あるバイトコード文字列を直接作って破滅させることが出来ます。ですので、2.6 では正規表現バイトコードの検証をするようにしてあります。(Contributed by Guido van Rossum from work for Google App Engine; bpo-3487.)
rlcompleterのcomplete()メソッドは、名前の評価中に発生した例外を無視するようになりました。 (Lorenz Quack が修正しました。bpo-2250。)schedのschedulerインスタンスに、読み出し専用のqueue属性が加わりました。 スケジューラーのキューの内容を、(time, priority, action, argument)フィールドを持つ名前付きタプルのリストとして返します。 (Raymond Hettinger による貢献です。bpo-1861。)selectに、Linux のepoll()と BSD のkqueue()システムコールのラッパー関数が加わりました。 既存のpollオブジェクトにはmodify()メソッドが追加されました。pollobj.modify(fd, eventmask)は、ファイル記述子またはファイルオブジェクトとイベントマスクを受け取り、そのファイルについて記録したイベントマスクを変更します。 (Christian Heimes による貢献です。bpo-1657。)shutil.copytree()が省略可能引数 ignore を取るようになっています。呼び出し可能オブジェクトを渡します。この呼び出し可能オブジェクトはそれぞれのディレクトリパスとその内容リストを受け取って、コピーせずに無視したい名前のリストを返します。shutilは、この新しいパラメーターで使うためのignore_patterns()関数も提供します。ignore_patterns()は任意の数の glob 形式のパターンを受け取り、いずれかに一致するファイルやディレクトリを無視する呼び出し可能オブジェクトを返します。 次の例はディレクトリツリーをコピーしますが、.svnディレクトリと、名前が '~' で終わる Emacs のバックアップファイルをスキップします。shutil.copytree('Doc/library', '/tmp/library', ignore=shutil.ignore_patterns('*~', '.svn'))
(Contributed by Tarek Ziadé; bpo-2663.)
Tkinter や GTK+ などのような場所で、シグナルハンドリングと GUI 処理のイベントループを組み合わせることは、長い間悩みの種でした; ほとんどのソフトウェアはポーリングを行って、わずかばかりの時間で起き上がっては GUI イベントが起きていないかチェックするハメになっています。
signalモジュールが、これをより効率的に行えるようにしました。signal.set_wakeup_fd(fd)でファイルデスクリプタをセットすると、イベント受信時にファイルデスクリプタにバイトが書き込まれます。 C レベルの関数PySignal_SetWakeupFd()もあります。同じくファイルデスクリプタを渡します。イベントループは、パイプを開いて読み取り用と書き込み用の 2 つの記述子を作ることで、この機能を使います。 書き込み側を
set_wakeup_fd()に渡し、読み取り側をselect()やpoll()で監視する記述子のリストに加えます。 シグナルを受信すると 1 バイトが書き込まれ、メインのイベントループが起こされるため、定期的な確認が不要になります。(Contributed by Adam Olsen; bpo-1583.)
siginterrupt()が Python コードから使えるようになり、シグナルがシステムコールを中断できるかどうかを変更できます。 (Ralf Schmitt による貢献です。)利用可能な環境では、
setitimer()とgetitimer()も追加されました。setitimer()は、経過時間、プロセスが消費した時間、またはプロセスとシステムの合計時間で測った指定時間の後に、プロセスへシグナルを送るインターバルタイマーを設定できます。 (Guilherme Polo による貢献です。bpo-2240。)smtplibにSMTP_SSLが追加され、SSL 上の SMTP に対応しました。 インターフェースは既存のSMTPと同一です。 (Monty Taylor による貢献です。) 両クラスのコンストラクターには、最初の接続試行のタイムアウトを秒単位で指定する省略可能なtimeoutも加わりました。 (Facundo Batista による貢献です。)LMTP プロトコル (RFC 2033) 実装もモジュールに追加されています。LMTP はメールキューを管理しないエージェント間で e-mail を転送する際に、SMTP の代わりに使われます。(LMTP implemented by Leif Hedstrom; bpo-957003.)
smtplib.SMTP.starttls()が RFC 3207 に準拠し、TLS のネゴシエーション自体から得たものを除き、サーバーから得た情報をすべて破棄するようになりました。 (Bill Fenner によるパッチです。bpo-829951。)socketが、クラスター環境向けに設計された、IP を使わない高性能プロトコル TIPC (https://tipc.sourceforge.net/) に対応しました。 TIPC アドレスは 4 要素または 5 要素のタプルです。 (Alberto Bertogli による貢献です。bpo-1646。)新しい
create_connection()はアドレスを受け取り、必要に応じてタイムアウトを指定して接続し、接続済みのソケットオブジェクトを返します。 アドレスの種類も調べ、適切な IPv4 または IPv6 で接続します。socket(socket.AF_INET, ...)の代わりにcreate_connection()を使うだけで、IPv6 に対応できる場合もあります。SocketServerの基底クラスは、サーバーのtimeoutが指定する時間だけ活動がないと、handle_timeout()を呼ぶようになりました。 (Michael Pomraning による貢献です。)serve_forever()には秒単位のポーリング間隔を指定する省略可能な引数が加わり、終了要求を確認する頻度を制御できます。 (Pedro Werneck と Jeffrey Yasskin による貢献です。bpo-742598、bpo-1193577。)Gerhard Häring により保守されている
sqlite3モジュールが、Python 2.5 時のバージョン 2.3.2 からバージョン 2.4.1 に更新されました。structが、書式文字'?'で C99 の _Bool 型に対応しました。 (David Remahl による貢献です。)subprocessのPopenに、terminate()、kill()、send_signal()メソッドが加わりました。 Windows のsend_signal()が対応するシグナルはSIGTERMだけで、これらはすべて Win32 API のTerminateProcess()に相当します。 (Christian Heimes による貢献です。)sysの新しい変数float_infoは、float.hから得たプラットフォームの浮動小数点数情報を持つオブジェクトです。 属性にはmant_dig(仮数の桁数)、epsilon(1.0 とそれより大きい次の表現可能な値との差) などがあります。 (Christian Heimes による貢献です。bpo-1534。)もう一つの新しい変数
dont_write_bytecodeは、モジュールのインポート時に.pycや.pyoを書き込むかどうかを制御します。 真ならコンパイル済みファイルは書き込まれません。 起動時の値は、インタープリタに-Bを渡すか、起動前に環境変数PYTHONDONTWRITEBYTECODEを設定することで決まります。 その後も Python コードで変数の値を変えて、バイトコードファイルを書き込むかどうかを制御できます。 (Neal Norwitz と Georg Brandl による貢献です。)Python インタープリタに渡したコマンドライン引数の情報は、
sys.flagsという名前付きタプルの属性から取得できます。 例えば詳細表示モードで起動した場合はverbose、デバッグモードならdebugが真になります。 これらの属性はすべて読み出し専用です。 (Christian Heimes による貢献です。)新しい
getsizeof()は Python オブジェクトを受け取り、そのオブジェクトのメモリ使用量をバイト単位で返します。 組み込みオブジェクトでは正しい結果が得られます。 サードパーティーの拡張ではそうとは限りませんが、__sizeof__()メソッドを定義してサイズを返せます。 (Robert Schuppenies による貢献です。bpo-2898。)現在動作中のプロファイラとトレーサーを、
sys.getprofile()とsys.gettrace()で知ることが出来るようになりました。 (Contributed by Georg Brandl; bpo-1648.)tarfileモジュールが、既にサポートされている POSIX.1-1988 (ustar) と GNU tar フォーマットに加えて、POSIX.1-2001 (pax) をサポートするようになりました。デフォルトは GNU tar です; これと違うフォーマットでファイルを開くにはformatパラメータで指定します:tar = tarfile.open("output.tar", "w", format=tarfile.PAX_FORMAT)
新しい
encodingとerrorsパラメータはエンコーディングと文字変換のエラー処理方法を指定します。'strict','ignore','replace'は Python の 3 つの標準エラー処理です;'utf-8'は特殊で、不正な文字を、それの UTF-8 表現に置き換えます。(文字変換は、PAX フォーマットが Unicode ファイル名をサポートするために現れ、デフォルトは UTF-8 エンコーディングです。)tarfile.TarFile.add()に、特定のファイル名をアーカイブから除外する関数を渡すexclude引数が加わりました。 この関数はファイル名を受け取り、除外するなら真、アーカイブするなら偽を返す必要があります。 最初にadd()に渡した名前と、再帰的に追加するディレクトリ内のファイル名の両方に適用されます。(All changes contributed by Lars Gustäbel).
telnetlib.Telnetのコンストラクターに、秒単位のタイムアウトを指定する省略可能なtimeoutが加わりました。 (Facundo Batista が追加しました。)tempfile.NamedTemporaryFileクラスは普通はこれが作った一時ファイルを、ファイルクローズ時に削除します。この振る舞いを、コンストラクタのパラメータにdelete=Falseを渡すことで変更出来るようになりました。 (Contributed by Damien Miller; bpo-1537850.)新しい
SpooledTemporaryFileは一時ファイルとして振る舞いますが、最大サイズを超えるまでデータをメモリに保持します。 その制限に達すると、内容をディスク上の一時ファイルへ書き込みます。 (Dustin J. Mitchell による貢献です。)NamedTemporaryFileとSpooledTemporaryFileがコンテキストマネージャーとして動作するようになり、with tempfile.NamedTemporaryFile() as tmp: ...と書けます。 (Alexander Belopolsky による貢献です。bpo-2021。)test.test_supportに、テストに便利なコンテキストマネージャーが加わりました。EnvironmentVarGuard()は、環境変数を一時的に変更し、自動的に元へ戻すコンテキストマネージャーです。もう一つのコンテキストマネージャー
TransientResourceは、利用できるかどうかが不確かなリソースへの呼び出しを囲み、指定した例外を捕捉して無視します。 例えばネットワークのテストでは、外部の Web サイトへの接続で起きる一部の失敗を無視できます。with test_support.TransientResource(IOError, errno=errno.ETIMEDOUT): f = urllib.urlopen('https://sf.net') ...
最後に、
check_warnings()はwarningsの警告フィルターをリセットし、発生したすべての警告メッセージを記録するオブジェクトを返します (bpo-3781)。with test_support.check_warnings() as wrec: warnings.simplefilter("always") # ... 警告を発生させるコード ... assert str(wrec.message) == "function is outdated" assert len(wrec.warnings) == 1, "Multiple warnings raised"
(Contributed by Brett Cannon.)
textwrapにdrop_whitespace=Falseを渡すと、新しく作る行の先頭と末尾にある既存の空白を保持できるようになりました。>>> S = """This sentence has a bunch of ... extra whitespace.""" >>> print textwrap.fill(S, width=15) This sentence has a bunch of extra whitespace. >>> print textwrap.fill(S, drop_whitespace=False, width=15) This sentence has a bunch of extra whitespace. >>>
(Contributed by Dwayne Bailey; bpo-1581073.)
threadingの API が、setDaemon()やisDaemon()の代わりにdaemonなどのプロパティを使う形に変わりつつあります。 一部のメソッド名もキャメルケースからアンダースコア区切りへ変わり、例えばactiveCount()はactive_count()に改名されました。 2.6 と 3.0 の両方が同じプロパティと新しい名前に対応し、古いメソッドも残しています。 Python 3.x で古い API を非推奨にする時期は未定で、2.x では削除されません。 (複数の人、特に Benjamin Peterson が作業しました。)threadingのThreadに、ゼロでない整数のスレッド識別子を返すidentプロパティが加わりました。 (Gregory P. Smith による貢献です。bpo-2871。)The
timeitmodule now accepts callables as well as strings for the statement being timed and for the setup code. Two convenience functions were added for creatingTimerinstances:repeat(stmt, setup, timer, repeat, number)andtimeit(stmt, setup, timer, number)create an instance and call the corresponding method. (Contributed by Erik Demaine; bpo-1533909.)tkinterがオプションにリストやタプルを受け付け、要素をスペースで区切って Tcl/Tk へ渡すようになりました。 (Guilherme Polo による貢献です。bpo-2906。)タートルグラフィックスのための
turtleモジュールが Gregor Lingl により大幅に拡張されました。 モジュールの新しい機能は次の通りです:亀の移動と回転のアニメーションの改善。
亀に新しい姿を設定できたり、新しい座標系を定義できるようになりました。
タートルに、操作を元に戻せる
undo()メソッドが加わりました。マウスやキーボードからの入力イベントに反応するための簡易なサポートが入り、簡単なゲームを書けるようになりました。
turtle.cfgを使って、turtle の画面の起動時の見た目をカスタマイズできるようになりました。モジュールの docstring が、他の言語に翻訳された docstring に置き換えられるようになりました。
urllib.urlopenとurllib2.urlopen、およびurllib.ftpwrapperのコンストラクターに、省略可能なtimeoutが加わりました。 タイムアウトを秒単位で指定します。 例えば次のように使います。>>> u = urllib2.urlopen("http://slow.example.com", ... timeout=3) Traceback (most recent call last): ... urllib2.URLError: <urlopen error timed out> >>>
(Added by Facundo Batista.)
unicodedataモジュールで提供される Unicode データベースが、バージョン 5.1.0 に更新されました。 (Updated by Martin von Löwis; bpo-3811.)warningsのformatwarning()とshowwarning()に、ソースコードの行を渡す省略可能な line 引数が加わりました。 (warningsの一部を C で実装し直す bpo-1631171 の一環として追加されました。)新しい
catch_warnings()はテスト向けのコンテキストマネージャーで、警告フィルターを一時的に変更し、元の値に戻せます (bpo-3781)。The XML-RPC
SimpleXMLRPCServerandDocXMLRPCServerclasses can now be prevented from immediately opening and binding to their socket by passingFalseas the bind_and_activate constructor parameter. This can be used to modify the instance'sallow_reuse_addressattribute before calling theserver_bind()andserver_activate()methods to open the socket and begin listening for connections. (Contributed by Peter Parente; bpo-1599845.)SimpleXMLRPCServeralso has a_send_traceback_headerattribute; if true, the exception and formatted traceback are returned as HTTP headers "X-Exception" and "X-Traceback". This feature is for debugging purposes only and should not be used on production servers because the tracebacks might reveal passwords or other sensitive information. (Contributed by Alan McIntyre as part of his project for Google's Summer of Code 2007.)xmlrpclibは、datetime.dateとdatetime.timeをxmlrpclib.DateTimeに自動変換しなくなりました。 その変換の意味が、すべてのアプリケーションで正しいとは限らなかったためです。xmlrpclibを使うコードでは、dateとtimeのインスタンスを変換してください (bpo-1330538)。 また、1900 年より前の日付 (Ralf Schmitt による貢献、bpo-2014) や、XML-RPC 応答の<i8>で表した 64 ビット整数 (Riku Lindblad による貢献、bpo-2985) も扱えるようになりました。zipfileのZipFileにextract()とextractall()が加わりました。 単一のファイルまたはアーカイブの全ファイルを、現在のディレクトリか指定したディレクトリへ展開します。z = zipfile.ZipFile('python-251.zip') # 単一のファイルを /tmp ディレクトリからの # 相対パスへ展開する。 z.extract('Python/sysmodule.c', '/tmp') # アーカイブのすべてのファイルを展開する。 z.extractall()
(Contributed by Alan McIntyre; bpo-467924.)
open()、read()、extract()が、ファイル名だけでなくZipInfoオブジェクトも受け付けるようになりました。 アーカイブに誤って同じファイル名が複数入っている場合に便利です。 (Graham Horler による貢献です。bpo-1775025。)最後に、
zipfileがアーカイブするファイルのファイル名として Unicode の使用をサポートするようになりました。 (Contributed by Alexey Borzenkov; bpo-1734346.) (---訳注: リファレンスに注意事項として書かれていますが、zip ファイルのファイル名標準は存在しないのでこれは問題を起こすことがあります。---)
ast モジュール¶
ast モジュールは Python コードの抽象構文木 (Abstract Syntax Tree) 表現を提供します。また、Armin Ronacher は共通タスクを実行するさまざまなヘルパー関数を寄稿しました。これらは HTML テンプレートパッケージであるとか、コードアナライザ、などなどの、Python コードを処理するツールで有用となるでしょう。
parse() は式を受け取り、AST を返します。
dump() は、デバッグに適した木の表現を出力します。
import ast
t = ast.parse("""
d = {}
for i in 'abcdefghijklm':
d[i + i] = ord(i) - ord('a') + 1
print d
""")
print ast.dump(t)
これの出力は深くネストされたツリーです:
Module(body=[
Assign(targets=[
Name(id='d', ctx=Store())
], value=Dict(keys=[], values=[]))
For(target=Name(id='i', ctx=Store()),
iter=Str(s='abcdefghijklm'), body=[
Assign(targets=[
Subscript(value=
Name(id='d', ctx=Load()),
slice=
Index(value=
BinOp(left=Name(id='i', ctx=Load()), op=Add(),
right=Name(id='i', ctx=Load()))), ctx=Store())
], value=
BinOp(left=
BinOp(left=
Call(func=
Name(id='ord', ctx=Load()), args=[
Name(id='i', ctx=Load())
], keywords=[], starargs=None, kwargs=None),
op=Sub(), right=Call(func=
Name(id='ord', ctx=Load()), args=[
Str(s='a')
], keywords=[], starargs=None, kwargs=None)),
op=Add(), right=Num(n=1)))
], orelse=[])
Print(dest=None, values=[
Name(id='d', ctx=Load())
], nl=True)
])
literal_eval() は、リテラル式を表す文字列または AST を解析・評価し、その値を返します。
リテラル式とは、文字列、数値、辞書などだけを含み、文や関数呼び出しを含まない Python の式です。
式を評価する必要があっても eval() の呼び出しに伴うセキュリティ上のリスクを許容できない場合は、literal_eval() で安全に扱えます。
>>> literal = '("a", "b", {2:4, 3:8, 1:2})'
>>> print ast.literal_eval(literal)
('a', 'b', {1: 2, 2: 4, 3: 8})
>>> print ast.literal_eval('"a" + "b"')
Traceback (most recent call last):
...
ValueError: malformed string
このモジュールには、AST の走査や変更を行う NodeVisitor と NodeTransformer、行番号の変更などの一般的な変換を行う関数もあります。
future_builtins モジュール¶
Python 3.0 では組み込み関数の構成が大幅に変わりますが、その多くは互換性を壊すため Python 2.x には導入できません。
future_builtins は、3.0 と互換性のあるコードを書く際にインポートして使える、これらの組み込み関数の版を提供します。
このモジュールに今のところ含まれるのは:
ascii(obj): 2.x のrepr()と同じことをします。Python 3.0 ではrepr()は Unicode 文字列を返すようになっていて、一方ascii()は純粋な ASCII バイト文字列を返します。filter(predicate, iterable),map(func, iterable1, ...): 3.0 と同じようにイテレータを返し、これは 2.x のビルトインがリストで返すのとは違っています。hex(value)、oct(value):__hex__()や__oct__()の代わりに__index__()を呼び出し、その結果を十六進数または八進数に変換します。oct()の結果は、新しい0o表記を使います。
json モジュール: JavaScript オブジェクト記法¶
新しい json モジュールは、JSON (Javascript Object Notation) と Python 型のエンコーディング、デコーディングをサポートします。JSON は軽量なデータ交換フォーマットで、頻繁にウェブアプリケーションで使われます。JSON の詳細情報は http://www.json.org にあります。
json モジュールはほとんどのビルトイン型のデコーディングとエンコーディングサポートを備えています。以下の例は辞書のエンコードとデコードをしています:
>>> import json
>>> data = {"spam": "foo", "parrot": 42}
>>> in_json = json.dumps(data) # データをエンコード
>>> in_json
'{"parrot": 42, "spam": "foo"}'
>>> json.loads(in_json) # Python オブジェクトへデコード
{"spam": "foo", "parrot": 42}
ほかの何か型をサポートするのに独自のエンコーダ、デコーダを書くことも出来ます。JSON 文字列の pretty-printing もサポートされています。
json (もともと simplejson と呼ばれていました) は Bob Ippolito によって書かれました。
plistlib モジュール: プロパティリストパーサ¶
.plist フォーマットは Mac OS X で一般的に使われ、基本的なデータ型(数値、文字列、リスト、辞書)を XML ベースのフォーマットにシリアライズして格納します。データ型の XML-RPC シリアライズに似ています。
Mac OS X で主に使われるとはいえ、そのフォーマットはまったく Mac 固有ではなくその Python 実装は Python がサポートするあらゆるプラットフォームで動作するので、plistlib は標準ライブラリに昇格しました。
モジュールを使うのは単純です:
import sys
import plistlib
import datetime as dt
# データ構造を作る
data_struct = dict(lastAccessed=dt.datetime.now(),
version=1,
categories=('Personal','Shared','Private'))
# XML を含む文字列を作る。
plist_str = plistlib.writePlistToString(data_struct)
new_struct = plistlib.readPlistFromString(plist_str)
print data_struct
print new_struct
# データ構造をファイルへ書き出し、読み戻す。
plistlib.writePlist(data_struct, '/tmp/customizations.plist')
new_struct = plistlib.readPlist('/tmp/customizations.plist')
# read/writePlist はパスだけでなくファイル風オブジェクトも受け付ける。
plistlib.writePlist(data_struct, sys.stdout)
ctypes の強化¶
Thomas Heller は ctypes モジュールの保守と拡張を続けました。
ctypes が、C99 の bool 型を表す c_bool データ型に対応しました。
(David Remahl による貢献です。bpo-1649190。)
ctypes の string, buffer, array 型が拡張スライスインデクス構文をサポートするように改善され、 (start, stop, step) の色々な組み合わせが使えます。 (Implemented by Thomas Wouters.)
ctypes のすべてのデータ型に、渡されたバッファオブジェクトから ctypes インスタンスを作る from_buffer() と from_buffer_copy() が加わりました。
from_buffer_copy() は内容をコピーし、from_buffer() は同じメモリ領域を共有します。
新しい呼び出しの慣例は、 ctypes にそれぞれのラップされた呼び出しの発生時に errno あるいは Win32 LastError 変数をクリアすることを伝えることです。 (Implemented by Thomas Heller; bpo-1798.)
You can now retrieve the Unix errno variable after a function
call. When creating a wrapped function, you can supply
use_errno=True as a keyword parameter to the DLL function
and then call the module-level methods set_errno() and
get_errno() to set and retrieve the error value.
The Win32 LastError variable is similarly supported by
the DLL, OleDLL(), and WinDLL() functions.
You supply use_last_error=True as a keyword parameter
and then call the module-level methods set_last_error()
and get_last_error().
ctypes インスタンスへのポインターを取得する byref() に、省略可能な offset が加わりました。
返すポインターに加えるバイト数を指定します。
SSL サポートの改善¶
Bill Janssen は Python 2.6 の Secure Sockets Layer サポートを大掛かりに改善しました。行われたのは新モジュール ssl の追加です。これは OpenSSL ライブラリの上に構築されています。この新しいモジュールはプロトコルのネゴシエイトのさらなる制御、X.509 証明書の使用、そして SSL サーバ (クライアントの対語としての) を Python で書くためのより良いサポートを提供しています。既存の socket モジュールにある SSL サポートは削除されずにそのまま使えますが、Python 3.0 では削除されます。
この新しいモジュールを使うには、まず通常の方法で TCP 接続を作り、ssl.wrap_socket() に渡します。
証明書が必要かどうかを指定でき、getpeercert() で証明書情報を取得できます。
参考
ssl モジュールについてのドキュメント。
非推奨と削除¶
文字列を例外として送出することは出来なくなりました。これをすると
TypeErrorを起こします。PEP 352 に従った
Exceptionのインターフェースの変更が続いています。 2.6 ではmessageが非推奨となり、代わりにargsを使います。(3.0 警告モード) Python 3.0 はたくさんの時代遅れのモジュールを削除し、ほかのものも名前変更するような標準ライブラリの再編成が特色となります。Python 2.6 を 3.0 警告モードで動かすと、それらがインポートされる際に警告が励起されます。
非推奨となるモジュールは次のとおりです:
audiodev,bgenlocations,buildtools,bundlebuilder,Canvas,compiler,dircache,dl,fpformat,gensuitemodule,ihooks,imageop,imgfile,linuxaudiodev,mhlib,mimetools,multifile,new,pure,statvfs,sunaudiodev,test.testall, とtoaiff.gopherlibモジュールが削除されました。MimeWriterとmimifyが非推奨となりました。 代わりにemailを使ってください。md5が非推奨となりました。 代わりにhashlibを使ってください。posixfileが非推奨となりました。fcntl.lockf()がより適切なロックを提供します。popen2が非推奨となりました。subprocessを使ってください。rgbimgモジュールが削除されました。shaが非推奨となりました。 代わりにhashlibを使ってください。
ビルドならびに C API の変更¶
Python のビルド過程と C API の変更は以下の通りです:
Python のコンパイルには C89 コンパイラーが必須になりました (19 年を経て、ようやくです!)。 そのため、C89 標準ライブラリに含まれる
memmove()とstrerror()の独自実装が Python のソースツリーから削除されました。Python 2.6 は Microsoft Visual Studio 2008 (version 9.0) でビルド出来ます。そしてこれが新しいデフォルトコンパイラです。
PCbuildディレクトリのビルドファイルを参照して下さい。 (Implemented by Christian Heimes.)Mac OS X では、Python 2.6 は 4 種類のユニバーサルビルドでコンパイル出来ます。 configure スクリプトは
--with-universal-archs=[32-bit|64-bit|all]スイッチを取って、32-bit アーキテクチャ (x86, PowerPC), 64-bit (x86-64 and PPC-64), あるいは両方のバイナリをビルド出来ます。 (Contributed by Ronald Oussoren.)Python 2.6.6 で追加された
PySys_SetArgvEx()はsys.argvを設定し、updatepath の値に応じて、sys.argv[0]が示すスクリプトのディレクトリをsys.pathに追加することもできます。この関数は、Python を組み込むアプリケーションのセキュリティホールを塞ぐために追加されました。 従来の
PySys_SetArgv()は常にsys.pathを更新し、現在のディレクトリを追加する場合がありました。 そのため、他人が管理するディレクトリで Python を組み込んだアプリケーションを実行すると、攻撃者がそこへトロイの木馬のようなモジュール (例えばos.py) を置き、アプリケーションにインポート・実行させることができました。Python を組み込む C/C++ アプリケーションの保守担当者は、
PySys_SetArgv()を呼んでいるか確認し、updatepath を偽にしたPySys_SetArgvEx()を使うべきか慎重に検討してください。 ただし、この関数を使うと Python 2.6.5 以前との互換性がなくなります。 以前のバージョンにも対応する必要があれば、PySys_SetArgv()はそのままにし、その後PyRun_SimpleString("sys.path.pop(0)\n")を呼んでsys.pathの先頭要素を取り除けます。このセキュリティ問題は CVE 2008-5983 として報告され、gh-50003 で議論され、Antoine Pitrou が修正しました。
BerkeleyDB モジュールの C API オブジェクトが
bsddb.db.apiとして利用できるようになりました。bsddbを独自の用途で使いたいほかの C 拡張から利用できます。 (Duncan Grisby による貢献です。)PEP 3118 改訂版バッファプロトコル で前述の新しいバッファインターフェイスのために、
PyObject_GetBuffer()とPyBuffer_Release()とほか少しの関数が追加されました。Python の C stdio ライブラリの使用が、スレッドセーフになりました。 少なくとも、基盤となるライブラリと同程度にはスレッドセーフです。 これまでは、一つのスレッドがファイルオブジェクトを閉じる間に別のスレッドが読み書きすると起きる潜在的なバグが、長く残っていました。 2.6 のファイルオブジェクトには、
PyFile_IncUseCount()とPyFile_DecUseCount()で操作する参照カウントがあり、ゼロでなければ閉じられません。FILE *で I/O を行う前、まだ GIL を保持している間にPyFile_IncUseCount()を呼び、GIL を再取得した直後にPyFile_DecUseCount()を呼ぶ必要があります。 (Antoine Pitrou と Gregory P. Smith による貢献です。)Importing modules simultaneously in two different threads no longer deadlocks; it will now raise an
ImportError. A new API function,PyImport_ImportModuleNoBlock(), will look for a module insys.modulesfirst, then try to import it after acquiring an import lock. If the import lock is held by another thread, anImportErroris raised. (Contributed by Christian Heimes.)Several functions return information about the platform's floating-point support.
PyFloat_GetMax()returns the maximum representable floating-point value, andPyFloat_GetMin()returns the minimum positive value.PyFloat_GetInfo()returns an object containing more information from thefloat.hfile, such as"mant_dig"(number of digits in the mantissa),"epsilon"(smallest difference between 1.0 and the next largest value representable), and several others. (Contributed by Christian Heimes; bpo-1534.)PyComplex_AsCComplex()を使う C の関数やメソッドが、__complex__()を持つ引数を受け付けるようになりました。 特にcmathの関数が、このメソッドを持つオブジェクトを受け付けます。 Python 3.0 の変更を移植したものです。 (Mark Dickinson による貢献です。bpo-1675423。)Python C API に 2 つの大文字小文字を区別しない文字列比較関数
PyOS_stricmp(char*, char*)とPyOS_strnicmp(char*, char*, Py_ssize_t)が追加されました。 (Contributed by Christian Heimes; bpo-1635.)多くの C 拡張が、
init*関数内でモジュール辞書に整数と文字列定数を追加するために独自の小さなマクロを定義しています。 Python 2.6 ではついにモジュールに値を追加する標準マクロを定義しました。PyModule_AddStringMacroとPyModule_AddIntMacro()です。 (Contributed by Christian Heimes.)関数ではなくマクロであることを明確にするため、3.0 と 2.6 の両方でいくつかのマクロが改名されました。
Py_Size()はPy_SIZE()、Py_Type()はPy_TYPE()、Py_Refcnt()はPy_REFCNT()になりました。 Python 2.6 では後方互換性のため、大小文字が混在する旧名も使えます。 (bpo-1629)Distutils は C 拡張を、デバッグバージョンの Python 実行時に別のディレクトリにビルドするようになりました。 (Contributed by Collin Winter; bpo-1530959.)
いくつかの基本データ型、例えば数値や文字列型は、あとで再利用されるオブジェクトのフリーリスト(---訳注: メモリ管理での alloc/free の free。---)を内部的に管理しています。それらデータ構造はこのフリーリストに関して、命名規約に従うようにしました; その変数名は常に
free_list、カウンタは常にnumfree、そしてマクロPy<typename>_MAXFREELISTが必ず定義されます。新たに追加された Makefile のターゲット "make patchcheck" は、Python ソースツリーに対してパッチを作る準備をします: 修正された
.pyファイル全てに含まれる末尾の余分な空白を取り除き、ドキュメンテーションが変更されているかをチェックし、そしてMisc/ACKSとMisc/NEWSが更新されているかどうかを報告します。 (Contributed by Brett Cannon.)もう一つの新しいターゲット "make profile-opt" は、GCC の profile-guided 最適化を使った Python バイナリをビルドします。これは Python をプロファイリングを有効にしてビルドし、プロファイル結果のセットを得るためのテストスイートを実施し、そして最適化のためにそれら結果を使ってビルドします。 (Contributed by Gregory P. Smith.)
ポート特有の変更: Windows¶
Windows 95, 98, ME, NT4 のサポートはとりやめられました。 Python 2.6 は最低でも Windows 2000 SP4 が必要です。
Windows での新しいデフォルトコンパイラが Visual Studio 2008 (version 9.0) になっています。Visual Studio 2003 (version 7.1) と 2005 (version 8.0) のビルドディレクトリは PC/ に移動しました。新しい
PCbuildディレクトリは X64, デバッグビルド、Profile Guided Optimization (PGO) をサポートしています。PGO ビルドは通常ビルドに較べておよそ 10% 高速化になります。 (Contributed by Christian Heimes with help from Amaury Forgeot d'Arc and Martin von Löwis.)msvcrtが、コンソール I/O API の通常版とワイド文字版の両方に対応しました。getwch()とgetwche()はキー入力を読んで Unicode 値を返し、putwch()は Unicode 文字を受け取ってコンソールへ書き込みます。 (Christian Heimes による貢献です。)os.path.expandvars()は "%var%" 形式を環境変数で置換し、 "~user" をユーザのホームディレクトリパスに置換します(---訳注: 上のほうの訳注参照。---)。 (Contributed by Josiah Carlson; bpo-957650.)socketのソケットオブジェクトに、WSAIoctl()システムインターフェースの限定的な機能を提供するioctl()が加わりました。_winregにExpandEnvironmentStrings()が加わり、入力文字列の%NAME%などの環境変数参照を展開できます。 このモジュールのハンドルオブジェクトはコンテキストプロトコルにも対応し、with文で使えます。 (Christian Heimes による貢献です。)_winregの x64 対応も改善され、DisableReflectionKey()、EnableReflectionKey()、QueryReflectionKey()が公開されました。 64 ビット環境で動く 32 ビットプロセスのレジストリリフレクションを有効・無効にするための関数です。 (bpo-1753245)msilibのRecordに、フィールド値を整数や文字列で返すGetInteger()とGetString()が加わりました。 (Floris Bruynooghe による貢献です。bpo-2125。)
ポート特有の変更: Mac OS X¶
Python をフレームワークビルドでコンパイルする際に、 configure スクリプトに
--with-framework-nameオプションでフレームワーク名を指定出来るようになりました。macfsが削除されました。 それに伴い、macfsに依存していたmacostools.touched()も削除されました。 (bpo-1490190)そのほか、多数の Mac OS 用モジュールが非推奨となり、Python 3.0 で削除されます:
_builtinSuites,aepack,aetools,aetypes,applesingle,appletrawmain,appletrunner,argvemulator,Audio_mac,autoGIL,Carbon,cfmfile,CodeWarrior,ColorPicker,EasyDialogs,Explorer,Finder,FrameWork,findertools,ic,icglue,icopen,macerrors,MacOS,macfs,macostools,macresource,MiniAEFrame,Nav,Netscape,OSATerminology,pimp,PixMapWrapper,StdSuites,SystemEvents,Terminal, とterminalcommand.
ポート特有の変更: IRIX¶
多数の古い IRIX 専用モジュールが非推奨となり、Python 3.0 で削除されます: al と AL, cd, cddb, cdplayer, CL と cl, DEVICE, ERRNO, FILE, FL と fl, flp, fm, GET, GLWS, GL と gl, IN, IOCTL, jpeg, panelparser, readcd, SV と sv, torgb, videoreader, と WAIT.
Python 2.6 への移植¶
このセクションでは前述の変更とバグフィックスにより必要となるかもしれないコードの変更を列挙します:
ハッシュ化をサポートしないクラスはその定義内でその事実を示すために、
__hash__ = Noneをセットすべきです。文字列を例外として送出することは出来なくなりました。これをすると
TypeErrorを起こします。collections.dequeの__init__()が、イテラブルの要素を追加する前に既存の内容を消去するようになりました。 これによりlist.__init__()と同じ動作になります。object.__init__()は以前、任意の引数やキーワード引数を受け付けて無視していました。 Python 2.6 ではこれが認められず、TypeErrorになります。super()などを通して最終的にobjectの対応するメソッドを呼ぶ__init__()は影響を受けます。 議論は bpo-1683368 を参照してください。The
Decimalconstructor now accepts leading and trailing whitespace when passed a string. Previously it would raise anInvalidOperationexception. On the other hand, thecreate_decimal()method ofContextobjects now explicitly disallows extra whitespace, raising aConversionSyntaxexception.実装上の誤り(事故)で、ビルトインの
__import__()関数にファイルパスを渡すと指定したファイルをインポート出来ていました。しかしながらこれは決して意図した振る舞いではありませんでした。実装は今ではこのケースを明示的にチェックし、ImportErrorを起こします。C API:
PyImport_Import()とPyImport_ImportModule()関数がデフォルトで、相対インポートではなく絶対インポートをするようになっています。これはほかのモジュールをインポートする C 拡張に影響します。C API: ハッシュされるべきではない拡張データ型は、
tp_hashスロットをPyObject_HashNotImplemented()と定義すべきです。socketの例外socket.errorがIOErrorを継承するようになりました。 以前はStandardErrorのサブクラスではありませんでしたが、IOErrorを通して継承するようになりました。 (Gregory P. Smith による実装です。bpo-1706815。)xmlrpclibは、datetime.dateとdatetime.timeをxmlrpclib.DateTimeに自動変換しなくなりました。 その変換の意味が、すべてのアプリケーションで正しいとは限らなかったためです。xmlrpclibを使うコードでは、dateとtimeのインスタンスを変換してください。 (bpo-1330538)(3.0 警告モード)
Exceptionクラスはスライスやインデクスアクセスで警告を出します;Exceptionのタプルのような振る舞いはのちに取り除かれます。(3.0 警告モード) 2 つの辞書や 2 つの比較メソッドを実装しないオブジェクトの不等号比較は警告されます。
dict1 == dict2はまだ動作しますが、dict1 < dict2はのちに取り除かれます。Python のスコープルールの実装の詳細であるセル間の比較も、警告を引き起こします。なぜならこれは、3.0 ではそのような比較は完全に禁止されているからです。
Python を埋め込んだアプリケーションでは:
Python 2.6.6 で
PySys_SetArgvEx()が追加され、従来のPySys_SetArgv()を使った場合のセキュリティホールを塞げるようになりました。PySys_SetArgv()を呼んでいるか確認し、updatepath を偽にしたPySys_SetArgvEx()を使うべきか慎重に検討してください。
謝辞¶
著者は提案の申し出や修正、様々なこの記事の草稿の助けをしてくれた以下の人々に感謝します: Georg Brandl, Steve Brown, Nick Coghlan, Ralph Corderoy, Jim Jewett, Kent Johnson, Chris Lambacher, Martin Michlmayr, Antoine Pitrou, Brian Warner.