次のアプローチを使用して、MySQL データベースから行を辞書として (SSDictCursor を使用して) プルし、いくつかの処理を行っています。
from collections import namedtuple
class Foo(namedtuple('Foo', ['id', 'name', 'age'])):
__slots__ = ()
def __init__(self, *args):
super(Foo, self).__init__(self, *args)
# ...some class methods below here
class Bar(namedtuple('Bar', ['id', 'address', 'city', 'state']):
__slots__ = ()
def __init__(self, *args):
super(Bar, self).__init__(self, *args)
# some class methods here...
# more classes for distinct processing tasks...
を使用するnamedtuple
には、必要なフィールドを事前に正確に把握する必要がありますが、これで問題ありません。ただし、ユーザーが単純なSELECT *
ステートメントをプログラムに入力できるようにしたいと考えています。プログラムは、結果セットの行を反復処理し、これらの異なるクラスを使用して複数のタスクを実行します。これを機能させるために、私のクラスは、カーソルから入ってくる N 個のフィールドをどうにかして調べ、namedtuple
定義によって期待される名前に対応する特定のサブセット M < N のみを取得する必要があります。
私が最初に考えたのは、各クラスに適用できる単一のデコレータを作成してみることでした。このデコレータは、クラスを調べて期待されるフィールドを確認し、適切な引数のみを新しいオブジェクトに渡します。しかし、ここ数日でデコレータについて読み始めたばかりで、まだ自信がありません。
だから私の質問は2つの部分に分かれています:
- これは、装飾されている特定のクラスに必要なフィールドを特定する単一のデコレータで行うことは可能ですか?
- 同じ機能を備えた、使いやすく、変更しやすく、理解しやすい代替手段はありますか?
各結果セットに何百万行もあるテーブルとフィールドの潜在的な順列が多すぎるため、1 つの汎用namedtuple
サブクラスを記述してそれぞれの異なるタスクに対処することはできません。クエリ時間と使用可能なメモリが制限要因であることが証明されています。
必要に応じて:
>>> sys.version
'2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)]'