python3の変更点
- 後方互換性がない(意図的に)
- 既存コードが動かなくなる
- 既存のライブラリが動かなくなる可能性が。。。
- できなくなったことに今日はフォーカスして話す
- 標準ライブラリを参考にする
- 3.0を知っている人が書いている
- テスト・デバッグがすんでいる
- 標準ライブラリの変更を読む
- 文字列周りの変更
- 例外周りの変更など
- print文→print関数
- 2.x print >> stream
- 3.0 print(...,end=" ")
- print(...,file=stream)
-
- u".."の廃止
- textwrap.py
- /Lib/base64.py:344
- bytes型に変更
- /Lib/poplib.py:112<2.5>
- u".."の廃止
-
- テキストモードでファイルを開くとread()の戻り値はstr
- /Lib/doctest.py:2303<2.5>
- 2272<3.0>
- テキストモードでファイルを開くとread()の戻り値はstr
-
-
- /Lib/pickle.py:223<2.5>226<3>
-
- codecするレイヤーが変更に
- テキストファイル str
- バイナリファイル bytes
- 例外処理が変更に
- /Lib/cgi.py<2.5>985<3>835
- 2.xのexcept文がややこしい
- except ValueError, var:
- ValueErrorを捕まえてvarに代入
- except (ValueError, IndexError):
- ValueError IndexErrorを捕まえる
- 文字列例外のはいし
- 2.5まで日推奨
- 2.6,3.0は廃止
- iter.next()->next(iter)
- いてれー他のnext()メソッド廃止
- 代わりに__next__()method
- 組み込み関数next()
- /Lib/csv.py:<2.5>362<3>369 next(rdr)
- 辞書のkeys(),items(),values()はリストを返さない
- /Lib/cgi.py 958 <3>796
- <3>sorted()関数
- viewを返す=事実上イミュータブルな辞書を返すようになる(?wakaran)
- /Lib/cgi.py 958 <3>796
- __cmp__()->__it__()
- __cmp__()による比較を廃止
- 組み込み関数cmp()も廃止
- __cmp__は<=>
- __cmp__(self,other)の戻り値
-
- __lt__()は<
- __lt__(self,other)の戻り値は
- __lt__(a,b)
- __eq__(a,b)
- /Lib/UserString.py:28
- /Lib/collections.py 268
- __lt__()は<
-
- __getslice__->__getitem__
- /Lib/userList.py:31
- /Lib/colledtions.py:196
- __getslice__->__getitem__
- 3.0 a[i:j]の取り扱い
- a.__getitem__(slice(i,j))のシンタックスシュガー
- a[slice(4,6)]
- file()->open()
- <> -> !=
- __nonzero__ -> __bool__
- d.has_key(key) -> key in d
- 2to3でコード変換
- テストコード書け
- 2to3で変換する
- 変換されないものは自力で。。。
- 大小比較するクラスには__lt__を定義する必要あり
- スライスは自力で定義
- テキストファイルを読み込むときにはエンコード指定が必要
- reduce()は自力で
- print foo, に注意(末尾,)
- 3.0へ移行しない理由
- 2.xライブラリに強く依存
- ex)django,Scipy
- 2.xライブラリに強く依存
- 2.xに依存するコードから呼ばれる
- 3.0へいこう
- 一括した記法
- python3移行のポイント
- ほとんど局所的に対応できる
- 文字列は協会(ファイルとか)で対応
- 文字列?バイト列
- エンコードを明に指定
終わってから
- pythonはバージョンをあげると戻りづらくなる
- __comp__のせいでeasy_install使えない
QA
- djangoはまだまだ2.6->3まで2年くらいかかる
- 3で遅くなっている
- メモリ管理が賢くなっている
- 文字列周りは遅くなっているのでは
- →使って遅くなった印象はない。ただし、あまりstring型は使ってない
&いつも文字列はユニコード変換する使い方なので本当にそうかは自信がない