在 __next__() 中修改对象之前返回对象
Returning object before modifying it in __next__()
我正在编写一个 return 自身修改的迭代器对象,我希望原始对象成为迭代过程的一部分,因此在修改之前需要 returned .
...但是:
- 创建对象的深层副本到 return 非常耗时。
- 对象有很多属性,所以定义辅助变量似乎不是一个优雅的解决方案。
yield
inside __next__
将不起作用,因为它 return 在每次迭代中都是不同的类型(生成器)。
- 我可以在
__iter__
中使用 yield
来获取迭代器,但是我无法使用 __next__
来获取按需迭代(我的对象是图灵机,所以磁带的受控逐步打印会很好。
一个工作但效率低下的例子,代码:
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
我正在编写一个 return 自身修改的迭代器对象,我希望原始对象成为迭代过程的一部分,因此在修改之前需要 returned .
...但是:
- 创建对象的深层副本到 return 非常耗时。
- 对象有很多属性,所以定义辅助变量似乎不是一个优雅的解决方案。
yield
inside__next__
将不起作用,因为它 return 在每次迭代中都是不同的类型(生成器)。- 我可以在
__iter__
中使用yield
来获取迭代器,但是我无法使用__next__
来获取按需迭代(我的对象是图灵机,所以磁带的受控逐步打印会很好。
一个工作但效率低下的例子,代码:
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