3.0a1の新機能 (2)
- What's New in Python 3.0 (http://docs.python.org/dev/3.0/whatsnew/3.0.html)
まとめの第2弾。不明な箇所は訳していない。あと間違いの指摘大歓迎。
問題のあった機能
これにより、ファイルを間違ったモード、エンコードで開いたときにIOエラーが出る。
- mapとfilterがイテレータを返す。
- dictのメソッドkeys()、items()、values()がリストでなく、それぞれdict_keys、dict_items、dict_values型のオブジェクトを返す。
k = d.keys(); k.sort()は動作しなくなる。代わりに、k = sorted(d)を使う。
>>> D = dict(a=1, b=2, c=99) >>> D.keys() <dict_keys object at 0x00B6FEC0>
- 1/2が浮動小数点数を返す。整数を返したい場合は、1//2を使う。
文字列とバイト
- 文字列はstr型のみになる。3.0のstr型は2.xのunicode型である。
- bytesはバイナリデータを表す。strとbytesは混ぜて使えない。
.encode()でstr->bytesへ、.decode()でbytes->strへ明示的に変換する必要がある。
例外関係
- 例外はBaseExceptionから継承しないといけない。この例外は例外の継承関係のベースとなる。
- StandardExceptionはなくなる。
- 例外インスタンスの.message属性がなくなる。
- raise Exception, argsという構文は使えなくなる。代わりに、raise Exception(args)となる。
新クラスおよびメタクラス関係
- 旧スタイルクラスはなくなる。
言語のコア機能の変更
- `obj`がなくなる。代わりにrepr(obj)を使う。
- <>がなくなる。代わりに!=を使う。
- asとwithがキーワードになる。
- long型がint型に変更される。つまり整数型はintのみになり、3.0のintは2.xのlongの動作をする。
- int同士の割り算は浮動小数点数を返す。
- 互換性のない型のオブジェクト同士のx < yなどの比較は、間違ったブーリアン値を返す代わりに、TypeErrorを返すようになる。
- __getslice__()関係はなくなる。代わりに、a[i:j]は、a.__getitem__(slice(i, j))に変換される。文脈により、__setitem__もしくは、__delitem__が使われる。
- nonlocal文が追加される。nonlocal xは、外側の関数のスコープの変数に代入可能になる。
>>> def foo(n): ... s = n ... def bar(i): ... nonlocal s ... s += i ... return s ... return bar ... >>> f = foo(100) >>> f(1), f(3) (101, 104)
- raw_input()は、input()に変更される。つまり、input()関数は、sys.stdinから改行が取り除かれた行データを読み込む。
古いバージョンのinput()と同じ動作をさせたい場合、代わりにeval(input())を使用する。
- xrange()はrange()に変更される。
- タプル引数のアンパッキングはなくなる。def foo(a, (b, c)):...と書けなくなる。def foo(a, b_c): b, c = b_cと代わりに書く。
- .next()は、.__next__()に変更される。新しいビルトインのnext()関数を呼ぶと、特殊メソッド__next__()が呼ばれる。
- 8進数リテラルが、0666から0o666に変更される(ゼロオーを先頭に付ける)。oct()関数の実装は修正される。0666はSyntaxErrorとなる。
2進数リテラル、bin()関数が追加される。
- アンパック代入が拡張される。a, b, *rest = some_sequenceもしくは、*rest, a = stuffなどの構文が使える。restはリストになる。
- super()が変更される。引数なしで呼び出せて、正しいクラスやインスタンスが自動的に選択される。引数ありの場合は、今までと同じ。
- zip()、map()、filter()がイテレータを返すように変更される。
- string.letters関係、.lowercase、.uppercaseがなくなる。代わりに、string.ascii_lettersなどを使用する。
- apply()、callable()、coerce()、execfile()、file()、reduce()、reload()がビルトインからなくなる。
- dict.has_key()がなくなる。
- execは文でなく関数に変更される。
- セットリテラルとセット内包表記が追加される。{x for x in [1,2,99]}のように書ける。
変更になるモジュール
- cPickleモジュールはなくなる。代わりにpickleモジュールを使う。
追記:
- jijixiさんのブログでのコメントを見て、dictのkeys()の返すモノの表記を修正。