2015-09-01 51 views
0
def evaluate(x): 
    number = str(eval(entry_drones.get())) 
    if x == drones : 
     create_drone(number) 
entry_drones = Entry(frame, text = "1") 
entry_drones.bind("<Return>", evaluate(drones)) 

我有一個創建的線沿線的一個錯誤的程序:轉換變量轉換成字符串創建EOF錯誤

number = str(eval(entry_drones.get())) 
File "<string>", line 0 
^
SyntaxError: unexpected EOF while parsing 

我試圖在網上尋找答案,但他們說我要麼缺少一個括號(我一直無法找到它需要的地方),或者我使用輸入,而不是raw_input(至少據我所知,這似乎不是這個錯誤的原因)

我只發佈了我認爲與問題相關的代碼,但如果需要,我可以提供更多代碼。請注意,我有數學和Tkinter進口,以及其他的東西。

我使用了eval,因爲它是我知道(僅限有限的經驗)從我的Entry小部件獲取輸入並在通過其他函數運行之前簡化它的唯一方法。

至於無人機,它讓我的評估功能知道哪個功能通過number到。我剔除了所有其他選項,因爲它是重複的,並且都導致了這個功能。 entry_drones可以有基本的表達,如10 * 10或其他東西。在我的代碼中,我設置了k = 1000等等,允許我使用字母來縮寫。

entry_drones.get()應該(如果我沒有弄錯的話)只要按下Enter鍵就可以獲取輸入到Entry小部件中的任何內容。

+4

爲什麼使用'eval'? –

+0

什麼是「無人機」?你在'entry_drones'裏面放了什麼? –

+1

有些人聲稱'eval()'確實有一些有效的用途。我不相信他們會認爲這是他們中的一員。 –

回答

2

eval函數將您傳遞給它的字符串解釋爲Python代碼。如果您的文本輸入框中輸入的內容不是有效的Python表達式(例如空字符串),則會得到一個SyntaxError。如果輸入的內容可能有效但存在其他問題(例如,對可能是變量名的隨機字符串調用eval可能會引起NameError,因爲沒有此類變量),您可能也會遇到其他異常。

如果這是唯一的問題,您可能只想從eval調用中捕獲異常,並忽略它們或在程序中給出相應的錯誤消息。

請注意,在用戶輸入上調用eval可能會非常危險。如果用戶輸入類似__import__("os").system("rm -Rf /")的東西,你的程序可能會悄悄地刪除硬盤中的全部內容(不要試試這個!)。如果你的程序在系統上運行的權限比用戶自己擁有更多的權限(可能不適用於GUI應用程序,但對於Web應用程序很常見),這顯然是一個更大的交易,但即使你只是能夠做任何事情,用戶可以通過命令提示符執行任何操作,但在不可信輸入上使用eval是個好主意。

不幸的是,沒有一堆工作,做我認爲你想要的東西(簡化數學表達式,可能包括調用像math.sqrt這樣的函數)並不是一個簡單的方法。一種選擇是將字符串傳遞給ast.parse以獲取抽象語法樹,然後遍歷樹確保它只執行想要允許的內容(例如使用數學運算符並調用特定的白名單函數(例如,在math模塊)。然後,您可以驗證AST有信心,它不會做什麼壞事傳遞給compile然後eval它。

2

eval()是非常危險的作爲@Blckknght很好地解釋。

在一個側面說明,只是指出問題的實際根本原因,應該是因爲該行的 -

entry_drones.bind("<Return>", evaluate(drones)) 

這將運行功能evalute()執行此線時,那很可能在應用程序甚至完全啓動之前,因此條目entry_drones爲空導致此問題。然後,如果它運行成功,它會將返回的值傳遞給bind方法,在這種情況下,將返回None

我相信如果你想發送一個參數給你的evaluate()函數,那麼你應該先讓它接受多於一個的paraemter,因爲bind本身發送它參數。實施例 -

def evaluate(event, x): 
    ... 

然後使用lambda表達與默認值傳遞到dronesx。示例 -

entry_drones.bind("<Return>", lambda event, x=drones: evaluate(event, x))