将变量转换为字符串会产生EOF错误

时间:2015-09-01 06:48:53

标签: python string tkinter python-2.x eof

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

我有一个程序会产生错误:

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等等,允许我使用字母缩写。

每当按下Enter键时,entry_drones.get()应该(如果我没有记错的话)抓取输入小部件中输入的内容。

2 个答案:

答案 0 :(得分: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传递给它,确信它不会做任何坏事。

答案 1 :(得分:2)

eval()非常危险正如@Blckknght所解释的那样。

另一方面,只是指出问题的实际根本原因,应该是因为这一行 -

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

执行此行时,这将运行函数evalute(),这很可能是在应用程序完全启动之前,因此条目entry_drones为空导致问题。然后,如果它成功运行,它会将返回的值传递给bind方法,在这种情况下,将返回None

我相信如果您要向evaluate()函数发送参数,那么首先应该让它接受多个参与者,因为bind本身会发送event参数。示例 -

def evaluate(event, x):
    ...

然后使用带有默认值的lambda表达式将drones传递给x。示例 -

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