我有一个使用以下函数的Python代码:
def func1(arguments a, b, c):
def func2(arguments d, e, f):
def func3(arguments g, h, i):
上述每个功能都在产品上配置CLI命令。
此外,对于上述每个函数,都有de-init函数删除CLI命令。
def de_init_func1(arguments x, y, z):
def de_init_func2(arguments l, m, n):
def de_init_func3(arguments q, r, s):
假设我有一个脚本,它使用函数func1,func2和func3配置许多CLI命令,并且在脚本完成之前,脚本应该删除它配置的所有CLI命令。
为此,每次调用func1 / 2/3时,我都需要将等效的de_init_func CALL添加到列表中,因此在脚本结束时,我可以迭代此列表,并调用de-init方法一个接一个。
如何将“func1(arguments)call”添加到列表中而不将其添加到列表中时调用它。
如果我只是将func1(arguments)调用作为字符串“func1(arguments)”添加,一旦我将迭代列表,我就不能调用函数调用,因为解释器将引用列表项作为字符串而不是函数调用......
答案 0 :(得分:5)
在最简单的级别,您可以简单地使用元组来引用函数调用。例如,元组func1(a, b, c)
将引用对(func1, a, b, c)
的调用。然后,您可以安全地将这些元组放在列表中。
稍后执行由这样的元组表示的函数(比如t
),只需使用:
t[0](*t[1:])
即:使用typle剩余的参数调用t [0]中的函数。
答案 1 :(得分:1)
我建议使用functools.partial:
from functools import partial
L.append(partial(de_init_func1, x, y, z))
L.append(partial(de_init_func2, l, m, n))
for f in L:
f()
如果需要,它支持kwargs。此外,如果函数有共享参数或者某些函数在开头是未知的,您可以推迟传递直到最后一次调用。
答案 2 :(得分:0)
你可以这样做:
setup = [func1, func2, func3]
teardown = [de_init_func1, de_init_func2, de_init_func3]
map(lambda func: func(arguments), setup) # calls all the setup functions
map(lambda func: func(arguments, teardown) # calls all the teardown functions
答案 3 :(得分:0)
如何添加" func1(参数)调用"在将列表添加到列表时不调用它的列表。
至少有两种方式:
def test(x):
print "arg was "+str(x)
toDoList = []
args = ["hello"]
toDoList.append(lambda:test(*args))
# doesn't run yet
# run it
for f in toDoList:
f()
如果您认为在运行之前可能需要检查或更改args,那么下一个更好:
def test(x):
print "arg was "+str(x)
toDoList = []
args = ["hello"]
toDoList.append({'f': test, 'a': args})
# to run
for item in toDoList:
item['f'](*item['a'])
答案 4 :(得分:0)
我认为你应该上课; funcx作为构造函数(__init__),de_init_funcx作为析构函数(__del __)。
class Class1:
def __init__( self, arguments, a, b ,c ):
...
def __del__( self, arguments, x, y, z ):
...