Ответ 1
Вот предложение с использованием прокси.
def selfDecorator(func):
def wrap(*args, **kw):
return SelfGenerator(func, args, kw)
return wrap
class SelfGenerator(object):
"""This class implements the generator interface"""
def __init__(self, generator, args, kw):
self.generator = generator(self, *args, **kw)
def __iter__(self):
return self
def __next__(self):
return next(self.generator)
next = __next__
def send(self, value):
return self.generator.send(value)
@selfDecorator
def gen(self, x): # your generator function with self
for i in range(x):
yield self
for x in gen(5):
print x # prints <__main__.SelfGenerator object at 0x02BB16D0>
Так как SelfGenerator
является прокси исходным генератором, он имеет тот же интерфейс и может использоваться полностью как собственный генератор Pythons.
Первый ответ
Вы не можете вызвать генератор сам по себе:
>>> def generator():
for value in g:
yield value
>>> g = generator()
>>> next(g)
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
next(g)
File "<pyshell#11>", line 2, in generator
for value in g:
ValueError: generator already executing
Угадывание: самость в документе может не означать сам генератор, а объект, какой-то государственный держатель, который, возможно, разделяется между некоторыми генераторами.
Точнее, ориентированный граф ограничений требуется без циклов, когда он рассматривается как неориентированный граф.
Это заставляет меня думать, что генератор не ссылается на его "идентичное" выполнение. Почему он должен получать свою собственную ценность из-за итерации? Он может использовать локальную переменную.
Корутинцы происходят от Симулы. Возможно, чтобы понять, что собой представляет собой, вы можете взглянуть на язык.