我创建了一个循环来运行列表中的函数。
在我运行的每个函数结束时,我将下一个函数附加到此列表中。
这就是我将它们附加到列表中的方式:
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) )
有没有办法可以将带参数的函数附加到列表中?
答案 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])