如何将函数调用添加到列表?

时间:2014-11-12 07:23:40

标签: python list function python-2.7

我有一个使用以下函数的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)”添加,一旦我将迭代列表,我就不能调用函数调用,因为解释器将引用列表项作为字符串而不是函数调用......

5 个答案:

答案 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 ):
        ...