Keep on moving

あんまりまとまってないことを書きますよ

python codereading#08を聞いてきた

python3の変更点
  • 後方互換性がない(意図的に)
  • 既存コードが動かなくなる
  • 既存のライブラリが動かなくなる可能性が。。。
  • できなくなったことに今日はフォーカスして話す
  • 標準ライブラリを参考にする
    • 3.0を知っている人が書いている
    • テスト・デバッグがすんでいる
  • 標準ライブラリの変更を読む
    • 文字列周りの変更
    • 例外周りの変更など
  • print文→print関数
    • 2.x print >> stream
    • 3.0 print(...,end=" ")
      • print(...,file=stream)
    • /Lib/Pdb.py で使われている
  • string型=Unicode+ASCII
  • bytes型
    • u".."の廃止
      • textwrap.py
      • /Lib/base64.py:344
        • bytes型に変更
    • /Lib/poplib.py:112<2.5>
    • テキストモードでファイルを開くとread()の戻り値はstr
      • /Lib/doctest.py:2303<2.5>
      • 2272<3.0>
      • /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)
  • __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
    • __getslice__->__getitem__
      • /Lib/userList.py:31
      • /Lib/colledtions.py:196
  • 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に依存するコードから呼ばれる
  • 3.0へいこう
    • 一括した記法
  • python3移行のポイント
    • ほとんど局所的に対応できる
    • 文字列は協会(ファイルとか)で対応
終わってから
  • pythonはバージョンをあげると戻りづらくなる
  • __comp__のせいでeasy_install使えない
QA
  • djangoはまだまだ2.6->3まで2年くらいかかる
  • 3で遅くなっている
  • メモリ管理が賢くなっている
  • 文字列周りは遅くなっているのでは
    • →使って遅くなった印象はない。ただし、あまりstring型は使ってない

 &いつも文字列はユニコード変換する使い方なので本当にそうかは自信がない