2015-08-05 3 views
0

Я работаю с 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 

Просто положить заявление «выход» в функции обратного вызова не вызывает итерацию. (удивительно, что добавление отчета о выходе также приводит к тому, что все мои заявления о печати также не дают результата).

+3

Определение '' __iter__' и next' ('__next__' в Python 3). Для этого нужен дубликат. –

+0

Поскольку это источник данных, использующий обратный вызов, я не могу «перезапустить» итерацию с помощью функции next() ... обратный вызов не имеет ничего, что я могу дать также «возвратным» данным ... и следующий заставил бы меня " повторно подключиться к лог-потоку, что означало бы, что я потерял данные. Кроме того, поскольку источник данных фактически бесконечен, генераторы являются лучшим подходом. – Jason

ответ

0

Вы хотите, чтобы ваш класс был итерабельным. Генератор - это способ реализации итерации, но это не обязательно, чтобы сделать класс итерабельным.

Вы можете реализовать метод __iter__; если вы сделаете это генератор функции вы ничего не нужно:

def __iter__(self): 
    while True: 
     yield self.vlog.Dispatch(self.callback) 
Смежные вопросы