gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 04:29:49 24 4
gpt4 key购买 nike

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

...但是:

  • 创建要返回的对象的深拷贝非常耗时。
  • 对象有很多属性,所以定义辅助变量似乎不是一个优雅的解决方案。
  • yield inside __next__ 将不起作用,因为它在每次迭代中返回不同的类型(生成器)。
  • 我可以在 __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

我可能在这里遗漏了一些东西,但我想不通。

最佳答案

Generator 似乎是个好主意。替换你的 __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

关于python - 在 __next__() 中修改对象之前返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72208511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com