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

スローダウン、ハングを一発解決 スレッドダンプはトラブルシューティングの味方 #wlstudy
スローダウン、ハングを一発解決 スレッドダンプはトラブルシューティングの味方 #wlstudyスローダウン、ハングを一発解決 スレッドダンプはトラブルシューティングの味方 #wlstudy
スローダウン、ハングを一発解決 スレッドダンプはトラブルシューティングの味方 #wlstudy
Yusuke Yamamoto
 

What's hot (20)

ドローンによる収音のためのビームフォーミング
ドローンによる収音のためのビームフォーミングドローンによる収音のためのビームフォーミング
ドローンによる収音のためのビームフォーミング
 
レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方レコメンドエンジン作成コンテストの勝ち方
レコメンドエンジン作成コンテストの勝ち方
 
東京大学2020年度深層学習(Deep learning基礎講座) 第9回「深層学習と自然言語処理」
東京大学2020年度深層学習(Deep learning基礎講座) 第9回「深層学習と自然言語処理」東京大学2020年度深層学習(Deep learning基礎講座) 第9回「深層学習と自然言語処理」
東京大学2020年度深層学習(Deep learning基礎講座) 第9回「深層学習と自然言語処理」
 
KDD2018 DiDi 「large-scale order dispatch in on-demand ride-hailing platforms:...
KDD2018 DiDi 「large-scale order dispatch in on-demand ride-hailing platforms:...KDD2018 DiDi 「large-scale order dispatch in on-demand ride-hailing platforms:...
KDD2018 DiDi 「large-scale order dispatch in on-demand ride-hailing platforms:...
 
【メタサーベイ】Video Transformer
 【メタサーベイ】Video Transformer 【メタサーベイ】Video Transformer
【メタサーベイ】Video Transformer
 
対立強化学習による鬼ごっこゲームでのスキル獲得(RSJ2018ポスター)
対立強化学習による鬼ごっこゲームでのスキル獲得(RSJ2018ポスター)対立強化学習による鬼ごっこゲームでのスキル獲得(RSJ2018ポスター)
対立強化学習による鬼ごっこゲームでのスキル獲得(RSJ2018ポスター)
 
帰納バイアスが成立する条件
帰納バイアスが成立する条件帰納バイアスが成立する条件
帰納バイアスが成立する条件
 
[DL輪読会]FOTS: Fast Oriented Text Spotting with a Unified Network
[DL輪読会]FOTS: Fast Oriented Text Spotting with a Unified Network[DL輪読会]FOTS: Fast Oriented Text Spotting with a Unified Network
[DL輪読会]FOTS: Fast Oriented Text Spotting with a Unified Network
 
強化学習の分散アーキテクチャ変遷
強化学習の分散アーキテクチャ変遷強化学習の分散アーキテクチャ変遷
強化学習の分散アーキテクチャ変遷
 
ナレッジグラフ/LOD利用技術の入門(後編)
ナレッジグラフ/LOD利用技術の入門(後編)ナレッジグラフ/LOD利用技術の入門(後編)
ナレッジグラフ/LOD利用技術の入門(後編)
 
全力解説!Transformer
全力解説!Transformer全力解説!Transformer
全力解説!Transformer
 
楽しい研究のために今からできること 〜新しく研究を始める皆さんへ〜
楽しい研究のために今からできること 〜新しく研究を始める皆さんへ〜楽しい研究のために今からできること 〜新しく研究を始める皆さんへ〜
楽しい研究のために今からできること 〜新しく研究を始める皆さんへ〜
 
文章を読み、理解する機能の獲得に向けて-Machine Comprehensionの研究動向-
文章を読み、理解する機能の獲得に向けて-Machine Comprehensionの研究動向-文章を読み、理解する機能の獲得に向けて-Machine Comprehensionの研究動向-
文章を読み、理解する機能の獲得に向けて-Machine Comprehensionの研究動向-
 
スローダウン、ハングを一発解決 スレッドダンプはトラブルシューティングの味方 #wlstudy
スローダウン、ハングを一発解決 スレッドダンプはトラブルシューティングの味方 #wlstudyスローダウン、ハングを一発解決 スレッドダンプはトラブルシューティングの味方 #wlstudy
スローダウン、ハングを一発解決 スレッドダンプはトラブルシューティングの味方 #wlstudy
 
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
実践 Amazon Mechanical Turk ※下記の注意点をご覧ください(回答の質の悪化・報酬額の相場の変化・仕様変更)
 
