在保留对象的同时更改python迭代器

2024-04-25 04:08:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个SQLAlchemy查询,它是iterable,假设它是一个名为query的对象。当您对其进行迭代时,会得到如下项:

Table1('Column1', 'Column2')

在查询对象上联接表并对其进行迭代时,会得到元组:

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

我知道我可以使用生成器对查询对象进行迭代,如下所示:

(each[0] for each in query)

但这并没有保留对象query上的任何其他方法,而是将其转换为生成器对象。有没有一种简单的方法来改变query的迭代部分的行为,而不使用其他方法?你知道吗


Tags: 对象方法inforsqlalchemyiterablequery元组
1条回答
网友
1楼 · 发布于 2024-04-25 04:08:08

我明白了,我只需要使用__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

相关问题 更多 >