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()
应该(如果我没有记错的话)抓取输入小部件中输入的内容。
答案 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))