トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS   ログイン


はじめに

 本文はGuido van Rossumの"What's New In Python 3.0"( http://docs.python.org/3.0/whatsnew/3.0.html )の全訳です。翻訳のルール等については、下記の「翻訳についてのおことわり」を参照してください。

What's New In Python 3.0

 この記事は、Python 2.6と比較したPython 3.0の新機能について説明します。『Python 3000』および『Py3k』としても知られているPython 3.0は、『後方互換を意図的に除いた』Pythonの初めてのリリースです。通常のリリースにあるよりもたくさんの変更があり、またそのような変更はすべてのPythonユーザーにとって重要なものです。にもかかわらず、変更を整理した後、実際にはPythonには大きな変更がなかったと気づくでしょう。そして私達は、主に有名な厄介事と醜いものを修正していて、たくさんの古い嫌なもの(cruft)を削除しています。

 この記事では、すべての新機能の完全な仕様を説明するつもりはありませんが、代わりに便利な概観を提示します。詳細については、Python 3.0のドキュメント、あるいはそこで参照されている多くのPEPを参照してください。あなたが、完全な実装と特定の機能のための設計原理を理解したいならば、PEPは通常のドキュメントより多くの詳細な情報を持っています。ただし機能が完全に実装されたら、PEPは通常アップデートされないことに注意してください。

(訳注: PEP = Python Enhancement Proposal( http://www.python.org/dev/peps/ )
Pythonの仕様変更の提案及び進行状況の報告の場。Pythonistaであれば知らなければモグリだが、他言語がメインのユーザの中にはご存じ無い方がいるかも知らないので蛇足を承知で念のため。ちなみに、ここで提案されても通らなかったり、変更されたりするものもある)

 時間的制約のため、この文書は(かくあるべきとされるほど)完全ではありません。いつものように新しいリリースでは、ソースの配布物の中の『Misc/NEWS』のファイルに、変更の仔細の全てに関する詳細な情報が満載されています。

共通の障害

 このセクションでは、Python 2.5を使用しているほとんどの人がつまづくであろう、幾つかの変更点がリストアップされています。

『print』は関数に

 古いprint文の特殊な文法は廃止され、print関数(とキーワード引数)に置き換えられました。例:

旧:print "The answer is" , 2 * 2
新:print ( "The answer is" , 2 * 2 )
旧:print x , # 末尾のコンマが改行を抑制
新:print ( x , end = " " ) # 改行の代わりにスペースを付加
旧:print # 改行を出力
新:print() # 『print関数』を呼び出す必要があります
旧:print >> sys.stderr , "fatal error"
新:print("fatal error", file = sys.stderr)
旧:print(x , y) # repr( (x, y) )を出力
新:print ( ( x , y ) ) # print(x, y)とは別!

アイテムとアイテムの間のセパレータをカスタマイズすることもできます
例えば……

print("There are <", 2 ** 32, "> possibilities!", sep = "")

は、

There are <4294967296> possibilities!

を生成します。

注記:

(訳注: 『2→3コード変換ツール』[原文:2to3 source-to-source conversion tool, 2to3 tool, 2to3 source-to-source translator, 2to3 translatorなど]  Python 2.xのソースコードをPython 3.0準拠に変換してくれるツール。Python 3.0移行の切り札的存在。ただし後述のように、その場合は先になるべく2.6準拠のコードに直しておかないとあまりうまく働かない)

リスト(list)の代りのビュー(view)とイテレータ(iterator)

いくつかのよく知られているAPIは、もはやリストを返しません。

訳注: 3.0以降 map は生成したリストではなくジェネレーターを返すため、 いわゆる void コンテキストでの map の呼び出しではmap の引数で指定した関数は呼び出されません。

順序の比較

Python 3.0では順序の比較のルールを簡略化しています。

整数

『Unicode 対 8ビット』の代わりに『テキスト 対 データ』を

 バイナリデータとUnicodeについて、あなたが知っている全てのことは変わってしまいました。

構文の変更点の概要

このセクションではPython 3.0のすべての構文の変化の概要を説明します。

新しい構文

(訳注:stuffは『要素』なので、

( (1,100),(2,200) )

のようなkey-value対応のモノを想定している。しかし、たとえばdが辞書ならば、

x = dict(d)

は通っても

x = {k: v for k, v in d}

は通らない。この場合、

x = {k: v for k, v in d.items()}

とする必要がある)

変更された構文

(訳注:2.xに於けるリストの内包記法で用いられる変数(例えば『[x for x in range(10)]のx』は、リストの外にも影響を与えていた。しかしジェネレータ式はローカル変数として扱われていた。そのため、外部の変数に影響を与えないため、次のような裏技が用いられていた。

《Python 2.x》

>>> x = 100

>>> [x for x in range(10)] # リストの内包記法

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> x

9 ←変数xの内容が変更されている

>>> x = 100

>>> (x for x in range(10)) # ジェネレータの内包記法

<generator object at 0x4031362c>

>>> x

100 ←変数xの内容が変更されていない

>>> list(x for x in range(10)) # ジェネレータの内包記法とlist関数(listクラスのコンストラクタ)

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> x

100 ←変数xの内容が変更されていない

 しかし、Python 3.0ではリスト内包記法の変数もローカルとして扱われるため、上記のような小手先の技は必要なくなった

《Python 3.0》

>>> x = 100

>>> [x for x in range(10)]

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

>>> x

100

>>> )

削除された構文

Python 2.6 において既に提示された変更

 おそらく多くのユーザーはPython 2.5 から Python 3.0 へ直接移行するでしょうから、このセクションは新しい機能は元々 Python 3.0のために設計されたものでPython 2.6 に逆移植されたものだと読者に思い出させることになるでしょう。『What’s New in Python 2.6』の中の対応するセクションには、より詳細な説明があります。

ライブラリの変更

 時間の制約のため、この文書は標準のライブラリの、あまりにも広範囲な変更を、徹底的にカバーしているわけではありません。PEP 3108は、ライブラリの比較的大きな変更の、リファレンスです。

旧名称新名称
_winregwinreg
ConfigParserconfigparser
copy_regcopyreg
Queuequeue
SocketServersocketserver
markupbase_markupbase
reprreprlib
test.test_supporttest.support

結果として新しいパッケージは:

PEP 3108でカバーされない、標準ライブラリモジュールのいくつかの別の変更:

PEP 3101: 文字列書式設定の新しいアプローチ

例外処理の変更

 例外の発生や捕捉についてのAPIは整理されました。そして新しく強力な特徴が追加されました:

雑多なその他の変更

演算子や特殊メソッド

(訳注:

>>> class X:

... def ooo(self, other):

... print(self,other)

...

>>> X.ooo(1,2)

1 2

>>>

……というようなことが出来るようになった、という意味。以前はX.oooはunbound methodsとして、第一引数はXのインスタンス以外は受け付けなかった。この変更の効用としては、クラスを、単なる関数をまとめる入れ物として使いやすくした、と考えられる)

組み込み(関数,オブジェクト,型など)

ビルドとC言語へのAPIの変更

 時間の制約があるため、これでは、 C言語へのAPIの変更の、非常に不完全なリストです。

パフォーマンス

 3.0の一般化の正味の結果は、pystoneベンチマークでPython3.0がPython2.5より約10%遅く走るということです。おそらく、最も大きな原因は小さな整数のための特殊なケーシングの除去にあるのでしょう。実装に改善の余地があるけれども、3.0がリリースされた後に、それは起こるでしょう!

Python 3.0への移植

 既存のPython 2.5または2.6のソースコードをPython 3.0に移植するための最適な戦略は以下の通りです:

0. (前提条件)優れたテスト適用から開始します。

1. Python 2.6へ移植。このステップは、Python 2.x からPython 2.(x+1)への平均的な移植作業以上の手間はかからないでしょう。すべてのテストに合格していることを確認。

2. (まだ2.6を使用して)-3コマンドラインスイッチを(ひねって)ONにします。このスイッチを指定することによって、3.0で削除されたり変更されるような機能についての警告を行います。再度テストスイートを走らせます。警告が一切なくなり全てのテストを通過するまで(テストにパスするまで)コードの修正を行います。

3. 2→3コード変換ツールをソースコードツリーに対して走らせます。(2to3を参照のこと - このツールで自動的にPython2から3のコード変換以上のことをしてくれます) 変換結果をPython 3.0下で走らせます。再びすべてのテストを通過するまで手作業で残る懸案事項を修正して、問題を解決してください。

 Python2.6と3.0両方の下で不変になるソースコードを書き込もうとすることは、お勧めできません;あなたは、まさしくその曲げられたコーディングスタイル、たとえば、print文やメタクラスやあるいはもっと多くの多くのものを避けることを強要されるでしょうから。あなたが、Python 2.6とPython 3.0の両方をサポートする必要があるライブラリをメンテナンスしているならば、最もよいアプローチは、3.0バージョンのソースコードを編集するよりも、修正ステップ3に従って2.6バージョンのソースコードを編集し、再び2to3トランスレータを実行することでしょう。

C拡張のPython3.0への移植のためには、どうぞ『Porting Extension Modules to 3.0』をご覧下さい。

訳出 機械伯爵(in TSNET)

翻訳についてのおことわり

この文を訳出するに当たって、以下のルールを適用しました

謝辞

関連ページ

リンク

コメント、修正記録など

Wikiの強み、ということで、訂正箇所があれば「自由に訂正」してください。ただ、どこをどう治したかの記録だけは、下の履歴ににお願いいたします。

履歴

コメント