Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
今年はPython3.3!そろそろ乗り換えモードじゃない?      BPStudy #54     小田切 "aodag" 篤
お前誰よ?小田切篤@aodagとある代々木の会社のエンジニアhttp://facebook.com/aodaghttp://aodag.posterous.com
アジェンダなぜPython3?Python アドベントカレンダー2011 (Python3)Python3対応奮闘記Python3対応に役立つツールPython3対応の勘所
Python3って?Pythonのバージョン3後方互換性のない変更を含むPython2.6 Python3.1Python2.7 Python3.2と並行してリリースされてきた今年の3月にPython3.3a1のリリースが予定されている
なぜPython3Python2系は2.7で終わりもうPythonへの機能追加はPython3でしか行われないPython3は単なるメジャーバージョンアップPython3でうれしい?いつかはPython3になってしまう。Python3対応は必然。
Python3対応に手を出すわけ去年の夏にフォームライブラリを調べた(PyConJP 2011で発表)したが、Python3に対応したものがまったくないことが気になっていた
Python3対応に手を出すワケ今ならPython3対応することで、オープンソースコミュニティに貢献しやすい。(大半が機械的な作業なので、実はローカライズについで手が出しやすい)
Python3対応奮闘記ある日、ある雪山の開発合宿、あるIRCでaodag: Python3やってるひとー。フォームライブラリ何使ってる?other: Python3対応してるフォームライブラリないよmcdonc_: deformとcoland...
aodag: deformとかなんで2.4とかまだサポートしてるのん?mcdonc_: ちゃんとした理由はないよ。3対応するなら2.6以降だけのサポートでいいね。aodag: pyramidと同じようにワンソースアプローチだといいね。mcdon...
mcdonc_: Start Hacking ;)
(え、俺がやるの....?)
ということでpylonsprojectとrepoze、Paste の以下のライブラリについてpy3対応 ● peppercorn リリース済 ● colander リリース済  ● deform リリース済 ● repoze.who 作業中やろ...
現在Python3対応しているライブラリhttp://pypi.python.org/pypi?:action=browse&c=533&show=allSQLAlchemylxmlPyQtbottlepyramidSphinxnumpy/sc...
Python3対応のアプローチ(1)ワンソースアプローチ      2to3変換やバージョンごとのモジュール切り替え     を行いません
Python3対応のアプローチ(1)ワンソースアプローチPylons、repozeはこの方法2系は2.6以降のサポートにします2.5以前は文法の差異を吸収できませんtoxにより、対応バージョンのテストを一度に実行できるようにします       ...
今現在Python3に手を出すような人は    3.2に移行してます。
Python3対応のアプローチ(2)2to3を使う方法2to3を使ってソースを変換するSQLAlchemyはこの方法setupで、use_2to3=Trueにすれば、インストール時に2to3でコード変換してくれます
2to3変換後にちゃんと動くかは、やはりテストが必要。開発中に2to3すると、ソースを直接書き換えられてしまう。toxで2to3変換後のソースをテストするにはコツが必要。
Fuckin 2to3 !2to3は使いたくない!使いたくないワケテストコードも2to3するの?変換したテストコードで変換後のテスト...怖い><ws_comma_fixer が重い
Python3対応の準備 ツールをそろえるPython実行系の各種バージョンをそろえる対応させたいバージョンはすべてそろえましょう
Python3対応の準備 ツールをそろえるtoxvirtualenvnosepytestdistributecoverage
tox - 対象バージョン全テスト[tox]envlist = py26,py27,py32,pypy[testenv]deps =    nosecommands =    nosetests []
SIX - 汎用互換ライブラリpylonsproject内では個々のパッケージでcompat.pyを作ってますが、汎用的なものをまとめたライブラリにsixがあります。
すでに誰かやってないか聞くもしかしたら、もう誰かやってるかもしれないML, IRC, Twitter などで聞く
多分いないので、聞いてしまったことにより、自分がやることになります。
対応バージョン範囲を確認する。python2.5以前を切り捨てるかどうかがポイント切り捨てられないなら2to3を使うか、ダーティハックです。
Start Hacking ;)
手順(?) ソースを取り寄せるpylonsprojectはgithubにリポジトリがあるのでとても楽でした。githubマジ神ブランチを切りますgit checkout -b py3kプロジェクトのやり方にあわせましょう。
テスト環境作成ひとまず無難なところで2.6か2.7で作業環境を作ります。mkvirtualenv -p python2.7 testenvテストツールインストールpip install tox nose coverage依存ライブラリなどインス...
手順(?) 既存のテストを確認する       そもそも   2系で動くテストなければ     はじまりません。      なければテストを充実させるところからです。
既存のテストを確認するカバレージの確認コマンドラインオプションnosetests --with-coverage --cover-package=テスト対象
既存のテストを確認する noseの設定setup.cfg でコマンドラインオプション固定[nosetests]with-coverage = 1cover-package = テスト対象
toxを設定する;; tox.ini[tox]envlist = py26,py27,py32,pypy[testenv]deps =   nose   coveragecommands =   nosetests []
toxを動かすコマンド自体は簡単です$ tox1回目は対象バージョンすべてのvirtualenvを実行するので時間がかかります。
多分python3で動かないことを  確認できるでしょう。 
依存ライブラリを確認するpy3k対応していないライブラリをどうするか?● 依存からはずして代替ライブラリに変更● 依存からはずして、同等機能をついか● そのライブラリをpy3k対応する   ○ 本当に対応する   ○ コードをとりこむ● 諦める
互換モジュールを追加する● 独自にcompatモジュールを作る● sixを使う
compatモジュールバージョンフラグpy3 = sys.version_info > (3,0)
compatモジュール名前の変わった標準ライブラリStringIOurllib周りcookieやconfigparser, httplib
compatモジュールstr, bytes の差異を吸収するユーティリティbinary_typestext_typestext_bytes_などをpython2用とpython3用にそれぞれていぎ
文法の非互換に立ち向かう2大文法エラー● 例外ブロック● ユニコードリテラル
例外ブロックoldexcept Exception, e:new 2.6から使えるexcept Exception as e:
ユニコードリテラルユニコード文字列リテラルu"日本語"compatユーティリティでラップするtext_("日本語")
importエラーをなおすよくあるimportエラー ● 相対import ● 名前が変わった標準ライブラリ
名前が変わったものなどcompat内で解決import先をcompat経由に変更する
相対import2系では相対import優先。3系では絶対import優先import amoduleどちらでも相対import優先from . import amodule
コード、テストを修正するここまでくればいつもどおり!いきなり80%のテストが失敗しますが、心折れずに進めましょう。
Python3対応の勘所(1) iterator組み込み関数がのきなみiteratorに対応zipもfilterもrangeもlistではなくiteratorを返すそれぞれのiterator版だった、izipやifilter, xrangeなど...
で す が 
len(zip((1,2,3), (a, b, c)))3系だとNG!やりたければlistコンストラクタを明示的に呼び出すlen(list(zip((1,2,3), (a, b, c))))
Python3対応の勘所(2) strとbytesPython3の文字列はユニコードPython2のバイト配列に対応するものはbytesに変更Python2でなんとなく使ってたバイト文字列とユニコード文字列の違いを意識する場面が増えた
多くの関数、ライブラリがstr前提にjson.loads strしか受け取れないjson.load strを返すファイルライクオブジェクトじゃないとだめopen関数が返すオブジェクトはstrを返すファイルライクオブジェクト
StringIOとBytesIOioモジュールに統合
bytesの注意点bytesとstrは結合できないNG ba + a2系では自動変換されてました
bytesの注意点%演算子を使ったフォーマットが使えないNG b%d % 10
bytesの注意点コンストラクタ3のbytesbytes(source, encoding, errors)2のころのstrstr(object)
bytesの注意点2のころ>>> str(ba)a3だと>>> str(ba)"ba"
要するに       3系のbytesは        2系のstrと       互換ではない
Python3対応の勘所(3) strがちゃんとしたiteratorを実装している__next__や__iter__が実装されiteratorとして正しいインターフェイスとなった。し か し2系で使われていたバッドノウハウ__iter__ の有...
Python3対応の勘所(4)basestringがなくなった2系のstrとunicode共通のスーパークラスだったbasestringがなくなりました。isisntance(s, basestring) はできませんバージョンチェックで st...
Python3対応の勘所(5)相対importの罠2系の場合と3系の場合で優先順位が違う2系 相対importが優先3系 絶対importが優先a/__init__.pya/a.py3系で a/__init__.py で import aをやる...
相対importの罠にはまったライブラリiso8601最終リリース(2007年)からissuesも放置状態...作者への連絡方法も分からず、py3k対応のスタンスも確認できないMITライセンスだったので、ソース取り込みで対応
例外文法とくにキャッチする部分2系のみexcept Exception, e:2.6以降と3系except Exception as e:
どのバージョンでも動く? 2.4や2.5でも3.2でも動く。except Exception:  e = sys.exc_info()[1]多分一番ポータブル!でも、なんかいや
まとめ鶏が先か卵が先か。せっかくなので提供する側になりたいです。テストがすでにそろってる状態であれば、Python3対応は機械的に進められます。テスト大事。当然Python3での変更を調べることになります。Python3を仕事で使う前にオープン...
http://www.voidspace.org.uk/python/articles/porting-mock-to-python-3.shtmlhttp://pypi.python.org/pypi/six
Upcoming SlideShare
Loading in …5
×

