假设我有这样的功能:
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类,它将执行一些特定的任务,每次获得结果时,它都会调用给定的回调函数。我想创建一个只执行一件事的泛型类,而不是创建一个执行特定事物的新函数。 E.g:
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
我是新来的扭曲。所以,我不确定这是否是正确的方法。是吗?
谢谢
答案 0 :(得分:2)
您的问题是callback
内的repeat
应该是self.callback
。
除此之外,你的例子应该完全按照书面形式工作。
答案 1 :(得分:0)
如果它返回延迟并且您希望在退出yield self.callback
函数之前等待结果,那么仅需要到repeat
。在您的示例中,您的回调是一个正常函数(它有效地返回None
),因此屈服没有优势 - 但是允许它产生非延迟值,因此不会造成任何伤害。来自inlineCallbacks docs:
非延期的东西也可能会产生,而你的发电机也会产生 将被发回的同一对象恢复。这意味着产量 执行大致相当于maybeDeferred的操作。
如果您的回调 返回延迟(例如,如果它也是inlineCallbacks
修饰函数),则屈服将暂停执行repeat
,直到延迟完成。在您的申请中,这可能是也可能不是。