我在使用一个生成器函数,比如:
def foo():
i=0
while (i<10):
i+=1
yield i
现在,我想选择在多次迭代后复制生成器,这样新的副本将保留内部状态(在示例中具有相同的“I”),但现在将独立于原始副本(即在副本上迭代不应更改原始副本)。
我试过使用copy.deepcopy
,但是我得到了一个错误:
"TypeError: object.__new__(generator) is not safe, use generator.__new__()"
很明显,我可以使用带计数器的常规函数来解决这个问题。 但我真的在寻找一个使用发电机的解决方案。
我能想到三种情况:
生成器没有副作用,您只希望能够遍历已经捕获的结果。您可以考虑使用cached generator而不是真正的生成器。您还可以共享缓存的生成器,如果有任何客户机走向您尚未访问过的项目,它将前进。这类似于tee()方法,但tee功能是在生成器/缓存本身中执行的,而不是要求客户端执行。
生成器有副作用,但没有历史记录,您希望能够在任何地方重新启动。考虑将其作为coroutine编写,在这里您可以随时传入要启动的值。
生成器有副作用和历史记录,这意味着生成器在G(x)处的状态取决于G(x-1)的结果,因此不能只将x传递回它以在任何地方启动。在这种情况下,我认为您需要更具体地说明您要做什么,因为结果不仅取决于生成器,还取决于其他数据的状态。也许,在这种情况下,有更好的方法。
对
itertools.tee
的评论也是我的第一个猜测。由于警告您在使用tee后不应再推进原始生成器,因此我可能会编写如下内容来派生副本:相关问题 更多 >
编程相关推荐