0

反復可能なSQLAlchemyクエリがあります。たとえば、。というオブジェクトだとしqueryます。それを繰り返すと、次のようなアイテムが表示されます。

Table1('Column1', 'Column2')

クエリオブジェクトでテーブルを結合し、それを反復処理すると、代わりにタプルが取得されます。

(Table1('Column1', 'Column2'), Table2('Column3', 'Column4'))

次のように、ジェネレータを使用してクエリオブジェクトを反復処理できることはわかっています。

(each[0] for each in query)

ただし、これはオブジェクトの他のメソッドを保持せずquery、ジェネレータオブジェクトに変換します。query残りのメソッドをそのままにして、の反復部分の動作を変更する簡単な方法はありますか?

4

1 に答える 1

0

私はそれを理解しました。__getattr__別のオブジェクトへのアクセスを転送__iter__し、新しい機能で定義するために使用する必要がありました。これは、クエリを拡張するために他のメソッドを呼び出さない限り、SQLAlchemyで機能しました。これにより、これらの変更なしで新しいオブジェクトが作成されます。反復する予定の直前にオブジェクトをラップすることで、それを回避することができました。

class X:
    def __init__(self):
        self.prop1 = "prop1"

    def __iter__(self):
        yield 1
        yield 2
        yield 3

    def method(self):
        print "method 1"

class Y:
    def __init__(self):
        self.prop2 = "prop2"

    def __iter__(self):
        yield (1,2)
        yield (3,4)
        yield (5,6)

    def another_method(self):
        print "method 2"

class FirstInTuple:
    def __init__(self, obj):
        self.obj = obj

    def __getattr__(self, attr):
        return getattr(self.obj, attr)

    def __iter__(self):
        for each in self.obj:
            if hasattr(each, '__getitem__'):
                yield each[0]
            else:
                yield each

if __name__ == "__main__":
    x = X()
    y = Y()
    f_x = FirstInTuple(x)
    f_y = FirstInTuple(y)

    for each in x:
        print each
    print
    for each in y:
        print each
    print
    for each in f_x:
        print each
    print
    for each in f_y:
        print each
    print
    print f_x.prop1
    f_x.method()
    print
    print f_y.prop2
    f_y.another_method()

出力:

1
2
3

(1, 2)
(3, 4)
(5, 6)

1
2
3

1
3
5

prop1
method 1

prop2
method 2
于 2012-11-21T03:15:35.633 に答える