我有一个Twisted ServerFactory,我从listenTCP开始。如何启动与该工厂相关的任务? 我试过了:
if __name__ == "__main__":
factory = MyFactory()
reactor.listenTCP(555558, factory)
reactor.connectTCP("127.0.0.1", 55555, MyConnector(factory))
sanitizing = task.LoopingCall(factory.sanitize())
sanitizing.start(3, False)
reactor.run()
但这会引发错误:
Unhandled error in Deferred:
Unhandled Error
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1192, in run self.mainLoop()
File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1201, in mainLoop
self.runUntilCurrent()
File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 824, in runUntilCurrent
call.func(*call.args, **call.kw)
File "/usr/lib/python2.7/dist-packages/twisted/internet/task.py", line 218, in __call__
d = defer.maybeDeferred(self.f, *self.a, **self.kw)
--- <exception caught here> ---
File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 139, in maybeDeferred
result = f(*args, **kw)
exceptions.TypeError: 'NoneType' object is not callable
工厂实际上在听,所以我不明白为什么它是NoneType。
答案 0 :(得分:1)
在Python中,name()
是调用对象(通常是函数或方法)的语法。通过扩展,name(another_name())
是您调用对象的方式(由名称another_name
引用),然后将该调用的返回值传递给另一个对象(由名称name
引用)。 / p>
要将此应用于您的示例,LoopingCall(factory.sanitize())
是您致电factory.sanitize
并将返回值传递给LoopingCall
的方式。
这很可能不是你的意思。相反,您可能打算将factory.sanitize
作为参数传递给LoopingCall
。如果您希望LoopingCall
定期调用factory.sanitize
,则需要执行此操作。我只是猜测这就是你想要的 - 你实际上没有在你的问题中明确说出你想要的东西。 :)