在 __next__() 中修改对象之前返回对象

Returning object before modifying it in __next__()

我正在编写一个 return 自身修改的迭代器对象,我希望原始对象成为迭代过程的一部分,因此在修改之前需要 returned .

...但是:

一个工作但效率低下的例子,代码:

from copy import deepcopy

class MyObject():
    def __init__(self, n):
        self.n = n
   
    def __str__(self):
        return str(self.n)

    def __iter__(self):
        return self

    def __next__(self):
        if self.n >= 10:
            raise StopIteration

        self_copy = deepcopy(self)
        self.n += 1
        return self_copy

for x in MyObject(n=7):
    print(x)

输出:

7
8
9

我可能遗漏了什么,但我想不通。

生成器似乎是个好主意。将您的 __iter____next__ 替换为:

    def __iter__(self):
        while not self.n >= 10:
            yield self
            self.n += 1

(在这种特殊情况下,我们当然可以改为 while self.n < 10:。)

或者,要使您的对象本身成为自己的迭代器,正如我们在下面的评论中所讨论的,您可以使用一个标志:

class MyObject():
    def __init__(self, n):
        self.n = n
        self.iterated_original = False
   
    def __str__(self):
        return str(self.n)

    def __iter__(self):
        return self

    def __next__(self):
        if not self.iterated_original:
            self.iterated_original = True
        else:
            self.n += 1
        if self.n >= 10:
            raise StopIteration
        return self

for x in MyObject(n=7):
    print(x)

或者由于 iterated_original 理想情况下设置为 True 原始版本被迭代之后,这里是我能做的最晚的:

    def __next__(self):
        if self.iterated_original:
            self.n += 1
        if self.n >= 10:
            raise StopIteration
        try:
            return self
        finally:
           self.iterated_original = True