从Python中存储的字符串调用函数[重复]

Posted

技术标签:

【中文标题】从Python中存储的字符串调用函数[重复]【英文标题】:Call a function from a stored string in Python [duplicate] 【发布时间】:2017-07-02 19:42:21 【问题描述】:

我需要的是获取变量的东西,如果变量是函数的名称,则将调用该函数。 我不是想从模块中获取函数,而是从程序本身中获取函数

例子:

def foo():
    print("Foo")
callfunction = input("What function do you want to call? ")

callfunction() ## Not sure what to put here but but lets say callfunction is foo.

我不想要这样的东西,因为我有很多功能:

if callfunction == "Foo"
    Foo()
else:
    print("No function with that name")

我的问题类似于this,但我要求提供 Python 语法。我正在使用 Python 3.5.1

【问题讨论】:

【参考方案1】:

使用 dict 将名称映射到函数。

call_dict = 
    'foo': foo,
    'bar': bar

call_dict[callfunction]()

【讨论】:

【参考方案2】:

在 Python 中使用命令模式是很常见的。首先将所有函数移动到一个类中,并为它们命名,其名称具有输入中未使用的前缀。然后使用getattr()找到正确的函数并调用它。

class Commands():
   def cmd_foo(self):
       print("Foo")

   def callFunction(self, name):
       fn = getattr(self, 'cmd_'+name, None)
       if fn is not None:
            fn()

与 Daniel 的 call_dict 相比,这有几个优点:您不必再次列出函数的名称,也不必再次列出可调用的函数。

'cmd_' 前缀是为了确保您可以在类中拥有其他方法,但仍可以准确控制哪些方法可以直接调用。

【讨论】:

【参考方案3】:

你可以这样做:

eval(input("What function do you want to call? ") + '()')

【讨论】:

这允许使用它的人执行任意 python 代码(只要他们所做的任何事情都以可调用结尾)。例如,他们可能只是选择删除您的所有文件。 我使用的是 Python 3.5.1 而不是 2.7。但这似乎是最简单的解决方案 它是,因为您不使用额外的变量来存储函数名称,如果它解决了您的问题,请将答案标记为已接受。 @KalkidanTadesseZewdieBeyene @Jarvis 我试过了,它工作过一次,但现在我总是得到这个 TypeError: Callfunction() missing 1 required positional argument: 'event' 即使在添加事件之后 @KalkidanTadesseZewdieBeyene:乍一看,这似乎是最简单的解决方案,但它是一个非常非常非常危险的解决方案。阅读Eval really is dangerous。【参考方案4】:

应该这样做

import inspect
import your_module

list_of_functions = inspect.getmembers(your_module, inspect.isfunction)

现在list_of_functions 是一个元组列表,每个函数的名称在位置 0,函数本身在位置 1。

【讨论】:

以上是关于从Python中存储的字符串调用函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

在Python中使用字符串调用函数[重复]

python 初始函数

来自字符串的Python调用函数[重复]

如何从Python中的另一个函数调用函数内的函数? [重复]

从 SQL Server 函数向存储过程抛出异常

如何将所有调用的函数参数合二为一(Python 3)[重复]