BPStudy#54 そろそろPython3

7,505 views

Published on

BPStudy#54 そろそろPython3

  1. 1. 今年はPython3.3!そろそろ乗り換えモードじゃない? BPStudy #54 小田切 "aodag" 篤
  2. 2. お前誰よ?小田切篤@aodagとある代々木の会社のエンジニアhttp://facebook.com/aodaghttp://aodag.posterous.com
  3. 3. アジェンダなぜPython3?Python アドベントカレンダー2011 (Python3)Python3対応奮闘記Python3対応に役立つツールPython3対応の勘所
  4. 4. Python3って?Pythonのバージョン3後方互換性のない変更を含むPython2.6 Python3.1Python2.7 Python3.2と並行してリリースされてきた今年の3月にPython3.3a1のリリースが予定されている
  5. 5. なぜPython3Python2系は2.7で終わりもうPythonへの機能追加はPython3でしか行われないPython3は単なるメジャーバージョンアップPython3でうれしい?いつかはPython3になってしまう。Python3対応は必然。
  6. 6. Python3対応に手を出すわけ去年の夏にフォームライブラリを調べた(PyConJP 2011で発表)したが、Python3に対応したものがまったくないことが気になっていた
  7. 7. Python3対応に手を出すワケ今ならPython3対応することで、オープンソースコミュニティに貢献しやすい。(大半が機械的な作業なので、実はローカライズについで手が出しやすい)
  8. 8. Python3対応奮闘記ある日、ある雪山の開発合宿、あるIRCでaodag: Python3やってるひとー。フォームライブラリ何使ってる?other: Python3対応してるフォームライブラリないよmcdonc_: deformとcolander対応する予定だけど、優先度高くないよ。※ mcdonc_はpyramidの主要開発者です
  9. 9. aodag: deformとかなんで2.4とかまだサポートしてるのん?mcdonc_: ちゃんとした理由はないよ。3対応するなら2.6以降だけのサポートでいいね。aodag: pyramidと同じようにワンソースアプローチだといいね。mcdonc: それでうまくやってけそうだからね。
  10. 10. mcdonc_: Start Hacking ;)
  11. 11. (え、俺がやるの....?)
  12. 12. ということでpylonsprojectとrepoze、Paste の以下のライブラリについてpy3対応 ● peppercorn リリース済 ● colander リリース済  ● deform リリース済 ● repoze.who 作業中やろうかなと思うもの ● pyramid_who ● pyramid_rpc ● PasteScript
  13. 13. 現在Python3対応しているライブラリhttp://pypi.python.org/pypi?:action=browse&c=533&show=allSQLAlchemylxmlPyQtbottlepyramidSphinxnumpy/scipyipython...
  14. 14. Python3対応のアプローチ(1)ワンソースアプローチ 2to3変換やバージョンごとのモジュール切り替え を行いません
  15. 15. Python3対応のアプローチ(1)ワンソースアプローチPylons、repozeはこの方法2系は2.6以降のサポートにします2.5以前は文法の差異を吸収できませんtoxにより、対応バージョンのテストを一度に実行できるようにします 3系は3.0,3.1は 無視してもかまいません。
  16. 16. 今現在Python3に手を出すような人は 3.2に移行してます。
  17. 17. Python3対応のアプローチ(2)2to3を使う方法2to3を使ってソースを変換するSQLAlchemyはこの方法setupで、use_2to3=Trueにすれば、インストール時に2to3でコード変換してくれます
  18. 18. 2to3変換後にちゃんと動くかは、やはりテストが必要。開発中に2to3すると、ソースを直接書き換えられてしまう。toxで2to3変換後のソースをテストするにはコツが必要。
  19. 19. Fuckin 2to3 !2to3は使いたくない!使いたくないワケテストコードも2to3するの?変換したテストコードで変換後のテスト...怖い><ws_comma_fixer が重い
  20. 20. Python3対応の準備 ツールをそろえるPython実行系の各種バージョンをそろえる対応させたいバージョンはすべてそろえましょう
  21. 21. Python3対応の準備 ツールをそろえるtoxvirtualenvnosepytestdistributecoverage
  22. 22. tox - 対象バージョン全テスト[tox]envlist = py26,py27,py32,pypy[testenv]deps = nosecommands = nosetests []
  23. 23. SIX - 汎用互換ライブラリpylonsproject内では個々のパッケージでcompat.pyを作ってますが、汎用的なものをまとめたライブラリにsixがあります。
  24. 24. すでに誰かやってないか聞くもしかしたら、もう誰かやってるかもしれないML, IRC, Twitter などで聞く
  25. 25. 多分いないので、聞いてしまったことにより、自分がやることになります。
  26. 26. 対応バージョン範囲を確認する。python2.5以前を切り捨てるかどうかがポイント切り捨てられないなら2to3を使うか、ダーティハックです。
  27. 27. Start Hacking ;)
  28. 28. 手順(?) ソースを取り寄せるpylonsprojectはgithubにリポジトリがあるのでとても楽でした。githubマジ神ブランチを切りますgit checkout -b py3kプロジェクトのやり方にあわせましょう。
  29. 29. テスト環境作成ひとまず無難なところで2.6か2.7で作業環境を作ります。mkvirtualenv -p python2.7 testenvテストツールインストールpip install tox nose coverage依存ライブラリなどインストールpip install -e .
  30. 30. 手順(?) 既存のテストを確認する そもそも 2系で動くテストなければ はじまりません。 なければテストを充実させるところからです。
  31. 31. 既存のテストを確認するカバレージの確認コマンドラインオプションnosetests --with-coverage --cover-package=テスト対象
  32. 32. 既存のテストを確認する noseの設定setup.cfg でコマンドラインオプション固定[nosetests]with-coverage = 1cover-package = テスト対象
  33. 33. toxを設定する;; tox.ini[tox]envlist = py26,py27,py32,pypy[testenv]deps = nose coveragecommands = nosetests []
  34. 34. toxを動かすコマンド自体は簡単です$ tox1回目は対象バージョンすべてのvirtualenvを実行するので時間がかかります。
  35. 35. 多分python3で動かないことを 確認できるでしょう。 
  36. 36. 依存ライブラリを確認するpy3k対応していないライブラリをどうするか?● 依存からはずして代替ライブラリに変更● 依存からはずして、同等機能をついか● そのライブラリをpy3k対応する ○ 本当に対応する ○ コードをとりこむ● 諦める
  37. 37. 互換モジュールを追加する● 独自にcompatモジュールを作る● sixを使う
  38. 38. compatモジュールバージョンフラグpy3 = sys.version_info > (3,0)
  39. 39. compatモジュール名前の変わった標準ライブラリStringIOurllib周りcookieやconfigparser, httplib
  40. 40. compatモジュールstr, bytes の差異を吸収するユーティリティbinary_typestext_typestext_bytes_などをpython2用とpython3用にそれぞれていぎ
  41. 41. 文法の非互換に立ち向かう2大文法エラー● 例外ブロック● ユニコードリテラル
  42. 42. 例外ブロックoldexcept Exception, e:new 2.6から使えるexcept Exception as e:
  43. 43. ユニコードリテラルユニコード文字列リテラルu"日本語"compatユーティリティでラップするtext_("日本語")
  44. 44. importエラーをなおすよくあるimportエラー ● 相対import ● 名前が変わった標準ライブラリ
  45. 45. 名前が変わったものなどcompat内で解決import先をcompat経由に変更する
  46. 46. 相対import2系では相対import優先。3系では絶対import優先import amoduleどちらでも相対import優先from . import amodule
  47. 47. コード、テストを修正するここまでくればいつもどおり!いきなり80%のテストが失敗しますが、心折れずに進めましょう。
  48. 48. Python3対応の勘所(1) iterator組み込み関数がのきなみiteratorに対応zipもfilterもrangeもlistではなくiteratorを返すそれぞれのiterator版だった、izipやifilter, xrangeなどは消滅
  49. 49. で す が 
  50. 50. len(zip((1,2,3), (a, b, c)))3系だとNG!やりたければlistコンストラクタを明示的に呼び出すlen(list(zip((1,2,3), (a, b, c))))
  51. 51. Python3対応の勘所(2) strとbytesPython3の文字列はユニコードPython2のバイト配列に対応するものはbytesに変更Python2でなんとなく使ってたバイト文字列とユニコード文字列の違いを意識する場面が増えた
  52. 52. 多くの関数、ライブラリがstr前提にjson.loads strしか受け取れないjson.load strを返すファイルライクオブジェクトじゃないとだめopen関数が返すオブジェクトはstrを返すファイルライクオブジェクト
  53. 53. StringIOとBytesIOioモジュールに統合
  54. 54. bytesの注意点bytesとstrは結合できないNG ba + a2系では自動変換されてました
  55. 55. bytesの注意点%演算子を使ったフォーマットが使えないNG b%d % 10
  56. 56. bytesの注意点コンストラクタ3のbytesbytes(source, encoding, errors)2のころのstrstr(object)
  57. 57. bytesの注意点2のころ>>> str(ba)a3だと>>> str(ba)"ba"
  58. 58. 要するに 3系のbytesは 2系のstrと 互換ではない
  59. 59. Python3対応の勘所(3) strがちゃんとしたiteratorを実装している__next__や__iter__が実装されiteratorとして正しいインターフェイスとなった。し か し2系で使われていたバッドノウハウ__iter__ の有無でlistとstrを振り分けるは、もう使えません。ちゃんとisinstanceを使いましょう。
  60. 60. Python3対応の勘所(4)basestringがなくなった2系のstrとunicode共通のスーパークラスだったbasestringがなくなりました。isisntance(s, basestring) はできませんバージョンチェックで str_typesを作って対応2系のstr_typesstr_types = (str,unicode)3系のstr_typesstr_types = (str,)
  61. 61. Python3対応の勘所(5)相対importの罠2系の場合と3系の場合で優先順位が違う2系 相対importが優先3系 絶対importが優先a/__init__.pya/a.py3系で a/__init__.py で import aをやると自分をimportする!この場合は、from a import a か from . import a としましょう。
  62. 62. 相対importの罠にはまったライブラリiso8601最終リリース(2007年)からissuesも放置状態...作者への連絡方法も分からず、py3k対応のスタンスも確認できないMITライセンスだったので、ソース取り込みで対応
  63. 63. 例外文法とくにキャッチする部分2系のみexcept Exception, e:2.6以降と3系except Exception as e:
  64. 64. どのバージョンでも動く? 2.4や2.5でも3.2でも動く。except Exception: e = sys.exc_info()[1]多分一番ポータブル!でも、なんかいや
  65. 65. まとめ鶏が先か卵が先か。せっかくなので提供する側になりたいです。テストがすでにそろってる状態であれば、Python3対応は機械的に進められます。テスト大事。当然Python3での変更を調べることになります。Python3を仕事で使う前にオープンソースプロジェクトに貢献しつつ、はまりどころを事前に知ることができます。しかも、世界レベルの開発者からのアドバイスまでもらえます。
  66. 66. http://www.voidspace.org.uk/python/articles/porting-mock-to-python-3.shtmlhttp://pypi.python.org/pypi/six

×