หากตัวสร้างของคุณบริสุทธิ์ในแง่ที่ว่าเอาต์พุตนั้นขึ้นอยู่กับอาร์กิวเมนต์ที่ส่งผ่านและหมายเลขขั้นตอนเท่านั้นและคุณต้องการให้ตัวสร้างผลลัพธ์เริ่มต้นใหม่ได้นี่เป็นตัวอย่างข้อมูลเรียงลำดับที่อาจเป็นประโยชน์:
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)
กับส่วนที่เหลือของรหัสของคุณไม่เปลี่ยนแปลง