2013年9月17日火曜日

PyCon APAC 2013 2日目に行ってきた(1) #pyconapac

今日も基調講演は聞けなかったんだけど、その日のうちにYouTubeにアップされていたので早速見てみたら、リアルタイムで見れなかったのがすごい悔やまれる内容だった。Pythonが遅いとか、信頼できるシステムを作りにくいとか言われるけど、本当この人の言っている通りだなぁと思った。自分は普段Java書いてて、Javaはたしかにスレッドがあるから速いしスケーラブルだけど、その速さ・スケーラブルさを必要とするシーンって一体どのぐらいあるんだろう?っていうのはいつも思っていて。よく「TwitterがRailsやめてJVMに移行したからこれからはJVMの時代だぜヒャッハー」みたいなことをいう人がいるけど、「TwitterレベルのトラフィックだからJVMが必要」なんであって大抵のケースにはJVMは必要ないんだよねー。だってDropboxですらPythonなんだもの。

あと、清水川さんの2.5から3.3まで対応させる話、ちょうどtomahawk をPython3対応しないとなぁと思っていたので渡りに舟だった。sixっていうモジュールは名前は知っていたんだけどあそこまで便利に使えるヤツだとは知らなかったので、その話が聞けただけでも今日は来た甲斐があった。

Keynote: One Million Lines of Python

  • Rian Hunterさん
  • Dropboxの3人めの社員
  • 最初の仕事はLinux版のデスクトップクライアントを作ることだった
  • 動画
  • C, Python, Haskell を書く
  • Python makes me feel good
動的型付け言語ではRobustなシステムは作れない?
  • You can build a reliable foundation with Python
  • We did (かっこいい!)
「Pythonが遅い」問題
  • あなたのコードのボトルネックはCPUバウンドな処理なのか?
    • たいてい違う
  • CPUバウンドじゃないなら、Pythonが遅くてもそれは関係ない
  • 本当にCPUバウンドなら、その部分だけCで書けばいい
GIL
  • multithreading以外にもmultiprocessingがある
Dynamically typed じゃなくて Duck typing
  • これ に感銘を受けた(The Zen of Duck Typing)

Python2.5から3.3で動作するツールの作り方

  • @shimizukawa さん
  • ビープラウド所属
  • スライド
  • 題材は sphinx-intl
sphinx-intl

国際化機能をサポートするツール

  • potから言語別poの生成、更新、ビルド
  • モチベーション
    • sphinxの対応バージョンが2.5-3.3
  • 本体500行ぐらい
2.5から3.3の違い
  • ライブラリの違い
  • ビルトイン関数の違い
  • 文法の違い
ライブラリの違い
  • optparse(まだある)
    • argparse(2.7以降、3.2以降)
  • OrderedDict(2.7から)
optparseとargparse
  • optparseよりargparseの方が使いやすい
  • 2.7, 3.2以降で標準ライブラリになった
    • pip install argparse でインストールできる
  • sphinx-intl ではoptparseをまだ使っている
    • なるべく標準ライブラリで動かしたいので
OrderedDict
  • Dicionaryだけど順番を保持してくれる便利なアレ
unicode, str, bytes
  • Python2のstr()はPython3のbytes()
  • 2のunicode()は3のstr()
funccodeと code _

関数オブジェクトの属性を取る
関数の引数の数や変数名とかいろいろ取れる

argcount = spam.func_code.co_argument
spam.func_code.co_varnames[:argcount]

argcount = spam.__code__.co_argument
spam.__code__.co_varnames[:argcount]
callable
  • 3.0,3.1で組み込み関数から消えたが3.2で復活した
  • そのオブジェクトが関数として呼び出し可能かどうか判定する
  • なんで削除されたのだろう?
try:
   callable = callable
except NameError:
   def callable(obj):
      __mro__みて__call__があるか調べる
execfile消滅
  • evalみたいなもん?
  • open(), read(), compile(), exec() をやれば同じことができる
  • execもPy3で文から式に変わった
with
  • 2.5から fromfuture import with_statement
  • 2.6以上はimportしなくても使える
print文とprint関数

Py2はprintは文

# Py2
> print 'spam', 'egg', 'ham'
spam egg ham

> print('spam', 'egg', 'ham')
('spam', 'egg', 'ham')

# Py3
> print('spam', 'egg', 'ham')
spam egg ham
print >>sys.stderr, ,
...
print 'done'

print('image', filename, 'loading...', end=' ', file=sys.stderr)
data = load_image(filename)
print('done.')
  • fromfuture import print_function
    • python2.5では使えない
    • じゃあprint関数を自分で実装するか!
じゃあどうやって2でも3でも動かすか
  • 2to3を使う
  • 両対応コードを書く
  • sixを使う
    • 2 x 3だからsixっていう名前らしい
2to3
  • Py3には2to3が用意されている
  • Py2をPy3に変換するプログラム
  • setuptoolsはsetup(2to3=True)って書いておくとインストール時に変換できる
Pros
  • 既存の資産を簡単に活かせる
Cons
  • 2to3は遅い
  • テスト実行のために毎回2to3を動かす必要がある
  • Py3でのみエラーがある場合、変換後のコードで問題があると面倒
両対応コード
  • 2to3がいらない
  • デバッグしやすい(重要)
  • Py2.6以降ならだいたいPy3互換の書き方ができる
  • Py2.4対応は可能だが絶望的
  • Py2.5を投げ捨てたくなる
  • 差異の吸収を自前で実装するのはつらい
    • print関数とかね
sphinx-intlはどうしたか
  • 諦めてsixを使った
six
  • 1.4.1 release (2013/9/2)
  • 2.4から3.3まで対応
  • 移動や名前変更は内部でバージョン判定して呼び直している(movesパッケージ)
  • execfileだけは自前で実装する必要がある
sphinx-intlで避けられなかった2to3
  • sphinxのconf.pyはユーザが書くものなので、2か3で書いてあるかわからない
  • execfileで読み込んでエラーが出たら2to3で変換する、という方法で対応した
パッケージングにおける課題
  • distlib登場。3.4で同梱予定
  • wheel登場。eggの代わりのパッケージのバイナリフォーマット
  • distribute廃止。setuptoolsに統合された。setuptoolsがPy3対応
Py2,3で動作するsetup.pyを作る
  • Py2,3で動作するようにしておく
  • 2to3もsetup.pyに対しては動かせない
  • 特定バージョンの場合に依存パッケージがある場合は自前で定義する
requires = [ 'six', 'polib', 'sphinx' ]
if sys.version_info < (2, 7):
   requires.append('ordereddict')

transifexってなんだろ?

  • 対応しているバージョンはsetup.pyのclassifiersにかこう!
    • Python3をclassifi入れるとpypiのロゴに3がつく!!
まとめ
  • Python2.5はそろそろ消滅するべき!
    • 会場内には一人しかいなかった
    • AppEngineはちょっと前まで2.5しかサポートしてなかった
    • CentOS5は2.4, CentOS6は2.6
  • 2to3は大変
  • sixは便利
質問
  • いろんなバージョンでテストするにはどうすれば?
    • テストはtox使うといろんなバージョンでテストできるので便利

Pythonサポーターズ

技術評論社

売り上げランキング: 57,978

0 件のコメント: