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
その他
変数に後から取り込んだテキストデータを逃がして、
必要が出るまで、文字列の結合を避けている箇所があるけど、
自分で組むなら、コードを複雑にしてまで、パフォーマンス改善はしないかな。
(必要があれば別。)
パフォーマンス優先のコードは、個人使用ベースではなかなか使わないから、勉強になります。