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.
Python 3世代が考える(?)
Python 2/3コード共存戦略
金谷 敦志
2014-05-29 #osakapy
1
自己紹介
• 金谷 敦志 (Twitter: @todogzm)
• 株式会社ラクス

北米市場向けWebサービス

Rigniteの開発に従事
• 先日オフィス移転しました!
2
自己紹介
• Python歴は1年半
• テキスト分類にPythonを使用
• recurly-client-pythonのPython 2/3対応
• Check.iO Level 11 (前回と比べて+1)
• http://www.che...
目次
• Python 3世代のつらみ
• Python 3.xの変更点
• Python 2/3コード共存戦略
4
Python 3世代のつらみ
• Check.iOのFriendly numberを解いていたときのお話
• 0.3Mの部分を取得するには、12341234 / (1000 ** 2) - 12だ!
5
• >>> 12341234 / (1000 ** 2) - 12

0
• えっ…? えっ?(狼狽)
6
$ python -V
Python 2.7.5
7
_人人人人人人人人人人人人_
> int / intはintが返る <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
Python 2→3の変更点
• 古い構文や関数の削除
• print文はprint関数に
• unicodeリテラルの廃止 → Python 3.3で復活
• except Error, eはexcept Error as eに
• 関数の削...
他にも色々…
• 自分がハマった経験
• Python 2のhttplib.HTTPMessageはコンストラクタ
引数にHTTPレスポンスのテキストを渡すとヘッダもパー
ズする。が、Python 3のhttp.client.HTTPMessa...
Python 3もそれなりにハマる!

でも2よりはハマらないよ!(多分)
10
さぁ今すぐにPython 3…ん?
• と思ったらPython 2.7 2020年まで延命のお知らせ
• 膨大な資産もあるし、ちょっと今すぐPython 2を捨てられない!
11
Python 3世代の感触
• 3.x対応しているライブラリが多いので、そろそ
ろ移行しても困らない事が多いので移行しよう
• ライブラリ開発者は2.xから離れられない!
• 2.x / 3.x両対応がツラいが、戦略を持って行
えば何とかなる!...
Python 2/3
コード共存戦略
13
まずはじめに
• 公式文書がよく出来ているので、穴が空くほど
読む
• http://docs.python.jp/3.3/howto/
pyporting.html
14
共通して行う作業
• 2系、3系それぞれサポートするバージョンを決める
• お勧めは2.7と3.3
• テストコードを書いておく
• toxを使い複数バージョンでテストする環境を用意
する
• 2系のコードであれば、from __future_...
tox
• Pythonライブラリを複数のPythonバージョンでテストする
ためのツール
• 各Pythonバージョンのvirtualenvを作成してテスト実行
• 設定ファイルtox.iniに下記を書いて実行
• Pythonのバージョン ...
コード共存の戦略
• Sixを使う (同じコードベースで2/3両方動かす)
• Python 3のコードに対して3to2を使う

(保守するコードはPython 3ベース)
• Python 2のコードに対して2to3を使う
• Sixもコード...
Sixを使う場合
• Python 2と3の違いを吸収するライブラリ
• https://pythonhosted.org/six/
18
Sixを使う場合
• ライブラリの整
理統合に対して
はsix.moves が
2/3の違いを吸収
• ある程度の構文
の違いもライブ
ラリでカバー
• six.u(), six.b()
19
Sixを使う場合
• メリット
• 互換性問題に対する多くの解決策を提供してくれる
• メンテナンスするコードが1種類だけになる
• デメリット
• 依存ライブラリが1コ増える
• IDEがsix.movesを解釈してくれない場合がある
20
Python 3のコードに対して
3to2を使う
• Python 3系のコードを2系に変換するツール
• 名前の割に(?)実行時にはPython 2.7が必須
• パッケージ配布の際には自動で動くようにする 

