SlideShare a Scribd company logo
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.checkio.org/user/todogzm/
3
目次
• 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に
• 関数の削除 → raw_input(), reduce(), apply(), xargs(), unicode(), has_key(),
…
• ライブラリの整理統合
• 特にhttp周りの整理がWeb系開発者にはツラい
• 解釈が変わっちゃった…
• 文字列はstr1つのみ!Unicode! bytesとの暗黙的な変換はできない!
• int / int はfloatを返す 8
他にも色々…
• 自分がハマった経験
• Python 2のhttplib.HTTPMessageはコンストラクタ
引数にHTTPレスポンスのテキストを渡すとヘッダもパー
ズする。が、Python 3のhttp.client.HTTPMessage
はそういう処理がなかった… orz
• HTTPコネクションに対するレスポンスのヘッダ部分が
2だとイテレータ型なのに3だとイテレータ型じゃなかっ
た… orz
9
Python 3もそれなりにハマる!

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

(保守するコードはPython 3ベース)
• Python 2のコードに対して2to3を使う
• Sixもコード変換も使わず2/3互換を目指す
17
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内で自動変換のコードを書く)
• https://wiki.python.org/moin/3to2
21
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' object to str implicitly
26
orz
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

More Related Content

What's hot (20)

PDF
[DL輪読会]SlowFast Networks for Video Recognition
Deep Learning JP
 
PDF
双対性
Yoichi Iwata
 
PDF
最小カットを使って「燃やす埋める問題」を解く
shindannin
 
PDF
第6回 配信講義 計算科学技術特論A(2021)
RCCSRENKEI
 
PDF
Rolling Hashを殺す話
Nagisa Eto
 
PDF
π計算
Yuuki Takano
 
PDF
TensorFlow XLAは、 中で何をやっているのか?
Mr. Vengineer
 
PDF
第10回 配信講義 計算科学技術特論B(2022)
RCCSRENKEI
 
PDF
いまさら聞けないarmを使ったNEONの基礎と活用事例
Fixstars Corporation
 
PDF
AIによるアニメ生成の挑戦
Koichi Hamada
 
PDF
PFIセミナー 2013/02/28 「プログラミング言語の今」
Preferred Networks
 
PDF
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Preferred Networks
 
PDF
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
 
PDF
TFLite_and_PyTorch_Mobile
yusuke shibui
 
PDF
15. Transformerを用いた言語処理技術の発展.pdf
幸太朗 岩澤
 
PPTX
充足可能性問題のいろいろ
Hiroshi Yamashita
 
PDF
brainfuckを吐く自作言語bf-reusable
roodni
 
PDF
Rustで楽しむ競技プログラミング
yoshrc
 
PDF
リクルートにおける画像解析事例紹介
Recruit Technologies
 
[DL輪読会]SlowFast Networks for Video Recognition
Deep Learning JP
 
双対性
Yoichi Iwata
 
最小カットを使って「燃やす埋める問題」を解く
shindannin
 
第6回 配信講義 計算科学技術特論A(2021)
RCCSRENKEI
 
Rolling Hashを殺す話
Nagisa Eto
 
π計算
Yuuki Takano
 
TensorFlow XLAは、 中で何をやっているのか?
Mr. Vengineer
 
第10回 配信講義 計算科学技術特論B(2022)
RCCSRENKEI
 
いまさら聞けないarmを使ったNEONの基礎と活用事例
Fixstars Corporation
 
AIによるアニメ生成の挑戦
Koichi Hamada
 
PFIセミナー 2013/02/28 「プログラミング言語の今」
Preferred Networks
 
Optunaを使ったHuman-in-the-loop最適化の紹介 - 2023/04/27 W&B 東京ミートアップ #3
Preferred Networks
 
プログラムを高速化する話Ⅱ 〜GPGPU編〜
京大 マイコンクラブ
 
TFLite_and_PyTorch_Mobile
yusuke shibui
 
15. Transformerを用いた言語処理技術の発展.pdf
幸太朗 岩澤
 
充足可能性問題のいろいろ
Hiroshi Yamashita
 
brainfuckを吐く自作言語bf-reusable
roodni
 
Rustで楽しむ競技プログラミング
yoshrc
 
リクルートにおける画像解析事例紹介
Recruit Technologies
 

Similar to Python 2/3コード共存戦略 #osakapy (20)

PPTX
MicroPythonのCモジュールを作ってみる
Kenta IDA
 
PDF
明日からはじめるネットワーク運用自動化
Taiji Tsuchiya
 
PPTX
Why python
Mikio Kubo
 
PPTX
Why python
Mikio Kubo
 
PPTX
GBDC 勉強会 #1 Python を用いたツール作成工数の最小化
Yutaka Kato
 
PPTX
鳥取python勉強会 第1回
Yuji Oyamada
 
PPTX
2017/12/21 虎の穴 Python勉強会
虎の穴 開発室
 
PDF
Python パッケージの影響を歴史から理解してみよう!
Kir Chou
 
PPTX
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
Katsuhiro Morishita
 
PDF
「Python言語」はじめの一歩 / First step of Python
Takanori Suzuki
 
PPTX
私の好きなPython構文 vol.2 #nds46
civicpg
 
PDF
scikit-learnを用いた機械学習チュートリアル
敦志 金谷
 
PPTX
2017 02-14 キュー実装に見る排他処理
Akishige TAKEKOSHI
 
PPTX
鳥取python勉強会 第2回
Yuji Oyamada
 
PDF
Ruby開発の現場を支える技術
hiroponz
 
PDF
Python札幌 2012/06/17
Shinya Okano
 
PPTX
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
Katsuhiro Morishita
 
PPT
Python languageupdate (2004)
泰 増田
 
PDF
スクレイピングとPython
Hironori Sekine
 
PDF
Introduction Pycon2010
(shibao)芝尾 (kouichiro)幸一郎
 
MicroPythonのCモジュールを作ってみる
Kenta IDA
 
明日からはじめるネットワーク運用自動化
Taiji Tsuchiya
 
Why python
Mikio Kubo
 
Why python
Mikio Kubo
 
GBDC 勉強会 #1 Python を用いたツール作成工数の最小化
Yutaka Kato
 
鳥取python勉強会 第1回
Yuji Oyamada
 
2017/12/21 虎の穴 Python勉強会
虎の穴 開発室
 
Python パッケージの影響を歴史から理解してみよう!
Kir Chou
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
Katsuhiro Morishita
 
「Python言語」はじめの一歩 / First step of Python
Takanori Suzuki
 
私の好きなPython構文 vol.2 #nds46
civicpg
 
scikit-learnを用いた機械学習チュートリアル
敦志 金谷
 
2017 02-14 キュー実装に見る排他処理
Akishige TAKEKOSHI
 
鳥取python勉強会 第2回
Yuji Oyamada
 
Ruby開発の現場を支える技術
hiroponz
 
Python札幌 2012/06/17
Shinya Okano
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
Katsuhiro Morishita
 
Python languageupdate (2004)
泰 増田
 
スクレイピングとPython
Hironori Sekine
 
Introduction Pycon2010
(shibao)芝尾 (kouichiro)幸一郎
 
Ad

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