0

最初にいくつかの背景。単純なファイル形式を解析していて、後でPythonコードで結果を再利用したいので、非常に単純なクラス階層を作成し、作業中のテキストファイルの元のレコードからオブジェクトを構築するパーサーを作成しました。 。

同時に、データをレガシーデータベースにロードしたいと思います。このデータベースのローダーファイルは、単純なタブ区切り形式を採用しています。最も簡単な方法は、次のようなことを行うことです。

print "{0}\t{1}\t....".format(record.id, record.attr1, len(record.attr1), ...)

Templateただし、印刷する列が非常に多いため、クラスを使用して、何が何であるかを少し簡単に確認できるようにすると思いました。

templ = Template("$id\t$attr1\t$attr1_len\t...")

substituteそして、呼び出しで使用されるマップの代わりに、派生値のいくつかの追加キーワードを使用して、レコードを使用できると考えました。

print templ.substitute(record, attr1_len=len(record.attr1), ...)

残念ながら、これは失敗し、レコードインスタンスに属性がないことを訴えます__getitem__

だから私の質問は2つあります:

  • 実装する必要がありますか?実装__getitem__する場合はどうすればよいですか?
  • 名前をすでに知っている一連の属性を出力するだけでよい、このようなもののよりエレガントな方法はありますか?
4

2 に答える 2

2

attr1 の長さをレコード クラスのプロパティまたは属性にする場合 (タイトルが示すように、実際にはインスタンス属性を出力するだけです)、これを実行できます。

attrs = ['id', 'attr1', 'attr1_len', ...]
print '\t'.join(getattr(record, attr) for attr in attrs)
于 2010-06-08T12:10:32.150 に答える
2
class MyRecord:
    #....  
    def __getitem__(self, key):
        return getattr(self, key)
于 2010-06-08T12:00:01.820 に答える