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

Posted

技术标签:

【中文标题】如何将函数调用添加到列表中?【英文标题】:How to add a function call to a list? 【发布时间】:2015-01-08 23:25:27 【问题描述】:

我有一个使用以下函数的 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) 调用”添加到列表中而不在将其添加到列表时调用它。

如果我只是将 func1(arguments) 调用添加为字符串“func1(arguments)”,一旦我将迭代列表,我将无法调用函数调用,因为解释器将引用列表项作为字符串而不是函数调用...

【问题讨论】:

所有函数都采用相同的参数吗? 没有。 func1、func2 和 func3 采用不同的参数。 我猜你可以用with语句legacy.python.org/dev/peps/pep-0343处理这个问题 “de_init”函数怎么样——de_init_func1 的参数是否与 func1 相同? 我根据您的输入更新了帖子。假设每个函数采用不同的参数。 【参考方案1】:

在最简单的级别上,您可以简单地使用元组来引用函数调用。例如,对func1(a, b, c) 的调用将被元组(func1, a, b, c) 引用。然后,您可以安全地将这些元组放入列表中。

要稍后执行由这样一个元组表示的函数(比如t),只需使用:

t[0](*t[1:])

即:调用 t[0] 中的函数,参数在类型的其余部分。

【讨论】:

我用它来创建一个 websocket.recv() 调用列表,但我忘了把 : 放在调用中,所以我的语句看起来像这样:t[0](*t[1]) 最终调用了 websocket 库 iter 函数,我想知道你能不能帮我解释一下那里发生了什么?或者任何以这种方式从元组列表中调用函数的阅读材料也会有所帮助。 websocket-client【参考方案2】:

我建议使用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。另外,如果函数有共享参数或者一开始是未知的,您可以将它们的传递推迟到最终调用。

【讨论】:

【参考方案3】:

我认为你应该使用 class ; funcx 作为构造函数 (__init__) 和 de_init_funcx 作为析构函数 (__del__)。

class Class1:
    def __init__( self, arguments, a, b ,c ):
        ...

    def __del__( self, arguments, x, y, z ):
        ...

【讨论】:

【参考方案4】:

你可以这样做:

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

【讨论】:

【参考方案5】:

如何将“func1(arguments) call”添加到列表中而不调用它,同时将其添加到列表中。

至少有两种方式:

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

如果您认为您可能想在运行前检查或更改参数,那么下一个更好:

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

【讨论】:

以上是关于如何将函数调用添加到列表中?的主要内容,如果未能解决你的问题,请参考以下文章

如何将函数调用(不是超链接)添加到 UILabel 中的 NSAttributedString 的一部分?

将 DLL 引用添加到 C# asp.net 项目后如何调用函数

如何将自定义按钮添加到调用 JavaScript 函数的工具栏?

按下 QDialog Cancel 或 OK 时如何调用函数?

在 Flutter 中弹出屏幕后如何调用函数来更新值?

在 C 中,给定参数的变量列表,如何使用它们构建函数调用?