2013-12-13 56 views
0

我正在編寫一個python腳本,我想要做的是將輸入捕獲到一個變量中,然後用它來調用具有該名稱的函數。這裏有一個例子:從設置變量調用函數?

def test(): 
    print "You want to do a test!" 

option = raw_input("What do you want to do? ") #User types in test 
option() 

現在這個心不是工作,因爲Python是沒有看到選項作爲變量,而是試圖調用的函數「選項」。什麼是最簡單的方法去做這件事?

回答

3

eval()將工作,但@MattDMo說它可能是危險的。

一個更安全的方式做到這一點,如果你的功能模塊全局:

globals()[option]() 

globals()是一個字典映射字符串模塊全局對象這些字符串綁定到。因此globals()[option]查找該字典中綁定到option的字符串,並返回該對象;例如globals["test"]返回test()的函數對象。然後在末尾添加()調用該函數對象。賓果 - 你完成了。

+0

非常好,我忘了那個... – MattDMo

+0

太棒了!我認爲這是贏家!現在我需要的是找出需要多個輸入和一個捕獲所有功能,但我認爲我可以做一個嘗試/除外。謝謝您的幫助! – stevo81989

0

你想對運行任意代碼非常小心,但如果你絕對需要,你可以使用eval()函數。

什麼可能是一個更好的辦法是給用戶一個選項菜單,然後做的option內容的測試,看看哪一個他們挑選,然後運行起作用的。

+0

嗯,有趣。所以我們要做的就是基本上有一個交互式shell,並基於用戶輸入的函數將基於輸入運行。因此,如果用戶鍵入ls,它將運行一個列出api文件的函數。現在我們有 如果輸入==「ls」: 做功能 我想要它,所以我可以添加一個新的功能,而沒有大量的if語句。我只是想知道是否有人有一個更簡單的想法。 – stevo81989

+0

你不需要大量的if語句,你總是可以將函數名稱存儲在一個列表中,然後在列表中選擇'if if選項:...' – MattDMo

+0

我喜歡這個,這是一個好主意。儘管我也喜歡Tim Peters。我認爲它會工作得很好,唯一剩下的就是找出所有的東西(如果該命令不是作爲函數發現的)和具有多個optins的東西(?,h,幫助所有的都指向一個函數),但可能很容易嘗試/除外。謝謝您的幫助! – stevo81989

0

您可以使用python eval

在幫助頁面中,eval將評估全局和本地語境中的源。源可以是一個表示由compile()返回的Python表達式或代碼對象的字符串。

例如:

def a(): 
    print "Hello" 

inp = raw_input() 
eval(inp + "()") 

在在標準輸入進入a,函數a將被執行。請注意,沒有任何安全檢查,這可能是危險的。

0

這是我想,對於裸input實際使用:

option = input("What do you want to do? ") #User types in test 
option() 

這是語義上等同於eval(raw_input())。請注意,在python 3中,raw_input變成了input,所以你明確的必須要eval吧。

這種類型的操作通常非常不安全的警告適用。但我認爲這是顯而易見的,因爲您要求用戶訪問運行任意代碼,所以...

0

我喜歡在這種情況下使用字典。如果用戶提供了不是預期的答案,您甚至可以指定一個默認選項。

def buy_it(): 
    print "use it" 

def break_it(): 
    print "fix it" 

def default(): 
    print "technologic " * 4 

menu = {"buy it": buy_it, "break it": break_it} 
option = raw_input("What do you want to do? ") 
menu.get(option, default)()