Python 内联回调函数中的回调

Python 内联回调函数中的回调,python,callback,twisted,yield,Python,Callback,Twisted,Yield,假设我有这样一个函数: 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) @

假设我有这样一个函数:

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类,它将执行一些特定的任务,每次得到结果时,它都会调用给定的回调函数。我想创建一个只做一件事的泛型类,而不是创建一个做特定事情的新函数。例如:

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
我是新来的。所以,我不确定这样做是否正确。是吗


谢谢

您的问题是
回调
内部的
重复
应该是
self.callback

除此之外,您的示例应该完全按照编写的那样工作。

如果它返回一个延迟,并且您希望在退出
repeat
函数之前等待结果,您只需要
产生self.callback
。在您的示例中,回调函数是一个普通函数(它实际上返回
None
),因此让步没有任何好处-但是允许它产生非延迟值,因此不会造成任何伤害。从:

没有延期的事情也可能会被放弃,你的发电机 将使用发送回的相同对象恢复。这意味着收益 执行大致相当于maybeDeferred的操作


如果您的回调确实返回了延迟的函数(例如,如果它也是一个
inlineCallbacks
修饰函数),那么将暂停执行
repeat
,直到延迟完成。这在您的应用程序中可能是可取的,也可能是不可取的。

好的,我已经解决了,谢谢。但我的问题是关于设计。不确定是对还是错。@Johnsyweb好的,我添加了一些评论