2017-02-14 59 views
0

我需要的是获取变量的东西,如果变量是函数的名称,函数将被调用。 我不是想从一个模块,但在程序本身中得到的功能从Python中存储的字符串调用函数

例子:

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

你可以这样做:

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

这允许使用它的人执行任意的python代码(只要它们以可调用的方式结束)。例如,他们可能会选择删除所有文件。 – Duncan

+0

我使用Python 3.5.1而不是2.7。但是这似乎是最简单的解决方案 – Fonky44

+0

因为您不使用额外的变量来存储函数名称,所以如果答案解决了您的问题,请将答案标记为已接受。 @KalkidanTadesseZewdieBeyene – Jarvis

5

使用一个字典映射名称的函数。

call_dict = { 
    'foo': foo, 
    'bar': bar 
} 
call_dict[callfunction]() 
1

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

这有几个在丹尼尔的call_dict优点:你不必列出的功能名称的第二个时间,你不必要么列出可调用函数第二次。

'cmd_'前缀用于确保您可以在该类中使用其他方法,但仍然可以控制哪些方法可以直接调用。

0

这应该这样做

import inspect 
import your_module 

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

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