1

我创建了一个从列表中运行函数的循环。

在我运行的每个函数结束时,我将需要运行的下一个函数附加到此列表中。

这就是我将它们附加到列表中的方式:

self.FunctionBuffer["stack"].append( self.ApplyFunction )

我是这样称呼他们的:

if len(self.FunctionBuffer["stack"]) > 0:
    self.FunctionBuffer["stack"][0]()

一切都运行良好,除了现在我想为我附加的函数添加参数并且似乎没有这样的语法:

self.FunctionBuffer["stack"].append( self.ApplyFunction(arg1, arg2, arg3) )

有没有办法可以将带有参数的函数附加到列表中?

4

2 回答 2

3

是的,用于functools.partial()创建一个的可调用对象,它将使用参数调用您的函数:

from functools import partial

self.FunctionBuffer["stack"].append(partial(self.ApplyFunction, arg1, arg2, arg3))

functools.partial存储你的函数和你的参数,当你调用返回的部分对象时,它又会用这些参数调用函数。您也可以在调用该对象时添加额外的参数:

>>> from functools import partial
>>> def foo(bar, baz): print (bar, baz)
... 
>>> p = partial(foo, 1, 2)
>>> p()
(1, 2)
>>> p = partial(foo, 1)
>>> p(2)
(1, 2)

您可以使用 lambdas 实现相同的目标:

self.FunctionBuffer["stack"].append(lambda: self.ApplyFunction(arg1, arg2, arg3))

但是 apartial()更快,并且提供了传递更多参数的选项。

于 2013-06-08T17:43:49.377 回答
0

为什么不直接将包含您的参数的列表推入您要附加到的列表的第二个元素中FunctionBuffer

self.FunctionBuffer["stack"].append([self.ApplyFunction,[arg1, arg2, arg3]])

...

if len(self.FunctionBuffer["stack"]) > 0:
    self.FunctionBuffer["stack"][0][0](*self.FunctionBuffer["stack"][0][1])
于 2013-06-08T18:07:53.163 回答