Обратный вызов внутри функции inlineCallbacks

Предположим, у меня есть такая функция:

def display(this, that): print this, that 

и класс:

 class Runner(object): def __init__(self, callback): self.callback = callback self.loop = twisted.internet.task.LoopingCall(repeat) self.loop.start(0) @defer.inlineCallbacks def repeat(self): this = yield do_this() that = yield do_that() if this and that: # now I want to call the callback function yield self.callback(this, that) # makes sense? runner = Runner(display) reactor.run() 

В основном, что я хочу сделать, я хочу создать класс Runner, который будет выполнять некоторые конкретные задачи, и каждый раз, когда он получит результат, он будет вызывать данную функцию обратного вызова. Вместо создания новой функции, которая выполняет определенную вещь, я хочу создать общий класс, который делает только одно. Например:

 class TwitterReader(object): def __init__(self, callback): ... ... @defer.inlineCallbacks def get_messages(self): ... ... yield callback(messages) class MessageFilter(object): def __init__(self): self.bad_messages = open('bad_messages.txt', 'w') self.twitter = TwitterReader(self.message_received) def message_received(messages): for message in messages: for bad_word in BAD_WORDS: if bad_word in message: self.bad_messages.write(message) break 

Я новичок в скрученности. Итак, я не уверен, что это правильный способ сделать это. Это?

благодаря

    Ваша проблема в том, что callback внутри repeat должен быть self.callback .

    Кроме этого, ваш пример должен работать точно так же, как написано.

    Вам нужно будет только yield self.callback если он yield self.callback отложенную yield self.callback и вы хотите дождаться результата до выхода из функции repeat . В вашем примере ваш обратный вызов является нормальной функцией (которая эффективно возвращает None ), поэтому нет никакого преимущества для получения – тем не менее, это позволяет получать неизрасходованные значения, поэтому никакого вреда не будет. Из документов inlineCallbacks :

    Также могут быть получены вещи, которые не являются Отсрочками, и ваш генератор будет возобновлен с тем же отправленным объектом. Это означает, что выход выполняет операцию, приблизительно эквивалентную, возможно, Deferred.

    Если ваш обратный вызов возвращал отложенную (например, если она была также украшенной функцией inlineCallbacks ), то inlineCallbacks приостанавливала выполнение repeat до завершения отложенного завершения. Это может быть или не быть желательным в вашей заявке.