対話テキストの自動要約
対話テキストの自動要約対話テキストの自動要約
対話テキストの自動要約
 
研究分野をサーベイする
研究分野をサーベイする研究分野をサーベイする
研究分野をサーベイする
 
Neural word embedding as implicit matrix factorization の論文紹介
Neural word embedding as implicit matrix factorization の論文紹介Neural word embedding as implicit matrix factorization の論文紹介
Neural word embedding as implicit matrix factorization の論文紹介
 
分布あるいはモーメント間距離最小化に基づく統計的音声合成
分布あるいはモーメント間距離最小化に基づく統計的音声合成分布あるいはモーメント間距離最小化に基づく統計的音声合成
分布あるいはモーメント間距離最小化に基づく統計的音声合成
 
第3回ナレッジグラフ推論チャレンジ2020の紹介
第3回ナレッジグラフ推論チャレンジ2020の紹介第3回ナレッジグラフ推論チャレンジ2020の紹介
第3回ナレッジグラフ推論チャレンジ2020の紹介
 

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

Python3と向かい合ってみる
Python3と向かい合ってみるPython3と向かい合ってみる
Python3と向かい合ってみる
Atsuo Ishimoto
 
Python札幌 2012/06/17
Python札幌 2012/06/17Python札幌 2012/06/17
Python札幌 2012/06/17
Shinya Okano
 

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

MicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみるMicroPythonのCモジュールを作ってみる
MicroPythonのCモジュールを作ってみる
 
明日からはじめるネットワーク運用自動化
明日からはじめるネットワーク運用自動化明日からはじめるネットワーク運用自動化
明日からはじめるネットワーク運用自動化
 
Why python
Why pythonWhy python
Why python
 
Why python
Why pythonWhy python
Why python
 
GBDC 勉強会 #1 Python を用いたツール作成工数の最小化
GBDC 勉強会 #1 Python を用いたツール作成工数の最小化GBDC 勉強会 #1 Python を用いたツール作成工数の最小化
GBDC 勉強会 #1 Python を用いたツール作成工数の最小化
 
鳥取python勉強会 第1回
鳥取python勉強会 第1回鳥取python勉強会 第1回
鳥取python勉強会 第1回
 
2017/12/21 虎の穴 Python勉強会
2017/12/21 虎の穴 Python勉強会2017/12/21 虎の穴 Python勉強会
2017/12/21 虎の穴 Python勉強会
 
Python3と向かい合ってみる
Python3と向かい合ってみるPython3と向かい合ってみる
Python3と向かい合ってみる
 
Python パッケージの影響を歴史から理解してみよう!
Python パッケージの影響を歴史から理解してみよう!Python パッケージの影響を歴史から理解してみよう!
Python パッケージの影響を歴史から理解してみよう!
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識 第3版
 
「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python「Python言語」はじめの一歩 / First step of Python
「Python言語」はじめの一歩 / First step of Python
 
私の好きなPython構文 vol.2 #nds46
私の好きなPython構文 vol.2 #nds46私の好きなPython構文 vol.2 #nds46
私の好きなPython構文 vol.2 #nds46
 
scikit-learnを用いた機械学習チュートリアル
scikit-learnを用いた機械学習チュートリアルscikit-learnを用いた機械学習チュートリアル
scikit-learnを用いた機械学習チュートリアル
 
2017 02-14 キュー実装に見る排他処理
2017 02-14 キュー実装に見る排他処理2017 02-14 キュー実装に見る排他処理
2017 02-14 キュー実装に見る排他処理
 
鳥取python勉強会 第2回
鳥取python勉強会 第2回鳥取python勉強会 第2回
鳥取python勉強会 第2回
 
Ruby開発の現場を支える技術
Ruby開発の現場を支える技術Ruby開発の現場を支える技術
Ruby開発の現場を支える技術
 
Python札幌 2012/06/17
Python札幌 2012/06/17Python札幌 2012/06/17
Python札幌 2012/06/17
 
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
PythonとRによるデータ分析環境の構築と機械学習によるデータ認識
 
Python languageupdate (2004)
Python languageupdate (2004)Python languageupdate (2004)
Python languageupdate (2004)
 
スクレイピングとPython
スクレイピングとPythonスクレイピングとPython
スクレイピングとPython
 

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