3.0a1の新機能 (2)

まとめの第2弾。不明な箇所は訳していない。あと間違いの指摘大歓迎。

問題のあった機能
  • unicode型、str型がstr型、bytes型になる。
  • テキストファイルはエンコードを強要する。バイナリファイルはbyte型を使う。

これにより、ファイルを間違ったモード、エンコードで開いたときに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>
文字列とバイト
  • 文字列はstr型のみになる。3.0のstr型は2.xのunicode型である。
  • bytesはバイナリデータを表す。strとbytesは混ぜて使えない。

.encode()でstr->bytesへ、.decode()でbytes->strへ明示的に変換する必要がある。

  • bytesのリテラルは、b"abc"のように書く。
  • UTF-8がデフォルトのソースのエンコードになる。
  • IOの実装を新しく実装しなおすが、APIは100%後方互換
  • StringIOとcStringIOモジュールはなくなる。代わりに、ioモジュールからStringIOもしくは、BytesIOをimportする。
例外関係
  • 例外は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()の返すモノの表記を修正。