Цепочка обратных вызовов с независимыми данными, не относящимися к цепочке - PullRequest
1 голос
/ 17 ноября 2011

Я пытаюсь выполнить простую последовательность обратного вызова в витой. Идея состоит в том, что я вхожу в сервис, и когда логин успешен, я начинаю посылать команды. Это мой код:

from   twisted.internet          import reactor, defer

class MyService:

    def __init__ (self):
        self.handle = None

    def login(self):
        def onConnect(handle):
            self.handle = handle
            return
        df = defer.Deferred().addCallback(onConnect)
        reactor.callLater(2, df.callback, "dummyhandle")
        return df

    def sendCommand(self, command):
        def onResult(result):
            print result
            return result

        if self.handle == None:
            print "Not logged in"
            return
        else:
            df = defer.Deferred().addCallback(onResult, result ="xxx")
        return df

my = MyService ()

my.login().addCallback(my.sendCommand, command = "format")
reactor.run()

Запуск этого кода приводит к следующей трассировке стека:

Unhandled error in Deferred: Traceback (most recent call last):   File "/usr/lib/python2.6/dist-packages/twisted/internet/base.py", line 1179, in mainLoop
    self.runUntilCurrent()   File "/usr/lib/python2.6/dist-packages/twisted/internet/base.py", line 778, in runUntilCurrent
    call.func(*call.args, **call.kw)   File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 280, in callback
    self._startRunCallbacks(result)   File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 354, in _startRunCallbacks
    self._runCallbacks()
--- <exception caught here> ---   File "/usr/lib/python2.6/dist-packages/twisted/internet/defer.py", line 371, in _runCallbacks
    self.result = callback(self.result, *args, **kw) exceptions.TypeError: sendCommand() got multiple values for keyword argument 'command'

Здесь важно то, что sendCommand не нужен результат входа в систему, а другие данные. Необходимо, чтобы вход в систему завершился (поэтому я хочу, чтобы он был в цепочке обратных вызовов), но он не заинтересован в результате входа в систему (если это не ошибка, которая все равно будет обрабатываться в цепочке ошибок). .

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 18 ноября 2011

Легко, обработчик должен иметь результат в качестве первого аргумента:

def sendCommand(self, in_result, command):
    do_the_stuff
...