2007年03月24日

第4章 実践編1 メインフレームのデータの扱い(5) 〜Pythonらしく〜

 「学習」や「忘却からの回復」も含めて注ぎ込んだ労力や時間を投資と考えた場合、私はPythonはとても投資対効果の高い言語であると考えています。前出のプログラムでも、制限時間内になんとか合格最低点をもらうことができました。
 ここからは勉強も兼ねてPythonらしい記述に変えてみましょう。見直さなければならない点(*)もありますし・・・
 投資対効果を落としてしまうことになるかもしれませんが(実際、基本的な機能は全く変わらないのに数倍の時間を費やしています)、その分Pythonの持つ奥深さ、素晴らしさを味わうことができるでしょう。

 (*)...パック10進数の項目などで、TABに相当する値があると変換されてしまい、表示が崩れてしまいます。

目標は以下のようなコードで呼び出せるようにしておくことです。

f = FBfile('test.ebc', 80)
for rec in f:
    FBrec(rec, "cp037").hexList()
f.close()

 手続き型言語に馴染んだ方なら、おそらく「ファイルをオープンして、読み込みをループで処理して、クローズ」が、ごく当り前の感覚だと思います。この連載の初めの方でも、そのような違和感のない形ですすめてきました。

 ここでは、Pythonのオブジェクト指向的な面を見てみましょう。

 いままで、ファイルを"open"して、開いたファイルを"read"読み取っているように思ってきました。しかし、ライブラリマニュアルを見ると、「以前の関数名である open() は互換性のために残されており、 file() の別名となっています。」となっています。そう、実は、"f=file(...)"で「ファイルオブジェクト」をfに返してもらい、そのファイルオブジェクトfに"read"で読み取った内容を返してもらっていたのです。

 これは些細ですが大きな違いです。例えば、COBOLだと「固定長バイナリファイルを1レコードxxバイトとして読み込む」といったように、「操作する側」が「操作される側」のことを細かく知ったうえで、それに合わせて指示を出さなければなりません。しかし、「操作される側」 -この例ではファイルオブジェクト- が、自分が操作された時、何をすれば良いか分かっていれば、操作する側は同じ操作でいろいろなオブジェクト(対象)を扱うことが可能となるはずです。後者でも「何をすれば良いか」分からせておく必要がありますので結局は同じだともいえますが、再利用性、柔軟性には大きな違いがあります。少し実験してみましよう。

 まず、固定長バイナリファイルを「オブジェクト」と考えます。このオブジェクトの属性は「ファイル名」「論理レコード長」です。

class FBfile(file):
def __init__(self, fn, lrecl):
file.__init__(self, fn, 'rb')
self.lrecl = lrecl

def next(self):
rec = self.read(self.lrecl)
if not rec:
raise StopIteration
return rec

 1行目で、"file"クラスを継承した新しいクラス、FBfile(Fixed Binary file)の定義を行っています。
 def __init__で、通常の初期処理に加えて、論理レコード長という属性をセットしています。これで、論理レコード長という属性をもつファイルオブジェクトを作成できるようになります。
 def nextは「イテレータ」に関する部分です。"next"メソッドが呼ばれたとき、論理レコード長分だけ読み取って返します。内容が空の時=ファイルの終わりに達した時は、繰り返し終了を返します。
 少し思い出してみてください。"for 〜 in 〜"をリストに対して適用した時、返ってきたのは各要素でしたが、文字列に対して適用した時は1バイトが返ってきました。Pythonでは、これは"for"命令の機能によるのではなく、「リスト」または「文字列」が呼ばれた時に自分が何を返すかを知っているからなのです。

 いかがですか? クラスといっても「コードの塊」に過ぎませんので、コードの再利用が洗練された方法で実現できたことがわかります。「バイナリファイルの時だけ"while"でループ」するのではなく、テキストファイルの時と全く同様の一貫した方法で固定長バイナリファイルが扱えるようになります。さらにPython では、簡潔で見た目にも美しい記述で表現できるのです。
posted by ymd at 14:04| Comment(0) | TrackBack(0) | 第4章 実践編
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/3588828

この記事へのトラックバック