从Python中存储的字符串调用函数

本问题已经有最佳答案,请猛点这里访问。

我需要的是得到这个变量的东西如果这个变量是一个函数的名字,这个函数就会被调用。我不是试图从模块中获取函数,而是从程序本身中获取函数

例子:

1
2
3
4
5
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.

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

1
2
3
4
if callfunction =="Foo"
    Foo()
else:
    print("No function with that name")

我的问题是这样的,但是我要求Python语法。我使用的是Python 3.5.1


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

1
2
3
4
5
call_dict = {
    'foo': foo,
    'bar': bar
}
call_dict[callfunction]()

你可以这样做:

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


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

1
2
3
4
5
6
7
8
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_'前缀的存在是为了确保类中可以有其他方法,但仍然精确地控制哪些方法是可直接调用的。


这样就可以了

1
2
3
4
import inspect
import your_module

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

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