2017-02-14 39 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的功能本身。

相關問題