设置回调及其参数,稍后再调用回调

时间:2014-03-09 13:11:52

标签: python python-3.x

我有一个简单的类Foo,它允许这个类的用户设置一个回调,然后再运行三次。

这就是我解决问题的方法。

# API code
class Foo:
    def set_handler(self, callback, *args, **kwargs):
        self.callback = callback
        self.args = args
        self.kwargs = kwargs

    def run_three_times(self):
        for i in range(3):
            return self.callback(*self.args, **self.kwargs)

# User of the API code
if __name__ == '__main__':
    def myfunc(a, b, c='foo', d='bar'):
        print(a, b, c, d)

    foo = Foo()
    foo.set_handler(myfunc, 'arg1', 'arg2', c='arg3', d='arg4')
    foo.run_three_times()

所以你在foo.set_handler调用中看到我传递了回调及其参数。调用foo.run_three_times时,此方法会使用我之前传递的参数小心地调用回调。

这是做这件事的正确方法吗?是否有可能以更直接的方式通过myfunc('arg1', 'arg2', c='arg3', d='arg4')?像传递一个只包含回调及其参数作为单个函数的对象?

我正在寻找用Python-pseudocode表达的内容。

class Foo:
    def set_handler(self, callback):
        self.callback = callback

    def run_three_times(self):
        for i in range(3):
            return self.callback()

if __name__ == '__main__':
    def myfunc(a, b, c='foo', d='bar'):
        print(a, b, c, d)

    foo = Foo()
    mycallback = reference to myfunc('arg1', 'arg2', c='arg3', d='arg4')
    foo.set_handler(mycallback)
    foo.run_three_times()

1 个答案:

答案 0 :(得分:1)

为了充实@ doukremt的评论,以下是使用functools.partial的示例。

>>> from functools import partial
>>> my_list = partial(list, 'Hello world!')
>>> my_list
<functools.partial object at 0x10ce98838>
>>> my_list()
['H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!']

有关详细信息,请参阅上面的文档链接。