Python Code Reading 03 行ってきました

7月25日、会場はミラクル・リナックス株式会社。
1度目に行った際は散々迷いましたが、3度目なのでさすがにもう道に迷いません。


今回の司会は柴田氏で、題材はStringIOです。
私は普段、主にPlone上でしかPythonを使わないので、
pythonのIO系の処理は全く使ったことがありません。
なので、Code Readingの事前の勉強の段階では、こんな(↓)状況でした。

from StringIO import *

f = StringIO("""
        test
        xxxxx
        xxxxxx
        code
        """)

(1)適当な文字列でStringIOを初期化、

s = [ "TESTAAA", "TESTBBB", "TESTCCC", "TESTDDD", "TESTEEE" ]
f.writelines(s)

(2)writelines()でテキストを追加。

buf = f.readlines()
print buf

(3)readlines()でテキストを読み込み、出力。
(4)「なぜだ? 何度やっても、さっき追加したテキストが出力されないぞ」




オチは、writelines()でテキストを追加すると、追加したテキストの分だけ、ファイル内位置を指すポインタが移動したからなのですが、こんな程度のこともわからない状態でした。

StringIOのコードで気になった点

if文の代わりに、max、minを使う。

コードの節約テクニックです。ただし、コードが読みづらくなってしまう。
pythonの理想的にこれはいいのかな?

## 必ず、0以上が返る
self.pos = max(0, pos)

## リストのサイズより大きい数字は返さない
newpos = min(self.pos+n, self.len)
メソッドを変数に入れて、横幅節約

このテクニックはもちろん使ってなかったけど、Python Code Readingでは何度も何度も見てる。

## 変数にいったん入れて、
write = self.write

## 使う事で、横幅節約
for line in iterable:
    write(line)
イテレータ

はいはい。Pythonを使い込んでる訳ではないので、
ループの方が手軽でイテレータを作ってまで使ってませんよっと。
これからはイテレータを使っていこうかな?

def __iter__(self):
    return self

def next(self):
    r = self.readline()
    if not r:
        # 次のエレメントがない時、StopIterationを返す
        raise StopIteration
    return r
その他

変数に後から取り込んだテキストデータを逃がして、
必要が出るまで、文字列の結合を避けている箇所があるけど、
自分で組むなら、コードを複雑にしてまで、パフォーマンス改善はしないかな。
(必要があれば別。)


パフォーマンス優先のコードは、個人使用ベースではなかなか使わないから、勉強になります。


感想

今回のStringIO.pyは読みやすいコードでした。
IO系の知識は全くなかった訳だから、今回学んだ分はまるまるPython知識に+で、かなりおいしい題材でした。
いいね。Python Code Reading。