SlideShare uma empresa Scribd logo
1 de 31
Baixar para ler offline
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

Mais conteúdo relacionado

Mais procurados

テンソル分解を用いた教師なし学習による変数選択
テンソル分解を用いた教師なし学習による変数選択テンソル分解を用いた教師なし学習による変数選択
テンソル分解を用いた教師なし学習による変数選択Y-h Taguchi
 
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ弘毅 露崎
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?Takuya Ueda
 
PRML 1.6 情報理論
PRML 1.6 情報理論PRML 1.6 情報理論
PRML 1.6 情報理論sleepy_yoshi
 
PPAPを何とかしたいがPHSも何とかしたい
PPAPを何とかしたいがPHSも何とかしたいPPAPを何とかしたいがPHSも何とかしたい
PPAPを何とかしたいがPHSも何とかしたいUEHARA, Tetsutaro
 
PsychoPyを使った初学者向けの心理実験環境の構築
PsychoPyを使った初学者向けの心理実験環境の構築PsychoPyを使った初学者向けの心理実験環境の構築
PsychoPyを使った初学者向けの心理実験環境の構築Hirokazu Ogawa
 
XAI (説明可能なAI) の必要性
XAI (説明可能なAI) の必要性XAI (説明可能なAI) の必要性
XAI (説明可能なAI) の必要性西岡 賢一郎
 
オンライン広告入札システムとZGC ( JJUG CCC 2021 Spring )
オンライン広告入札システムとZGC ( JJUG CCC 2021 Spring )オンライン広告入札システムとZGC ( JJUG CCC 2021 Spring )
オンライン広告入札システムとZGC ( JJUG CCC 2021 Spring )Hironobu Isoda
 
PsychoPy Builder:Code Componentの使い方
PsychoPy Builder:Code Componentの使い方PsychoPy Builder:Code Componentの使い方
PsychoPy Builder:Code Componentの使い方HiroyukiSogo
 
ブラックボックス最適化とその応用
ブラックボックス最適化とその応用ブラックボックス最適化とその応用
ブラックボックス最適化とその応用gree_tech
 
静的型付け言語Python
静的型付け言語Python静的型付け言語Python
静的型付け言語Pythonkiki utagawa
 
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2Preferred Networks
 
KDD Cup 2021 時系列異常検知コンペ 参加報告
KDD Cup 2021 時系列異常検知コンペ 参加報告KDD Cup 2021 時系列異常検知コンペ 参加報告
KDD Cup 2021 時系列異常検知コンペ 参加報告GentaYoshimura
 
DSIRNLP#1 ランキング学習ことはじめ
DSIRNLP#1 ランキング学習ことはじめDSIRNLP#1 ランキング学習ことはじめ
DSIRNLP#1 ランキング学習ことはじめsleepy_yoshi
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Keisuke Fukuda
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクションAkio Mitobe
 
音声合成のコーパスをつくろう
音声合成のコーパスをつくろう音声合成のコーパスをつくろう
音声合成のコーパスをつくろうShinnosuke Takamichi
 

Mais procurados (20)

テンソル分解を用いた教師なし学習による変数選択
テンソル分解を用いた教師なし学習による変数選択テンソル分解を用いた教師なし学習による変数選択
テンソル分解を用いた教師なし学習による変数選択
 
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ
文献注釈情報MeSHを利用した網羅的な遺伝子の機能アノテーションパッケージ
 
メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?メルカリ・ソウゾウでは どうGoを活用しているのか?
メルカリ・ソウゾウでは どうGoを活用しているのか?
 
多変量解析
多変量解析多変量解析
多変量解析
 
PRML 1.6 情報理論
PRML 1.6 情報理論PRML 1.6 情報理論
PRML 1.6 情報理論
 
PPAPを何とかしたいがPHSも何とかしたい
PPAPを何とかしたいがPHSも何とかしたいPPAPを何とかしたいがPHSも何とかしたい
PPAPを何とかしたいがPHSも何とかしたい
 
PsychoPyを使った初学者向けの心理実験環境の構築
PsychoPyを使った初学者向けの心理実験環境の構築PsychoPyを使った初学者向けの心理実験環境の構築
PsychoPyを使った初学者向けの心理実験環境の構築
 
XAI (説明可能なAI) の必要性
XAI (説明可能なAI) の必要性XAI (説明可能なAI) の必要性
XAI (説明可能なAI) の必要性
 
オンライン広告入札システムとZGC ( JJUG CCC 2021 Spring )
オンライン広告入札システムとZGC ( JJUG CCC 2021 Spring )オンライン広告入札システムとZGC ( JJUG CCC 2021 Spring )
オンライン広告入札システムとZGC ( JJUG CCC 2021 Spring )
 
ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開ヤフー社内でやってるMySQLチューニングセミナー大公開
ヤフー社内でやってるMySQLチューニングセミナー大公開
 
PsychoPy Builder:Code Componentの使い方
PsychoPy Builder:Code Componentの使い方PsychoPy Builder:Code Componentの使い方
PsychoPy Builder:Code Componentの使い方
 
ブラックボックス最適化とその応用
ブラックボックス最適化とその応用ブラックボックス最適化とその応用
ブラックボックス最適化とその応用
 
静的型付け言語Python
静的型付け言語Python静的型付け言語Python
静的型付け言語Python
 
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
最新リリース:Optuna V3の全て - 2022/12/10 Optuna Meetup #2
 
KDD Cup 2021 時系列異常検知コンペ 参加報告
KDD Cup 2021 時系列異常検知コンペ 参加報告KDD Cup 2021 時系列異常検知コンペ 参加報告
KDD Cup 2021 時系列異常検知コンペ 参加報告
 
DSIRNLP#1 ランキング学習ことはじめ
DSIRNLP#1 ランキング学習ことはじめDSIRNLP#1 ランキング学習ことはじめ
DSIRNLP#1 ランキング学習ことはじめ
 
Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22Effective Modern C++ 勉強会 Item 22
Effective Modern C++ 勉強会 Item 22
 
TiDBのトランザクション
TiDBのトランザクションTiDBのトランザクション
TiDBのトランザクション
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
音声合成のコーパスをつくろう
音声合成のコーパスをつくろう音声合成のコーパスをつくろう
音声合成のコーパスをつくろう
 

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

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

Semelhante a 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