<p>恐怕唯一的解决方案可能是创建一个可重复填充的生成器包装类。编辑:原始未测试的代码无法工作。我现在重构了下面的想法并进行了测试。在</p>
<p>此对象将引发<code>StopIteration</code>一次,之后将重新启动。它打算与<code>Resettable</code>修饰符一起使用,它将一个<code>_func</code>属性添加到类中。它应该具有与原始发电机相同的功能。在</p>
<pre><code>class ResettableGenerator():
'''Generator wrapper that is resettable.'''
def __init__(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
self.start()
def __next__(self):
n = self.send(None)
return n
def __iter__(self):
yield from self._gen
def start(self):
self._gen = self._func(*self.args, **self.kwargs)
def send(self, *args, **kwargs):
try:
n = self._gen.send(*args, **kwargs)
return n
except StopIteration:
self.start()
raise
def throw(self, *args, **kwargs):
self._gen.throw(*args, **kwargs)
def close(self):
self._gen.close()
</code></pre>
<p>这是装修师:</p>
^{pr2}$
<p>像这样使用:</p>
<pre><code>@Resettable
def f():
yield 1
</code></pre>
<p>现在你可以这样做:</p>
<pre><code>>>> g=f()
>>> next(g)
1
>>> next(g)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 8, in __next__
File "<stdin>", line 16, in send
StopIteration
>>> next(g)
1 # generator has restarted itself
</code></pre>