What's New In Python 3.0¶
- 著者:
Guido van Rossum
この記事では 2.6 と比較した Python 3.0 での新機能を解説します。 Python 3.0、あるいは "Python 3000"、 "Py3K" は初めて 意図的に後方非互換にした Python のリリースです。 Python 3.0 は2008年12月3日にリリースされました。 通常のリリースよりも多くの変更があり、全ての Python ユーザにとって重要です。 しかし、変更について理解したら Python に実際にはそれほど変更がないことが分かるでしょう。 全体的に見れば、よく知られた悩みの種が概ね解決され、昔の粗雑なものが取り除かれています。
この記事は全ての新機能を完璧な仕様を示そうとはしませんが、便利な概要については説明しようとしています。 全詳細については Python 3.0 のドキュメントや、本編で引かれている多くの PEP を参照してください。 特定の機能の実装や設計原理について完全に理解したいなら、通常のドキュメントよりも詳しいことが書いてある PEP を見るとよいでしょう。 しかし、一旦機能が完全に実装されると、普通 PEP は最新の状態に保たれないことに注意してください。
この文書で全項目に触れるべきなのですが、時間の制約のためそうではありません。 いつもの新リリースのように、 ソース配布の Misc/NEWS には些細な変更についても詳細な情報があります。
よくある悩みの種¶
このセクションは Python 2.5 に慣れていたら躓いてしまいそうな少数の変更の一覧です。
print関数¶
print 文は print() 関数に置き換えられ、古い print 文の特殊な文法の殆どがキーワード引数で置き換えられています (PEP 3105)。 例:
旧: print "The answer is", 2*2
新: print("The answer is", 2*2)
旧: print x, # 末尾のカンマで改行を抑制
新: print(x, end=" ") # 改行の代わりにスペースを追加
旧: 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!
注釈:
print()関数は、古いprint文の "ソフトスペース" 機能をサポートしません。例えば Python 2.x では、print "A\n", "B"は"A\nB\n"を出力していましたが、 Python 3.0 では、print("A\n", "B")は"A\n B\n"を出力します。最初は、対話モードで古い
print xを何回もタイプしてしまうでしょう。代わりにprint(x)とタイプするよう再教育してください。2to3ソース変換ツールを使うと、すべてのprint文がprint()関数呼び出しに自動的に置換されるので、大きなプロジェクトでもさほど問題にならないでしょう。
リストからビューおよびイテレータへ¶
いくつかの良く使われている API はもはやリストを返しません:
dictのdict.keys(),dict.items()そしてdict.values()メソッドはリストの代わりに "views" を返します。 例えば:k = d.keys(); k.sort()は上手く動きません。 代わりにk = sorted(d)を使ってください (これは Python 2.5 でも動作し、効率的です)。dict.iterkeys()、dict.iteritems()、dict.itervalues()メソッドはもうサポートされません。map()とfilter()はイテレータを返します。もしも本物のリストが必要で、全ての入力シーケンスが同じ長さの場合であれば、簡単に直すならmap()をlist()で包みます。例えばlist(map(...))という具合。ですがより良いのは、大抵はリスト内包を使うことです (特に元々のコードがlambdaを使っている場合)。あるいはコードを、リストを全く必要としないように書き換えましょう。とりわけトリッキーなのは、関数に副作用を起こさせるために呼び出されるmap()です; この場合確実な変換は普通にforループを使うことです (そもそもリストを作ること自体が無駄遣いでしょう)。入力シーケンスの長さが同じとは限らないならば、
map()は最も短いシーケンスが消費されつくすと処理をやめます。Python 2.x でのmap()用法と全く互換にするにはシーケンスをitertools.zip_longest()で包んでください。例えばmap(func, *sequences)をlist(map(func, itertools.zip_longest(*sequences)))とします。range()は、任意の大きさの値に対応する点を除き、以前のxrange()と同様に動作するようになりました。 xrange は削除されました。zip()はイテレータを返します。
順序比較¶
Python 3.0 で順序比較のルールが簡単になりました。
順序比較演算子 (
<,<=,>=,>) は、そのオペランドが自然な順序づけを持たない場合 TypeError 例外を送出します。1 < '',0 > Noneまたはlen <= lenのような式は無効になり、None < NoneはFalseを返す代わりにTypeErrorを送出します。その結果、 不均一なリスト(訳注:比較不能な型からなる要素が混在するリスト)のソートは意味がなくなりました。 -- 全ての要素は互いに比較できなければなりません。これは==と!=演算子には適用されないことに注意してください: 別々の比較不可能な型のオブジェクトを比較すると常に、互いに等しくないと評価されます。sorted()とlist.sort()は、比較関数を渡す cmp 引数を受け付けなくなりました。 代わりに key 引数を使ってください。 なお、key と reverse はキーワード専用引数になりました。cmp()関数はなくなったものとして扱うべきで、特殊メソッド__cmp__()もサポートされなくなりました。 ソートには__lt__()、__hash__()とともに使う比較には__eq__()を使い、必要に応じて他の豊富な比較演算を使ってください。 (cmp()の機能がどうしても必要なら、cmp(a, b)と同等の式(a > b) - (a < b)を使えます。)
整数¶
PEP 237: 基本的には、
longはintに改名されました。 これは、整数型の唯一の組み込み型になり、intと名付けられていますが、古いlong型とほぼ同じように振る舞います。PEP 238: An expression like
1/2returns a float. Use1//2to get the truncating behavior. (The latter syntax has existed for years, at least since Python 2.2.)整数の上限がなくなったため、
sys.maxint定数は削除されました。 しかしながら、通常のリストや文字列の添え字よりも大きい整数としてsys.maxsizeを使うことができます。sys.maxsizeは実装の "自然な" 整数の大きさに一致し、同じプラットフォームでは (同じビルドオプションなら) 過去のリリースのsys.maxintと普通は同じです。long 整数の
repr()はもはや末尾にLを持ちません。そのため、無条件に "L" を取り除くコードは代わりに最後の数字を取り除いてしまうでしょう。 (代わりにstr()を使用してください。)8進数リテラルが
0720の形でなくなりました。代わりに0o720を使ってください。
Unicode 対 8 ビット、ではなく、テキスト対データに¶
バイナリと Unicode について知っていると思っている全てが変わりました。
Python 3.0 でのコンセプトは、Unicode 文字列と 8 ビット文字列、という対比ではなくて、 テキスト と (バイナリ) データ の違いと考える、というものです。全てのテキストは Unicode です; 一方で エンコードされた Unicode はバイナリデータとして表現されます。テキストを保持するのに使われる型は
strで、データにはbytesを使います。2.x での状況との最大の違いは、Python 3.0 でテキストとデータを混ぜようとすればTypeErrorとなることです。Python 2.x では Unicode と 8 ビット文字列を混ぜたとすれば、8 ビット文字列がたまたま 7 ビット (ASCII) バイトだけから出来ていれば動くし非 ASCII バイトがあればUnicodeDecodeErrorとなっていたでしょう。この、データ値に依存した振る舞いが、何年にも渡って夥しい数の悲劇を生み出していました。この方針の変更に伴い、Unicode、エンコーディング、バイナリデータを使うほとんどすべてのコードは変更が必要になるでしょう。 2.x ではエンコード済みと未エンコードのテキストを混在させることによるバグが多数あったため、これは改善のための変更です。 Python 2.x で準備するには、未エンコードのテキストにはすべて
unicodeを使い、strはバイナリデータやエンコード済みデータだけに使ってください。 そうすれば2to3ツールが大部分の作業を処理してくれます。Unicode テキストのリテラルに
u"..."を使うことはもはやできません。しかし、バイナリーデータのリテラルにはb"..."を使わなければなりません。(---訳注: このu"..."は Python 3.3 で再び使えるようになりました。 ---)str型とbytes型を混ぜて使うことは出来ませんから、それらはいつでも明示的に変換しなければいけません。strからbytesにするにはstr.encode()を使ってください。そしてbytesからstrにするにはbytes.decode()を使います。それぞれbytes(s, encoding=...)、str(b, encoding=...)を使うことも出来ます。strと同様、bytes型はイミュータブルです。 バッファーされたバイナリデータを保持するために、別の ミュータブルな 型bytearrayがあります。bytesを受け付ける API のほとんどはbytearrayも受け付けます。 ミュータブルな API はcollections.MutableSequenceに基づいています。raw 文字列リテラル内にある全てのバックスラッシュが「字句通り」に解釈されます。つまり
'\U'も'\u'も、 raw 文字列内にあっては何ら特別に扱われないということです。例えばr'\u20ac'は Python 3.0 では 6 文字の文字列です。Python 2.x ではur'\u20ac'が単一の「ユーロ」文字であったのにです。(無論この変更は raw 文字列リテラルについてだけのもので、ユーロ文字は Python 3.0 で'\u20ac'です。)組み込みの抽象型
basestringは削除されました。 代わりにstrを使ってください。strとbytesには、共通の基底クラスを設けるほど共通の機能がありません。2to3ツール (後述) は、すべてのbasestringをstrに置き換えます。テキストファイルとして開かれたファイル (これは従来どおり
open()でのデフォルトのモード) は、 (メモリ内の) 文字列と (ディスクでの) バイト列との写像をするのに、常にエンコーディングを使います。バイナリファイル (モードにbを付けて開いたもの) はメモリ内では常にバイト列を使います。このことで、もしもファイルが誤ったモードやエンコーディングで開かれようとすると、I/O はきっと口やかましく失敗します。こっそり正しくないデータを生み出すのではなく。それに加えて、ファイルを開く際には Unix ユーザでさえもこれからは、 (テキストかバイナリかの) 正しいモードを選択する必要があるということです。プラットフォームにはそれ特有のデフォルトエンコーディングがあります。Unix 的プラットフォームではこれは環境変数LANGにセットされているかもしれません (あるいは時々ほかのプラットフォーム特有の、ロケールに関係した環境変数にもセットされています)。全てとは言いませんが多くの場合は、システムのデフォルトは UTF-8 です; ですが決してこのデフォルトを当てにすべきではありません。純粋な ASCII テキスト以上のものを読み書きするどんなアプリケーションも、きっとエンコーディングをオーバライド出来る手段を持つべきです。codecs内にあるエンコーディングを熟知したストリームを使うことは、今ではもう必要なくなりました。sys.stdin,sys.stdout,sys.stderrの初期値はいまでは Unicode のみのテキストファイルです (つまりそれらはio.TextIOBaseのインスタンスです)。バイト列データをそれらのストリームで読み書きするには、io.TextIOBase.buffer属性を使う必要があります。ファイル名は、API へは (Unicode) 文字列を渡し、 (Unicode) 文字列が返ります。これにはプラットフォーム特有の問題があるかもしれません。というのも、いくつかのプラットフォームではファイル名は任意のバイト文字列だからです。(他方では、Windows ではファイル名はネイティブに Unicode で格納されています。) 次善策として、ほとんどの API (たとえば
open()とosモジュール内の多くの関数) はファイル名として、文字列だけでなくbytesを受け付け、そして少しの API はbytesを返すかどうかを要求出来る手段を持っています。それゆえにos.listdir()は引数がbytesインスタンスであればbytesのリストで返し、os.getcwdb()はカレントディレクトリをbytesで返します。os.listdir()が文字列のリストで返す際、適切にデコード出来ないファイル名はUnicodeErrorとはせずに無視されることにご注意ください。os.environやsys.argvのようないくつかのシステム API にも問題がありえます。システムにより利用可能とされるべきバイト列がデフォルトエンコーディングで解釈不能な場合です。環境変数LANGをセットしてプログラムを再実行することが、おそらく最善のアプローチです。PEP 3138: 文字列への
repr()はもう非 ASCII 文字をエスケープしません。ただし、制御文字、Unicode 標準で印字不可状態のコードポイントは今でもエスケープされます。PEP 3120: ソースのエンコードのデフォルトが UTF-8 になりました。
PEP 3131: 非 ASCII 文字を識別子として使用することが出来るようになりました。 (そうはいっても標準ライブラリは、コメント内での貢献者の名前以外では ASCII だけのままです。)
StringIOおよびcStringIOモジュールは廃止されました。その代わりioモジュールをインポートして、テキストやデータにはio.StringIOやio.BytesIOを使用してください。Unicode HOWTO を参照してください。Python 3.0 向けに更新されました。
構文の変更の概要¶
このセクションは Python 3.0 における全ての 構文の 変更についての簡単な概要です。
新たな構文¶
PEP 3107: 関数の引数と戻り値のアノテーション。 関数のパラメータと戻り値に注釈を付ける標準的な方法を提供します。 アノテーションは実行時に
__annotations__属性で調べられること以外に、特定の意味を持ちません。 メタクラス、デコレーター、フレームワークを通じた実験を促すことを意図しています。PEP 3102: キーワード専用引数。 パラメータリスト中で
*argsのあとに現れる名前付きパラメータは、呼び出す際には 必ず キーワード引数の構文を使う必要があります (---訳注:def fun(*a, kw):という定義でfun(1, 2, 3)は NG でfun(1, 2, kw=3)としなければならない。ここまでは 2.x と同じ ---)。 この PEP により、可変引数リストを受け取らずにキーワード専用引数だけを許したい場合にそれを主張するために剥き出しの*をパラメータリスト内に書けるようになりました (---訳注:def fun(*, kw):と定義出来る。この定義ではfun(kw=1)としてしか呼び出せない。fun(1)はダメ。---)。クラス定義内で、基底クラスのリストのあとでキーワード引数が許されるようになりました。これは metaclass を指定するための新しい規約 (次セクション参照) に使われるものですが、 metaclass サポートだけのためだけでなく他の目的に使うことも出来ます。
PEP 3104:
nonlocal文。nonlocal xを使うと外側の (ただしグローバルでない) スコープから、直接変数を代入することが出来るようになります。nonlocalは新しく予約語になりました。PEP 3132: 拡張されたイテレータのアンパック。
a, b, *rest = some_sequenceのようなことを書けるようになりました。*rest, a = stuffも出来ます。restオブジェクトは常に (空かもしれなくても) リストです; 右辺には任意のイテラブルを置けます。例えば:(a, *rest, b) = range(5)
これは a に
0を、 b に4を、そして rest に[1, 2, 3]をセットします。辞書内包表記:
{k: v for k, v in stuff}はdict(stuff)と同じ意味ですが、より柔軟です。 (これは PEP 274 で支持されています。)セットリテラル、例えば
{1, 2}。{}は空の辞書であることに注意してください。空のセットにはset()を使用してください。セットの内包表記もサポートされました。例えば{x for x in stuff}はset(stuff)と同じ意味ですが、より柔軟です。新たな8進数リテラル、e.g.
0o720(2.6 で既にありました)。古い8進数リテラル (0720) は廃止されました。新たなバイナリリテラル、e.g.
0b1010(2.6 で既にありました) と、関連する新しい組み込み関数bin()が導入されました。bまたはBで始まるバイトリテラルと、関連する新しい組み込み関数bytes()が導入されました。
変更された構文¶
PEP 3109 と PEP 3134: 新たな
raise文のシンタックス:raise [expr [from expr]]。以下を参照してください。asとwithは予約語になりました。 (実際には 2.6 から)True、False、およびNoneが予約語になりました。(2.6 では既にNoneが部分的に制限されていました)exceptexc, var からexceptexcasvar に変更されました。 PEP 3110 を参照してください。PEP 3115: 新たなメタクラスのシンタックス.以下の;
class C: __metaclass__ = M ...
代わりに次のようにしてください:
class C(metaclass=M): ...
モジュールのグローバル変数
__metaclass__はサポートされなくなりました。 (これは、すべてのクラスをobjectから派生させなくても、デフォルトで新スタイルクラスにするための補助手段でした。)リスト内包表記はもう
[... for var in item1, item2, ...]という構文形をサポートしません。代わりに[... for var in (item1, item2, ...)]を使用してください。また、リスト内包表記は異なるセマンティクスを持つことに注意してください。リスト内包表記はlist()コンストラクタ内のジェネレータ式の糖衣構文に近く、特にループの制御変数はスコープ外ではもう使用することができません。ellipsis (
...) はどこででも原子的な式として使うことが出来ます。 (以前はスライス内でのみ許されていました。) また、...と書かなければ ならなく なりました。 (以前は文法の些細な偶然により. . .と書くことも出来ました。)
削除された操作¶
PEP 3113: タプル引数のアンパックが削除されました.
def foo(a, (b, c)): ...のように書くことはできません。かわりにdef foo(a, b_c): b, c = b_cを使用してください。バッククオートが削除されました (代わりに
repr()を使用してください)。<>が削除されました (代わりに!=を使用してください)。削除されたキーワード:
exec()はキーワードでなくなりましたが、関数として残りました。 (幸運にも関数のシンタックスは 2.x でも許容されています。) また、exec()はストリーム引数を受け取らなくなりました。exec(f)の代わりにexec(f.read())を使うことができます。lまたはLで終わる整数リテラルはサポートされません。uorUで始まる文字列リテラルはサポートされません。(---訳注: このu"..."は Python 3.3 で再び使えるようになりました。 ---)相対インポートに許される構文は
from .[module] import nameのみです。.で始まらない形の全てのimportは絶対インポートと解釈されます。 (PEP 328)古い形式のクラスはサポートされません。
Python 2.6 で既にあった変更¶
おそらく多くのユーザが一足飛びに Python 2.5 から Python 3.0 に移行しようとするでしょうから、このセクションでは、もともとは Python 3.0 のためにデザインされたものの Python 2.6 にバックポートされた新機能について、読者に思い出してもらいましょう。 What's New in Python 2.6 内の対応するセクションにはもっと長い説明が書かれています。
PEP 343: "with" ステートメント.
with文は今では標準機能となったので、__future__からインポートする必要はもうありません。 コンテキストマネージャを書く と contextlib モジュール も見てください。PEP 366: メインモジュールからの明示的相対インポート.
-mオプションの有用性を強化します。パッケージ内にあるモジュールを参照している際に関係します。PEP 3101: 進化版文字列フォーマッティング. 注意: 2.6 の記述では
format()メソッドが 8 ビット文字列と Unicode 文字列両方について述べていますが、3.0 ではstr型 (Unicode サポートを持ったテキスト文字列) だけがこのメソッドをサポートしています。bytes型にはありません。計画では最終的にはこれだけが唯一の文字列フォーマットの API になり、Python 3.1 では%演算子は非推奨扱いを開始する予定です。(--- 訳注:%演算子の撤廃は影響が大き過ぎるからか、現実には (ドキュメントでの軽い記述を除き) 実行時に特別に非推奨扱いされることは 3.5 になってさえもいまだありません。 ---)PEP 3105: print を関数にする. これはもはや標準機能となったので、
__future__からインポートする必要はありません。詳細はこのドキュメントの上の方に書いてあります。PEP 3110: 例外処理の変更.
exceptexcasvar 構文が標準となり、exceptexc, var はもうサポートされません。 (もちろんasvar 部分は今でも省略可能です。 )PEP 3112: バイトリテラル. 文字列リテラル
b"..."表記 (とそのお仲間b'...',b"""...""",br"..."など) は今ではbytes型です。PEP 3116: 新しい I/O ライブラリ.
ioモジュールが今ではファイル I/O の標準手段です。 組み込みのopen()は今ではio.open()へのエイリアスであり、また、追加のキーワード引数 encoding, errors, newline, closefd を持ちます。 不正な mode 引数でIOErrorではなくValueErrorを投げるようになったことにも注意してください。 テキストファイルオブジェクトの背後にあるバイナリファイルオブジェクトには、f.bufferでアクセスできます。 (ただしエンコーディング・デコーディング操作の高速化のために、テキストオブジェクトは自身のバッファを保守管理していることに注意してください。 )PEP 3118: 改訂版バッファプロトコル. 古いビルトインの
buffer()は本当になくなりました; 新しいビルトインmemoryview()が (ほぼ) 同様の機能性を提供します。PEP 3119: 抽象基底クラス。
abcモジュールとcollectionsモジュールで定義される ABC が、言語の中で以前より重要な役割を担うようになりました。dictやlistなどの組み込みコレクション型は、それぞれcollections.MutableMappingとcollections.MutableSequenceの ABC に従います。PEP 3127: 整数リテラルのサポートと文法. 上述のとおり、新しい 8 進数リテラル表現だけが唯一の 8 進数リテラル表現となり、また、バイナリリテラルが追加されました。
PEP 3141: 数値の型階層.
numbersが、もう一つの新しく ABC を使うモジュールで、Python の「数値塔 (numeric tower)」を定義しています。新しいfractionsモジュールがnumbers.Rationalを実装していることにも注目してください。
ライブラリの変更¶
時間の制約により、この文書は標準ライブラリの非常に幅広い変更について徹底的に取り上げてはいません。 ライブラリの大きな変更については PEP 3108 を参照してください。 ここでは要約を示します:
多くの古いモジュールは削除されました。
gopherlib(もう使われません) やmd5(hashlibに代替されました) 等のいくつかのモジュールは PEP 4 で既に廃止予定でした。 他のモジュールは、Irix、BeOS ならびに Mac OS 9 等のプラットフォームでのサポートが打ち切られた (PEP 11 参照) ために削除されました。 いくつかのモジュールは使われなかったり、より良い代用品があるため Python 3.0 で削除されました 網羅的なリストは PEP 3108 を参照してください。bsddb3パッケージは削除されました。 テストの不安定さと Berkeley DB のリリース日程のため、コアの標準ライブラリに含めることがコア開発者の大きな負担になると、次第に明らかになったためです。 ただし、このパッケージは引き続き https://www.jcea.es/programacion/pybsddb.htm で外部のプロジェクトとして保守されています。いくつかのモジュールは PEP 8 に従っていないか、その他の理由により名前が変更されました:
以前の名前
新しい名前
_winreg
winreg
ConfigParser
configparser
copy_reg
copyreg
Queue
queue
SocketServer
socketserver
markupbase
_markupbase
repr
reprlib
test.test_support
test.support
Python 2.x でのよくあるパターンは、ピュア Python で実装した版とともに、オプショナルで、C 拡張として実装した「加速装置付き (accelerated)」版を持つ、というものです。 例えば
pickleとcPickleがそうです。 それらモジュールの個々のユーザにとって、accelerated 版をインポートしてみてダメならピュア Python 版を使う、というのも重荷となるものです。 Python 3.0 では、 accelerated 版はピュア Python 版の実装の詳細と考えます。 ユーザは常に標準バージョンをインポートすべきです。 これ自身が accelerated 版のインポートを試みてダメならピュア Python 版を使うようになっています。pickle/cPickleのペアがこの対象になりました。profileモジュールは 3.1 でこれが予定されています。StringIOモジュールはioモジュール内のクラスに変更されました。関連のあるモジュールのいくつかはパッケージにまとめられ、ふつうサブモジュール名は単純化されました。結果として以下のようなパッケージが出来ました:
dbm(anydbm,dbhash,dbm,dumbdbm,gdbm,whichdb).html(HTMLParser,htmlentitydefs).http(httplib,BaseHTTPServer,CGIHTTPServer,SimpleHTTPServer,Cookie,cookielib).tkinter(turtleを除くすべてのTkinter関連モジュール)。turtleの想定利用者はtkinterを特に意識しません。 また、Python 2.6 でturtleの機能が大幅に強化された点にも注意してください。urllib(urllib,urllib2,urlparse,robotparse).xmlrpc(xmlrpclib,DocXMLRPCServer,SimpleXMLRPCServer).
PEP 3108 で取り上げられていない標準ライブラリーの他の変更:
setsは廃止されました。 組み込みのset()クラスを使用してください。sysモジュールの整理:sys.exitfunc(),sys.exc_clear(),sys.exc_type,sys.exc_value,sys.exc_tracebackは削除されました。 (sys.last_type等はまだあります。 )array.array型の整理:read()とwrite()は削除されました。 代わりにfromfile()とtofile()を使ってください。 また、配列の型コード'c'は削除されました。 バイトには'b'、Unicode 文字には'u'を使ってください。operatorモジュールの整理:sequenceIncludes()およびisCallable()は削除されました。threadモジュールの整理:acquire_lock()とrelease_lock()は削除されました。 代わりにacquire()とrelease()を使ってください。randomモジュールの整理:jumpahead()API は削除されました。newモジュールは廃止されました。os.tmpnam()、os.tempnam()、os.tmpfile()は削除されました。 代わりにtempfileモジュールを使ってください。tokenizeモジュールはバイトでも機能するように変更されました。メインのエントリポイントは generate_tokens からtokenize.tokenize()になりました。string.lettersと関連する定数 (string.lowercaseとstring.uppercase) は削除されました。 代わりにstring.ascii_lettersなどを使ってください。 (削除した理由は、string.lettersなどの動作がロケールに依存していたためです。 このように使いたくなる名前のグローバルな「定数」がロケール依存であるのは望ましくありません。)モジュール
__builtin__がbuiltinsにリネームされました (アンダースコアの削除と 's' の追加)。 大半の大域名前空間における__builtins__変数は変更されていません。 組み込みを変更するには__builtins__でなくbuiltinsを使わなければなりません。
PEP 3101: 文字列整形の新たなアプローチ¶
組み込みの新しい文字列書式化操作で、文字列の
%演算子を置き換えるものです。(しかしながら%演算子はまだサポートされます; Python 3.1 で非推奨となり、将来のいつかの時点で削除されます。) 完全な詳細は PEP 3101 をお読み下さい。 (--- 訳注: 「Python 2.6 で既にあった変更」での対応する記述に書いた訳注を参照。---)
例外に関する変更¶
例外の送出や捕捉を行う API は整理され、 強力な新機能が追加されました:
PEP 352: 全ての例外は (直接的にまたは間接的に)
BaseExceptionを継承しなければなりません。BaseExceptionは例外階層の根です。 これは勧告としては新しくありませんが、BaseException継承の 要求 は新しいです。 (Python 2.6 は依然として昔のクラスを送出するのを許容しており、捕捉するものについての制限はありません。) 結果として文字列例外は終に本当の意味で、完全になくなりました。ほとんど全ての例外は、実際は
Exceptionを継承すべきです。BaseExceptionは最上位で扱われるべき例外、例えばSystemExitやKeyboardInterruptの基底クラスとしてのみ使われるべきでしす。上記カテゴリーを除く全ての例外を処理するのに推奨されるイディオムはexceptExceptionです。StandardErrorは削除されました。例外はシーケンスとして動作しなくなりました。 代わりに
args属性を使ってください。PEP 3109: 例外の送出。
raise Exception, argsの代わりにraise Exception(args)を使う必要があります。 また、トレースバックを明示的に指定できなくなりました。 どうしても指定する 必要がある 場合は、__traceback__属性に直接代入できます (後述)。PEP 3110: 例外の捕捉。
except SomeException, variableではなくexcept SomeException as variableとしなければなりません。 その上exceptブロックがある場合 variable は明示的に削除されます。PEP 3134: 例外の連鎖。 暗黙の連鎖と明示的な連鎖の二つがあります。 暗黙の連鎖は、
exceptまたはfinallyのハンドラーブロック内で例外が送出されたときに発生します。 通常はハンドラーブロックのバグが原因で、この例外を 二次的な 例外と呼びます。 この場合、処理中だった元の例外は、二次的な例外の__context__属性に保存されます。 明示的な連鎖は次の構文で指定します。raise SecondaryException() from primary_exception
(primary_exception は例外オブジェクトを生成する任意の式で、通常はそれ以前に捕捉した例外です。) この場合、一次的な例外は二次的な例外の
__cause__属性に保存されます。 未処理の例外が発生したときに表示されるトレースバックは、__cause__と__context__属性の連鎖をたどり、 一次的な例外を先頭にして、連鎖の各例外のトレースバックを個別に表示します。 (Java の利用者には見覚えのある動作かもしれません。)PEP 3134: 例外オブジェクトが自身のトレースバックを
__traceback__属性に保存するようになりました。 これにより、例外に関するすべての情報が例外オブジェクトに含まれるため、sys.exc_info()を使う必要が少なくなります (削除されたわけではありません)。Windows が拡張モジュールのロードに失敗したときの例外メッセージが少し改善しました。 例えば、
error code 193は%1 is not a valid Win32 applicationになりました。 文字列は英語でないロケールを扱えるようになりました。
その他の変更¶
演算子と特殊メソッド¶
!=は==と逆の結果をかえします(==がNotImplementedを返さなければ)。「非束縛メソッド (unbound methods)」という概念は言語から削除されました。クラス属性としてのメソッドを参照しても今では普通の関数オブジェクトが得られます。
__getslice__()、__setslice__()、__delslice__()は削除されました。 構文a[i:j]はa.__getitem__(slice(i, j))に変換されます。 代入や削除の対象として使われる場合は、それぞれ__setitem__()や__delitem__()に変換されます。PEP 3114:
next()標準メソッドは__next__()に改名されました。特殊メソッド
__oct__()と__hex__()は削除されました。oct()とhex()は、引数を整数に変換するために__index__()を使うようになりました。__members__と__methods__は削除されました。関数の
func_Xという名前の属性は__X__形式に改名され、元の名前はユーザー定義の属性に使えるようになりました。 具体的には、func_closure、func_code、func_defaults、func_dict、func_doc、func_globals、func_nameが、 それぞれ__closure__、__code__、__defaults__、__dict__、__doc__、__globals__、__name__に改名されました。__nonzero__()は__bool__()になりました。
組み込み¶
PEP 3135: 新しくなった
super()。今ではsuper()は引数なしで呼び出せます。(これがclass内で定義される通常のインスタンスメソッド内であると仮定して) 正しいクラスとインスタンスが自動的に選択されます。引数ありの場合のsuper()の振る舞いには変更はありません。PEP 3111:
raw_input()がinput()にリネームされました。 つまり、新しいinput()関数はsys.stdinから行を読み、末尾の改行を取り除いて返します。 入力が時期尚早に終わってしまったらEOFErrorになります。 昔のinput()の振る舞いが欲しければeval(input())としてください。新しい組み込み関数
next()が追加されました。 オブジェクトの__next__()メソッドを呼び出します。round()関数の丸めの戦略と戻り値の型が変更されました。ど真ん中の場合に、四捨五入ではなく最近接偶数への丸めをするようになりました。(例えばround(2.5)は今では2を返します。3ではなく。) (---訳注: 丸めモードについては Wikipedia 参照。---)round(x[, n])は常に浮動小数点数の結果を返す代わりに、x.__round__([n])に処理を委譲するようになりました。これは一般的に、単一引数で呼ばれた際に整数を返し、二つの引数で呼ばれた場合はxと同じ型の値として返します。intern()はsys.intern()に移動しました。apply()は削除されました。apply(f, args)の代わりにf(*args)を使用してください。callable()は削除されました。callable(f)のかわりにisinstance(f, collections.Callable)を使用してください。operator.isCallable()も削除されました。coerce()は削除されました。 古い形式のクラスが削除されたため、この関数は必要ありません。execfile()は削除されました。execfile(fn)の代わりにexec(open(fn).read())を使用してください。file型は削除されました。open()を使用してください。ioモジュールには open が返すことの出来るいくつかの異なる種類のストリームがあります。reduce()は削除されました。 本当に必要ならfunctools.reduce()を使ってください。 ただし、99% の場合は明示的なforループの方が読みやすくなります。reload()は削除されました。imp.reload()を使用してください。dict.has_key()は削除されました -- 代わりにin演算子を使用してください。
ビルドならびに C API の変更¶
時間がないため、以下のC APIへの変更点のリストは かなり 不完全です。
Mac OS 9, BeOS, RISCOS, Irix, Tru64 に限らず、いくつものプラットフォームのサポートが打ち切られました。
PEP 3118: 新たなバッファ API。
PEP 3121: 例外モジュールの初期化と最終化
PEP 3123:
PyObject_HEADを標準的な C に一致。制限付き実行 の C API サポートはこれ以上されません。
PyNumber_Coerce()、PyNumber_CoerceEx()、PyMember_Get()、およびPyMember_Set()C APIs は削除されました。New C API
PyImport_ImportModuleNoBlock(), works likePyImport_ImportModule()but won't block on the import lock (returning an error instead).ブール変換の C 水準のスロットとメソッドがリネームされました:
nb_nonzeroがnb_boolになりました。C API から
METH_OLDARGSとWITH_CYCLE_GCが削除されました。
性能¶
3.0 の可搬化 (generalization) による正味の結果は、Python 3.0 を pystone ベンチマークすると Python 2.5 より 10% 遅くなる、というものでした。これはどうやら小さい整数についての特殊処理を削除したことに一番大きな要因があるようです。これには改善の余地がありますが、それは 3.0 リリース以降でしょう!
Python 3.0 への移植¶
(---訳注: 今では独立したクックブック How to port Python 2 Code to Python 3 があるのでそちらをご覧下さい。---) 既存の Python 2.5 や 2.6 のソースコードを Python 3.0 に移植する最良の策は以下の通りです:
(必須:) 優秀なテストカバレッジから始めてください。
Python 2.6 に移植します。Python 2.x を Python 2.(x+1) に移植する普通の作業以上のことをしてはいけません。確実に全てのテストを通してください。
(まだ 2.6 を使います:) コマンドラインに
-3オプションを渡します。これは 3.0 で削除された (または変更された) 機能についての警告発行を有効にします。再びテストスイートを実行して、そして警告が出たコードをそれがなくなるまで修正し、全てのテストをパスさせます。2to3のソース変換ツールをソースコードツリー全体に実行してください。 変換結果を Python 3.0 で実行してください。 残っている問題を手作業で修正し、すべてのテストが再び通るまで続けてください。
Python 2.6 と 3.0 両方で変更なしに動作するコードを書こうとすることはお奨め出来ません; それをするととても捻じ曲がったコーディングスタイルを使う必要があるでしょう。例えば print やメタクラスを避けたりとかそんな。Python 2.6 と 3.0 両バージョンともに対するサポートを必要とするライブラリを保守しているのであれば、最良のアプローチは上記スリーステップを修正して、2.6 版のソースコードを編集して 2to3 する、を繰り返すことです。これは 3.0 版のソースコードを編集するより良いです。(---訳注: ここで言っていることは正論なのですが、 2to3 は「Python 3 では動くが Python 2 では動かない (かもしれない)」ものを生成します。2016 時点でも Python 2.7 はかなり元気 (予定では 2020 年までは公式にサポートされる) ですので両バージョン (ただし今だと 2.7 と 3.2 以降) で変更なしで動作するものを必要とすることは、残念ながらまだ多いでしょう (あなたが作っているのがライブラリであるならば)。これについては How to port Python 2 Code to Python 3 に少し書かれています。 ---)
C 拡張を Python 3.0 に移植するには、 Python 3 への拡張モジュール移植 を参照してください。