Я работаю с API-интерфейсом лака в лаке 4. Способ, которым он создает записи журнала, - это Dispatch'ing против него и передача в обратном вызове. Простая версия:В python, как мне создать класс генератора?
class vlog(object):
def __init__(self):
self.body = []
def callback(self, vap, cbd, priv):
self.body.append(cbd)
def main(self):
self.vlog = varnishapi.VarnishLog(sopath="libvarnishapi.so")
while True:
ret = self.vlog.Dispatch(self.callback)
if ret == 0:
time.sleep(0.1)
Мне нужно сделать еще несколько вещей в self.callback, чтобы собрать данные правильно, но что угодно.
МОЙ РЕАЛЬНЫЙ вопрос: как я могу превратить вышеуказанный класс в генератор? Мой идеал использование было бы что-то вроде этого:
vlog_inst = vlog()
for log_aggregate in vlog_inst:
pass
Просто положить заявление «выход» в функции обратного вызова не вызывает итерацию. (удивительно, что добавление отчета о выходе также приводит к тому, что все мои заявления о печати также не дают результата).
Определение '' __iter__' и next' ('__next__' в Python 3). Для этого нужен дубликат. –
Поскольку это источник данных, использующий обратный вызов, я не могу «перезапустить» итерацию с помощью функции next() ... обратный вызов не имеет ничего, что я могу дать также «возвратным» данным ... и следующий заставил бы меня " повторно подключиться к лог-потоку, что означало бы, что я потерял данные. Кроме того, поскольку источник данных фактически бесконечен, генераторы являются лучшим подходом. – Jason