3系の変更点覚書
3 系での変更点一覧
- Unicode 文字列がデフォルトに変更
print
が文から関数に変更- 詳しくは(公式ドキュメント)に
exec
が文から関数に変更- 詳しくは(公式ドキュメント)に
- 例外処理の構文(
try ... catch
)が一部変更- 例外オブジェクトを参照しないならば特に変更なし
- 詳しくは ここ に情報あり
- 例外を送出する構文(
raise
,throw
)が一部変更- 独自のエラーメッセージを出さずにエラーを送出するならば変更なし
- 詳しくは ここ に情報あり
- 関数や演算子の削除・改名など
raw_input()
関数 がinput()
関数に改名- python 2 系にあった
input()
関数は削除
- python 2 系にあった
unicode()
,unichr()
関数の削除- file 型 / file 関数の削除
open()
を使う
- 演算子
<>
の削除!=
を使う
- 辞書の
has_key()
メソッドが削除in
を代わりに使う
xrange()
関数の削除long
型の削除int
に統一sys.maxint
定数はもはや正確でない- 一応代わりに
sys.maxsize
が利用できる
- 一応代わりに
os.getcwdu()
関数は必要なくなった- 全て Unicode 文字列に統一されたので
os.getcwd()
で問題ない
- 全て Unicode 文字列に統一されたので
callable()
関数が削除hasattr(x, '__call__')
を代わりに使う
types
モジュールが返す定数の削除- 標準型の名前がそのまま返る。詳しくはこの表を参照。
basestring
データ型の削除- 文字列がUnicodeに統一されたため
sys.exc_type
,sys.exc_value
,sys.exc_traceback
がsys.exc_info()
というタプルに改名
- 8進数を表す構文が変更
- Python 2 系:
0755
- Python 3 系:
0o755
- Python 2 系:
- 演算子
/
の動作が変更- 整数ではなく浮動小数点を返
- 演算子
//
が2系の/
と同じ動作
- byte 列表現の追加
- Python 2 系:
str
(デフォルト) <->unicode
- Python 3 系: byte列表現 <->
unicode
(デフォルト)- ただし byte列表現は
- Python 2 系:
- バイナリファイルとテキストファイルの区別
- Python 3 系では相互変換できない
- Python 2 系:
open()
(バイナリ) <->codecs.open()
(Unicode文字列) - Python 3 系:
io.open()
(バイナリ) <->open()
(Unicode文字列)
- Python 2 系:
- Python 3 系では相互変換できない
- 長さの違う配列に対する map の動作の変更
- Python 2 系: 短い配列に None の値を補完して長い配列に合わせて処理する
- Python 3 系: 短い配列に合わせて処理する
- pickle モジュールが後方互換性を持たない
- Python 2 系: cPickle をインポート出来ない場合は pickle をインポート
- Python 3 系: 常に pickle をインポートすればよい
- リストを返していた関数の多くはイテレータを返す
- map, filter, zip, range など
- 代わりに imap, ifilter, izip が itertools から削除されている
apply()
関数の廃止- Python 2 系:
apply(f,[a,b,c])
->f(a,b,c)
- Python 3 系:
f(*[a,b,c])
->f(a,b,c)
- 関数を直接呼び出し
*
を前に付けた引数のリストを渡せばよい。
- 関数を直接呼び出し
- Python 2 系:
reduce()
関数がグローバルから functools モジュールの中に移動from functools import reduce
と書けばよい
- 辞書オブジェクトの一部メソッドが view と呼ばれるイテレータのような動作をするオブジェクトを返す
keys()
,items()
,values()
- シーケンスの中の次の要素を返すグローバルな関数
next()
追加- メソッドを呼び出す代わりに使える
- 複数の引数をとるかわりにタプルを取る labmda 関数はアンパックされない
- pyhton 2 系:
lambda (x, y): x + f(y)
- Python 3 系:
lambda x_y: x_y[0] + f(x_y[1])
- pyhton 2 系:
- リスト内包表記でタプルを丸括弧で括らなければならなくなった
- Python 2 系:
[i for i in 1,2,3]
- Python 3 系:
[i for i in (1,2,3)]
- Python 2 系:
- オブジェクトの評価結果を取得する方法の変更
- Python 2 系:
`x`
- Python 3 系:
repr(x)
- Python 2 系:
- メタクラスの定義方法の変更
- Python 3系 ではクラス属性でメタクラスを定義できなくなった
- 再構成されたモジュール
- urllib, urllib2, urlparse 等の統合
- urllib に統合(公式ドキュメント)
- dbm クローンの統合
- dbm, gdbm, dbhash などは dbm に統合された(公式ドキュメント)。
- httplib, Cookie, BaseHTTPServer などの統合。
- http に統合(公式ドキュメント)。
- xmlrpclib, DocXMLRPCServer, SimpleXMLRPCServer の統合。
xmlrpc
- xmlrpc に統合(公式ドキュメント)。
- cStringIO や StringIO が io に統合
- Queue が queue に変更
- SocketServer が socketserver に変更
- ConfigPerser が configparser に変更
- repr が reprlib に変更
- commands が subprocess に変更
__builtin__
が builtins に変更
- urllib, urllib2, urlparse 等の統合
従来のままでも動くが推奨スタイルが変更されたもの
set()
リテラル- Python 2 系:
set([1, 2, 3])
- Python 3 系:
{1, 2, 3}
- ただし、空集合は
set()
で作らなければならない {}
は空の辞書を表す
- ただし、空集合は
- Python 2 系:
buffer()
関数- Python 2 系:
y = buffer(x)
- Python 3 系:
y = memoryview(x)
- Python 2 系:
- 無限ループで
while 1:
ではなくwhile True:
を用いる- python 2.3 まで本物のブール型を持っていなかっため前者が慣用的に用いられていた
type(x) == T
やtype(x) is T
ではなくisinstance(x, T)
を用いる- シーケンスをソートする場合
1 2 3 |
|
ではなく
1 2 |
|
をつかう。
ざっとまとめてみたが、ミス・漏れ等があるかもしれない。