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

时间:2013-06-08 17:37:03

标签: python list function arguments append

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

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

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

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) )

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

2 个答案:

答案 0 :(得分:3)

是的,使用functools.partial()创建一个 new callable,它将使用参数调用您的函数:

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))

partial()更快,并提供传递更多参数的选项。

答案 1 :(得分: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])