将函数存储在列表中并稍后调用它们

Posted

技术标签:

【中文标题】将函数存储在列表中并稍后调用它们【英文标题】:Store functions in list and call them later 【发布时间】:2015-02-12 21:06:38 【问题描述】:

我想将函数存储在一个列表中,然后在程序中从该列表中调用这些函数。

这对我有用,但是我不知道它是否正确:

#example functions, my functions would actually get user input etc.
def func1():
    return 2
def func2():
    return 3

options = [ func1, func2 ]

#call functions

options[0]()

这是将函数存储在列表中并调用它的正确方法吗?还是有其他更好的方法来做到这一点?

【问题讨论】:

这种方式很好 为什么首先将函数存储在列表中?您可以随时调用它们,而无需将它们存储在列表中。 这对我来说似乎很好。当然,您需要记住列表中函数的顺序。否则,您可能需要使用字典并按名称访问函数对象:options = 'func1':func1, 'func2':func2; options['func1']()。但是你必须首先问自己为什么要这样做。您可以将函数放在一个模块中并导入它。 谢谢,我不确定。从来没有见过这样的事情,我所做的只是试验和猜测。我不希望它在我的程序中导致未来的问题,因为我不知道这是否安全/实际工作等。 @qqvc 因为这实际上是减少代码并且在我的情况下更容易修改。我得到用户输入(一个数字),现在我只需要确保索引有效并按索引从该列表中调用函数。否则我将不得不创建一个巨大的 if 块。那是混乱,丑陋和大量的代码。你知道我的意思吗? 【参考方案1】:

我喜欢做这样的事情

class Commander:
    def CommandERROR(*args,**kwargs):
       print "Invalid command"
    def CommandFunc1(*args,**kwargs):
       print "Do Command 1"
    def CommandFunc2(*args,**kwargs):
       print "Do Command 2"
    def CallCommand(command,*args,**kwargs):
       self.__dict__.get("Command"+command,self.CommandError)(*args,**kwargs)


cmd = Commander()
cmd.CallCommand("Func1","arg1",something=5)
cmd.CallCommand("Func2","arg2",something=12)
cmd.CallCommand("Nothing","arg1",something=5)

正如在 cmets 中指出的那样,您也可以将其放在自己的文件中以创建命名空间并省略类...尽管如果您需要影响状态,那么类可能是更好的选择...您也可以使用简单的字典

【讨论】:

如果您不需要维护状态或使用任何特殊方法,则没有真正的理由创建一个类。如果您只需要命名空间,请使用模块。 @iCodez ...我同意...但是在堆栈溢出答案中显示命名空间类更容易【参考方案2】:

是的,这是正确的,但如果你的函数本质上是单行的,我建议你也看看lambdas,这样你的整个代码就可以简化为:

options = [lambda: 3, lambda: 2]

正如在 cmets 中已经指出的那样,您当然需要记住列表中函数的顺序。

【讨论】:

【参考方案3】:

是的,你可以做到。如果您想使用“单线”调用列表中的所有函数,您可以执行以下操作:

results = [f() for f in options]

【讨论】:

【参考方案4】:

不知道其他人是怎么做的,但我也是这样做的。它非常适合我的基本代码,因此我相信它们也可以在其他地方使用。

【讨论】:

以上是关于将函数存储在列表中并稍后调用它们的主要内容,如果未能解决你的问题,请参考以下文章

如何将异步函数存储在结构中并从结构实例中调用它?

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

自动执行javascript函数并稍后调用它们?

如何创建对象列表?

如何将异步任务存储在字典中并根据配置值调用它们?

将列表转储到pickle文件中并稍后检索[关闭]