• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
BPStudy#54 そろそろPython3
 

BPStudy#54 そろそろPython3

on

  • 7,366 views

 

Statistics

Views

Total Views
7,366
Views on SlideShare
7,096
Embed Views
270

Actions

Likes
14
Downloads
7
Comments
1

9 Embeds 270

http://aodag.posterous.com 175
https://twitter.com 83
http://192.168.245.164 5
https://si0.twimg.com 2
http://webcache.googleusercontent.com 1
http://us-w1.rockmelt.com 1
http://a0.twimg.com 1
https://web.tweetdeck.com 1
http://192.168.245.161 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

11 of 1 previous next

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • good
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    BPStudy#54 そろそろPython3 BPStudy#54 そろそろPython3 Presentation Transcript

    • 今年は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とcolander対応する予定だけど、優先度高くないよ。※ mcdonc_はpyramidの主要開発者です
    • aodag: deformとかなんで2.4とかまだサポートしてるのん?mcdonc_: ちゃんとした理由はないよ。3対応するなら2.6以降だけのサポートでいいね。aodag: pyramidと同じようにワンソースアプローチだといいね。mcdonc: それでうまくやってけそうだからね。
    • mcdonc_: Start Hacking ;)
    • (え、俺がやるの....?)
    • ということでpylonsprojectとrepoze、Paste の以下のライブラリについてpy3対応 ● peppercorn リリース済 ● colander リリース済  ● deform リリース済 ● repoze.who 作業中やろうかなと思うもの ● pyramid_who ● pyramid_rpc ● PasteScript
    • 現在Python3対応しているライブラリhttp://pypi.python.org/pypi?:action=browse&c=533&show=allSQLAlchemylxmlPyQtbottlepyramidSphinxnumpy/scipyipython...
    • Python3対応のアプローチ(1)ワンソースアプローチ 2to3変換やバージョンごとのモジュール切り替え を行いません
    • Python3対応のアプローチ(1)ワンソースアプローチPylons、repozeはこの方法2系は2.6以降のサポートにします2.5以前は文法の差異を吸収できませんtoxにより、対応バージョンのテストを一度に実行できるようにします 3系は3.0,3.1は 無視してもかまいません。
    • 今現在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依存ライブラリなどインストールpip install -e .
    • 手順(?) 既存のテストを確認する そもそも 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__ の有無でlistとstrを振り分けるは、もう使えません。ちゃんとisinstanceを使いましょう。
    • Python3対応の勘所(4)basestringがなくなった2系のstrとunicode共通のスーパークラスだったbasestringがなくなりました。isisntance(s, basestring) はできませんバージョンチェックで str_typesを作って対応2系のstr_typesstr_types = (str,unicode)3系のstr_typesstr_types = (str,)
    • 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 としましょう。
    • 相対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