2011-10-07 78 views
1

我嘗試用變量名定義一個函數。eval中的函數定義

名稱從數據庫中檢索。對於每一個名字,我希望定義一個按鈕,並具有獨立的處理:

title=['BNL','CE'] 
for i in range(0,len(title)): 
    panelvpu.add(Button(title[i])) 


for i in range(0,len(title)): 
    eval('def onButtonClick'+title[i]+'(self, event):') 
    eval(' Window.alert("Yes")') 

按鈕定義是好的,但在定義函數的事件的處理提供了一個錯誤

im1 SyntaxError: at index 4 in "def onMenu1Item1(self): 
Window.alert("Item 1 selected")": expected ';', got 'onMenu1Item1' 

反饋後,我改爲

title=['BNL','CE'] 
    for t in title : panelvpu.add(Button(t)) 

for t in title:   
    def_code = "print t" 
    exec(def_code) 

只是爲了得到感覺;在python下這工作正常。 但是我用睡衣和最後一個代碼執行賴斯的錯誤,說明

im1 TypeError: iter is undefined 

看來,睡衣是不支持的eval()和exec()呢。

理查德

+2

使用'exec',但不要 – JBernardo

+0

這對我來說看起來不像是單獨的處理... –

+1

看起來您正試圖爲回調命令創建一個功能工廠;好的想法,但是Python有更好的工具可以讓你做到這一點。 – Thomas

回答

9

有許多問題這裏:

1)eval是用於評價的表達式,而不是執行語句。

2)exec將需要在一個exec的整個功能,而不是像你所擁有的那樣分割成單獨的行。

3)創建函數有很多簡單的方法,具體取決於你想要在身體中有什麼。告訴我們你真正想做什麼。

4)你的循環更簡單:for t in title: blah blah t