(setup.py内で自動変換...
3to2の実行結果例
22
3to2を使う場合
• メリット
• 2to3と比較してコード変換精度が高い
• Python 3の構文が利用できる
• デメリット
• サードパーティーのプロジェクトであること
• 新しい構文に対応していない場合があること
23
Python 2のコードに対して
2to3を使う
• Python 2のコードを3に変換するツール
• Python標準ツール
24
2to3を使う場合
• メリット
• 標準搭載
• 変換そのものの不具合は少ない
• futureを多用すれば変換精度が高い
• デメリット
• Python 2のあいまいな挙動
25
Sixもコード変換も使わず2/3
互換を目指す
• 【警告】 の道
• 構文エラー! → 古い構文の書き直し
• ライブラリが見つからない! → バージョンごとに
読み込むライブラリを変更
• Can't convert 'bytes' obj...
Sixもコード変換も使わず2/3
互換を目指す
• それでも頑張るのであれば、下記は必須
• Python 2系の動作環境は2.7のみ
• from __future__ は積極的に使う
• 早めに諦める気持ちを持つ
27
Sixもコード変換も使わず2/3
互換を目指す
• メリット
• メンテナンスするコードが1種類だけになる
• デメリット
• メリットを忘れさせるのに十分な障壁がある
28
コード共存のまとめ
• サポートするPythonバージョンを決める
• テストを書き、toxで複数バージョンをテストす
る環境を整備する
• 自分の環境に合った戦略を選ぶ

(Six, 2to3, 3to2…)
29
現在活動中
• 増田さん作のelapheのPython 3対応を模索中
• Sixもコード変換も使わず…挫折中 orz
• おとなしく2to3作戦でいきます…
30
おわり
31
Upcoming SlideShare
Loading in …5
×

Python 2/3コード共存戦略 #osakapy

5,748 views

Published on

大阪Pythonユーザの集まり 2014/05 発表資料
http://osakapy.connpass.com/event/6369/

Published in: Software
  • Be the first to comment

Python 2/3コード共存戦略 #osakapy

  1. 1. Python 3世代が考える(?) Python 2/3コード共存戦略 金谷 敦志 2014-05-29 #osakapy 1
  2. 2. 自己紹介 • 金谷 敦志 (Twitter: @todogzm) • 株式会社ラクス
 北米市場向けWebサービス
 Rigniteの開発に従事 • 先日オフィス移転しました! 2
  3. 3. 自己紹介 • Python歴は1年半 • テキスト分類にPythonを使用 • recurly-client-pythonのPython 2/3対応 • Check.iO Level 11 (前回と比べて+1) • http://www.checkio.org/user/todogzm/ 3
  4. 4. 目次 • Python 3世代のつらみ • Python 3.xの変更点 • Python 2/3コード共存戦略 4
  5. 5. Python 3世代のつらみ • Check.iOのFriendly numberを解いていたときのお話 • 0.3Mの部分を取得するには、12341234 / (1000 ** 2) - 12だ! 5
  6. 6. • >>> 12341234 / (1000 ** 2) - 12
 0 • えっ…? えっ?(狼狽) 6
  7. 7. $ python -V Python 2.7.5 7 _人人人人人人人人人人人人_ > int / intはintが返る <  ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄
  8. 8. Python 2→3の変更点 • 古い構文や関数の削除 • print文はprint関数に • unicodeリテラルの廃止 → Python 3.3で復活 • except Error, eはexcept Error as eに • 関数の削除 → raw_input(), reduce(), apply(), xargs(), unicode(), has_key(), … • ライブラリの整理統合 • 特にhttp周りの整理がWeb系開発者にはツラい • 解釈が変わっちゃった… • 文字列はstr1つのみ!Unicode! bytesとの暗黙的な変換はできない! • int / int はfloatを返す 8
  9. 9. 他にも色々… • 自分がハマった経験 • Python 2のhttplib.HTTPMessageはコンストラクタ 引数にHTTPレスポンスのテキストを渡すとヘッダもパー ズする。が、Python 3のhttp.client.HTTPMessage はそういう処理がなかった… orz • HTTPコネクションに対するレスポンスのヘッダ部分が 2だとイテレータ型なのに3だとイテレータ型じゃなかっ た… orz 9
  10. 10. Python 3もそれなりにハマる!
 でも2よりはハマらないよ!(多分) 10
  11. 11. さぁ今すぐにPython 3…ん? • と思ったらPython 2.7 2020年まで延命のお知らせ • 膨大な資産もあるし、ちょっと今すぐPython 2を捨てられない! 11
  12. 12. Python 3世代の感触 • 3.x対応しているライブラリが多いので、そろそ ろ移行しても困らない事が多いので移行しよう • ライブラリ開発者は2.xから離れられない! • 2.x / 3.x両対応がツラいが、戦略を持って行 えば何とかなる!かもしれない 12
  13. 13. Python 2/3 コード共存戦略 13
  14. 14. まずはじめに • 公式文書がよく出来ているので、穴が空くほど 読む • http://docs.python.jp/3.3/howto/ pyporting.html 14
  15. 15. 共通して行う作業 • 2系、3系それぞれサポートするバージョンを決める • お勧めは2.7と3.3 • テストコードを書いておく • toxを使い複数バージョンでテストする環境を用意 する • 2系のコードであれば、from __future__を使う 15
  16. 16. tox • Pythonライブラリを複数のPythonバージョンでテストする ためのツール • 各Pythonバージョンのvirtualenvを作成してテスト実行 • 設定ファイルtox.iniに下記を書いて実行 • Pythonのバージョン (複数指定可) • 実行したいテストのコマンド • テスト実行に使うモジュール 16
  17. 17. コード共存の戦略 • Sixを使う (同じコードベースで2/3両方動かす) • Python 3のコードに対して3to2を使う
 (保守するコードはPython 3ベース) • Python 2のコードに対して2to3を使う • Sixもコード変換も使わず2/3互換を目指す 17
  18. 18. Sixを使う場合 • Python 2と3の違いを吸収するライブラリ • https://pythonhosted.org/six/ 18
  19. 19. Sixを使う場合 • ライブラリの整 理統合に対して はsix.moves が 2/3の違いを吸収 • ある程度の構文 の違いもライブ ラリでカバー • six.u(), six.b() 19
  20. 20. Sixを使う場合 • メリット • 互換性問題に対する多くの解決策を提供してくれる • メンテナンスするコードが1種類だけになる • デメリット • 依存ライブラリが1コ増える • IDEがsix.movesを解釈してくれない場合がある 20
  21. 21. Python 3のコードに対して 3to2を使う • Python 3系のコードを2系に変換するツール • 名前の割に(?)実行時にはPython 2.7が必須 • パッケージ配布の際には自動で動くようにする 
 (setup.py内で自動変換のコードを書く) • https://wiki.python.org/moin/3to2 21
  22. 22. 3to2の実行結果例 22
  23. 23. 3to2を使う場合 • メリット • 2to3と比較してコード変換精度が高い • Python 3の構文が利用できる • デメリット • サードパーティーのプロジェクトであること • 新しい構文に対応していない場合があること 23
  24. 24. Python 2のコードに対して 2to3を使う • Python 2のコードを3に変換するツール • Python標準ツール 24
  25. 25. 2to3を使う場合 • メリット • 標準搭載 • 変換そのものの不具合は少ない • futureを多用すれば変換精度が高い • デメリット • Python 2のあいまいな挙動 25
  26. 26. Sixもコード変換も使わず2/3 互換を目指す • 【警告】 の道 • 構文エラー! → 古い構文の書き直し • ライブラリが見つからない! → バージョンごとに 読み込むライブラリを変更 • Can't convert 'bytes' object to str implicitly 26 orz
  27. 27. Sixもコード変換も使わず2/3 互換を目指す • それでも頑張るのであれば、下記は必須 • Python 2系の動作環境は2.7のみ • from __future__ は積極的に使う • 早めに諦める気持ちを持つ 27
  28. 28. Sixもコード変換も使わず2/3 互換を目指す • メリット • メンテナンスするコードが1種類だけになる • デメリット • メリットを忘れさせるのに十分な障壁がある 28
  29. 29. コード共存のまとめ • サポートするPythonバージョンを決める • テストを書き、toxで複数バージョンをテストす る環境を整備する • 自分の環境に合った戦略を選ぶ
 (Six, 2to3, 3to2…) 29
  30. 30. 現在活動中 • 増田さん作のelapheのPython 3対応を模索中 • Sixもコード変換も使わず…挫折中 orz • おとなしく2to3作戦でいきます… 30
  31. 31. おわり 31

×