AssertionError:None不可调用

时间:2015-08-16 17:03:22

标签: python twisted

我正在学习如何编程扭曲,并通过Dave Peticolas'教程(http://krondo.com/wp-content/uploads/2009/08/twisted-intro.html)。我试图在第3部分结束时解决建议的练习 - 在countdown.py上进行多次独立倒计时。这是我的代码,以及我得到的错误:

#!/usr/bin/python

class countdown(object):

    def __init__(self):
        self.timer = 0

    def count(self, timer):
        if self.timer == 0:
            reactor.stop()
        else:
            print self.timer, '...'
            self.timer -= 1
            reactor.callLater(1, self.count)


from twisted.internet import reactor

obj = countdown()
obj.timer = 10
reactor.callWhenRunning(obj.count(obj.timer))

print 'starting...'
reactor.run()
print 'stopped.'

执行时:

$ ./countdown.py
10 ...
Traceback (most recent call last):
  File "./countdown.py", line 21, in <module>
    reactor.callWhenRunning(obj.count(obj.timer))
  File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 666, in callWhenRunning
    _callable, *args, **kw)
  File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 645, in addSystemEventTrigger
    assert callable(_f), "%s is not callable" % _f
AssertionError: None is not callable

我假设我在利用对象变量时没有做正确的事情;虽然我不确定我做错了什么。

1 个答案:

答案 0 :(得分:4)

在传递之前,您正在呼叫您可以调用obj.count()调用的返回结果不可调用。

您需要传入方法,而不是调用它的结果:

reactor.callWhenRunning(obj.count, (obj.timer,))

你的方法的位置参数(这里只是obj.timer)应该作为一个单独的元组给出。

仔细观察,你甚至不需要传递obj.timer作为论据。毕竟,你可以在self上访问它,不需要单独传递它:

class countdown(object):
    def __init__(self):
        self.timer = 0

    def count(self):
        if self.timer == 0:
            reactor.stop()
        else:
            print self.timer, '...'
            self.timer -= 1
            reactor.callLater(1, self.count)

并相应调整callWhenRunning()来电:

reactor.callWhenRunning(obj.count)