यदि आपका जनरेटर इस मायने में शुद्ध है कि इसका आउटपुट केवल उत्तीर्ण तर्कों और चरण संख्या पर निर्भर करता है, और आप चाहते हैं कि परिणामी जनरेटर पुनः आरंभ करने योग्य हो, तो यहां एक प्रकार का स्निपेट हो सकता है जो उपयोगी हो सकता है:
import copy
def generator(i):
yield from range(i)
g = generator(10)
print(list(g))
print(list(g))
class GeneratorRestartHandler(object):
def __init__(self, gen_func, argv, kwargv):
self.gen_func = gen_func
self.argv = copy.copy(argv)
self.kwargv = copy.copy(kwargv)
self.local_copy = iter(self)
def __iter__(self):
return self.gen_func(*self.argv, **self.kwargv)
def __next__(self):
return next(self.local_copy)
def restartable(g_func: callable) -> callable:
def tmp(*argv, **kwargv):
return GeneratorRestartHandler(g_func, argv, kwargv)
return tmp
@restartable
def generator2(i):
yield from range(i)
g = generator2(10)
print(next(g))
print(list(g))
print(list(g))
print(next(g))
आउटपुट:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[]
0
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1
y = list(y)
अपने शेष कोड के साथ अपरिवर्तित उपयोग कर सकते हैं।