Python 2.6に多数のインスタンス属性を印刷するエレガントな方法?
-
24-10-2019 - |
質問
最初にいくつかの背景。私は単純なファイル形式を解析しており、後で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__
もしそうなら、どうやって? - このようなもののためのよりエレガントな方法はありますか?
解決
class MyRecord:
#....
def __getitem__(self, key):
return getattr(self, key)
他のヒント
attr1の長さをレコードクラスのプロパティまたは属性にすると(タイトルが示すようにインスタンス属性を実際に印刷するだけです)、これを行うことができます。
attrs = ['id', 'attr1', 'attr1_len', ...]
print '\t'.join(getattr(record, attr) for attr in attrs)
所属していません StackOverflow