Обратный вызов внутри функции inlineCallbacks - PullRequest
3 голосов
/ 09 июня 2011

Допустим, у меня есть такая функция:

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

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

1011 * Спасибо

Ответы [ 2 ]

2 голосов
/ 09 июня 2011

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

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

0 голосов
/ 18 июля 2016

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

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

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

...