从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中存储的字符串调用函数[重复]的主要内容,如果未能解决你的问题,请参考以下文章