Doge log

Abby CTO 雑賀 力王のオフィシャルサイトです

Python力を高めるためのライブラリコードリーディング

id:yuroyoropython力を高めるとか言ってたのを聞いて、自分の場合どうだったかなあと。
思い入れがあるものを簡単に。まあ参考になれば。

pure python

まずはpure python

django

結構python初心者のころからdjangoのソースは読んでた。
多分、今ほど大きくなかったからだと思う。
学べることはPEP8、__import__の使い方、デコレータによるトランザクション管理などなど多岐にわたる。
但し、いきなりモデル周りに手を出すときついのでWEB側の入り口である方
django.core.handlers.base.py
ぐらいがいいかなと。
middlewareってどうやって呼び出し、実行してるか、urlの解決方法などから入ると割りととっつきやすいかと。
フルスタック故カバーしてる範囲が多いのでずっと参考になる。

標準ライブラリのソース

あんまし読んでない気もする。必要に応じて読む感じ。
ここは興味のある分野のところを読めばいい気がするなあ。
とりあえず以下ぐらい読んでとSocketに慣れるといいかも。

  1. SocketServer関連(HttpServerも含め)

僕の場合は

  1. wsgiref
  2. multiprocessing
  3. namedtuple

とか新機能周りはチラ見するぐらい。
とりあえずPythonのソースを手元においておいて損はない。

PythonのソースについてるDemo

Pythonのソース側には実はいろいろなexampleがあるんだけど、そこにはちょっとマイナーものまであって、知
らない機能が発見できたりする。
僕はここでimpモジュールの使い方を知った。

zope.interface

多分一番苦労したところ。全部は読んでない。
twistedをいじるにあたってこいつの仕掛けが気になってチラ見。
ここでframeとか__new__とか__call__とかのトリッキーなコードを学んだ。

Twisted

基本コアを中心に。必要に応じて各プロトコルを。
こいつは言うほどトリッキーではなく、継承関係を把握すればまあなんとかなる。
selectとか、イベント駆動などの知識はここがベース。
メソッドの上書きなど一部トリッキーなところもある。
とりあえずreactorの切り替えの方法のところ、モジュール差し替え方法が勉強になる。
deferだけでも勉強になる。

pgasync

postgresqlプロトコルを軽く見たかったのとmysql版のmysqlasyncを作る材料で。
あとTwistedを使ったクライアントのコードのbk的なものを学べる。
(mysqlasync公開すんの忘れたなあ。一部対応できてないところがあるし)
reactorがrunするまでの間の話とかそーいうのをマジメに勉強できる。

eventlet

NonBlocking+協調スレッドという面白い代物。
協調スレッドのスケジューリング、イベント駆動など深い所が学べる。
僕的にこいつは「トランポリン」「二つのループ」ってキーワードが鍵かなあと。
イベント駆動サーバーを書きたいけどdeferの嵐は避けたいなどの諸問題を解決する手助けになる。
個人的には画期的なコードだなと思った。

werkzeug

一部で話題のWSGI Utils.
それほど大きくなく、シンプル。
WSGIを理解する上で有用。

C拡張など

C拡張などは分けた。とりあえずCPythonを読みに行く前に慣らしでC拡張からはじめる方がいいと思う。
(Cに慣れてるなら別にいい)

multiprocessing

とりあえずPythonのC拡張はたるいの一言で、クラスを作るのがしんどい。
なのでまず参照カウント上げ下げのない関数ベースものから見て行った。
multiprocessingのfdパッシング周りが小さいのでそこを参考。
書き方の基本がわかる。
(IPC、sendmsgとかわかってないと?かも知れないけど)

python2.6のselect

これも上記と同じような理由。あんまり参照上げ下げのないものから慣れる。
僕はkqueueのところだけ見た。
ここでは簡単なラッパーなクラスを使ってるのでクラスの作り方などがわかる。

python-mysql

mysqlドライバ。上よりもう少し複雑になったもの。
読んでいくにはmysqlのソース必須だけど。
pure python部もあるのでその辺の兼ね合い等が学べる。
昔に比べてpythonで判断するところが増えてきてたりと昔のものから追いかけると面白い。

pyev

pyevは綺麗にラッパーが書かれている。
なのでラッパー周りで参考になる。
pyeventはpyrexベースなので参考にならず。

CPython

C拡張をいじり出すと見たくなってくる。
一部だけ必要に応じてチラ見。
rubyと違ってソースが平置きされてないのでどこに何が書いてあるか最初はわかりにくい。

  1. Objects(Pythonのオブジェクト系のソース)
  2. Python(runtime系ソース)

Stackless Python

一部のマニア向け。
仕掛けがわかればなんとなくわかる感じ。
とりあえずceval.cでスタックをpython object作って保持してるねーとかがなんとなく程度。