万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

先週の金曜(2008年7月25日)
ミラクルリナックスでの[コードリーディング]Python Code Reading

StringIO.py
達人が書いた
ウェブコア(株)柴田淳(しばたあつし)ex.しばたじゅんはシンガーソングライター

コピーモジュール
リファレンスが変数になる。
書き換え可能オブジェクト

ファイル風(のふりをする)のオブジェクトを実現する。ファイルを同じ操作をして同じ機能を実現する。
PurePython
どうすれば高速になるかのケーススタディ
300行の短さ。

検索ランキング9位


ファイル処理をメモ時(文字列)でエミュレート
ネットワーク処理などで利用される。
Webのデータやメールを読む。
処理が文字列面倒。
マルチスレッド、高速性

Pythonのオブジェクト構造
ファーストクラスオブジェクトアトリビュートに他のオブジェクトを持つ
データ(文字列やリストなど)
呼び出し可能オブジェクト(メソッド)
Attributeに名前が付いている。

■特殊メソッド
オブジェクトの振る舞いを決めるmwそっど
__XXX_()という名前を持つ
__aaa__()

ex)a+1 → a_add(1)
内部的に+はaddでやってる

listは足し算 ※意外と知られていない

extend・・ オブジェクトの中身を変えてしまう。
■ファイルオブジェクト
・ファイルの読み書きを行う組み込みオブジェクト
メソッドとしてインターフェースを持つ。
read()、write()、close()、seek()など
・インターフェースメソッドを使ってオブジェクトを操作
他のint、itとは違う。


Pythonユーザ会のドキュメント化されている。
分類ごとに説明れている。

■ファイル風オブジェクト
・ファイルオブジェクトと(ほぼ)同じインターフェースを持つ。
StringIO
・ファイル処理をメモリ(文字列)でエミュレート
・ファイル処理が必要とされる場面で実ファイルを必要としない。
・ネットワーク処理などで利用される。
今回はPurePython版、

書き込みが遅いなどの問題がある。
要らないデータが色々やりとりされる。

・c.f.cStringIO こちらの方が早い。継承が出来る。
ある一定のサイズまではデータが保持される。
継承して作れる。
Pythonの銘々規則(PEP8?)を違反している。
ファイル名は全部小文字でなければならない。
かっこわるい。モジュールの代表例。

△使う場面。
URLOpenの返り値
logなど。いちいちファイルを作ると面倒なので、テンポラリで使ったりする。

■使いかた

from StringIO import StringIO

どういうことを目指しているか?

■StringIO.py
323行のソース(2.5.x)
基底クラスを取り込んでいたりしている。
ファイルオブジェクトをイテレータ
古くから有るが手直ししている
シンプルなクラス(非New Style クラス)
→旧スタイルクラス、新スタイルクラス(違い 基底クラスとしてオブジェクトを継承しているかどうか。
イテレータ
書き込みの処理の高速化
test()関数を持っている。デグレッションなど。

しばしば早かったりする。
C1のStrngIO・・速度の解決など
サブクラスにすることが出来る。

■コードリーディング
トリプルクォーテーション?
特殊メソッド
第1引数にselfが来る。
C++などのthisみたいな。
closeオブジェクトは空にしている、Buflistは空にしていない。
再オープンできない。一度クローズしたらおしまい。

■考察(宿題)
・文字列の連ケチを使ってwrite()メソッドを実装するとどの程度「遅く」なるのか
・StringIOのように、「〜のふりをするオブジェクト」の例
・想定される異様方法
WEBブラウザ?
・StringIOをサブクラスする。
・具体的な案、実装

■来てる人のこと
s〜〜がめんどう
C.StringIO
print文が使えるのでそこに入れる。
getValueは読み込み位置に関係なく返してくれる。
→ptint文を中で決める。
StandIOで