我正在学习如何编程扭曲,并通过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
我假设我在利用对象变量时没有做正确的事情;虽然我不确定我做错了什么。
答案 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)