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 に慣れていたら躓いてしまいそうな少数の変更の一覧です。

リストからビューおよびイテレータへ

いくつかの良く使われている 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/2 returns a float. Use 1//2 to 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 が部分的に制限されていました)

  • except exc, var から except exc as var に変更されました。 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 で終わる整数リテラルはサポートされません。

  • u or U で始まる文字列リテラルはサポートされません。(---訳注: この u"..." は Python 3.3 で再び使えるようになりました。 ---)

  • from module import * はモジュールレベルでのみ許され、関数内での使用は許されません。

  • 相対インポートに許される構文は 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 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 の基底クラスとしてのみ使われるべきでしす。上記カテゴリーを除く全ての例外を処理するのに推奨されるイディオムは except Exception です。

  • 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 like PyImport_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 に移植する最良の策は以下の通りです:

  1. (必須:) 優秀なテストカバレッジから始めてください。

  2. Python 2.6 に移植します。Python 2.x を Python 2.(x+1) に移植する普通の作業以上のことをしてはいけません。確実に全てのテストを通してください。

  3. (まだ 2.6 を使います:) コマンドラインに -3 オプションを渡します。これは 3.0 で削除された (または変更された) 機能についての警告発行を有効にします。再びテストスイートを実行して、そして警告が出たコードをそれがなくなるまで修正し、全てのテストをパスさせます。

  4. 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 への拡張モジュール移植 を参照してください。