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

Converting a variable into a string creates EOF error

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() 应该(如果我没弄错的话)抓取输入到 Entry 小部件中的任何内容。

eval 函数将您传递给它的字符串解释为 Python 代码。如果在您的文本输入框中输入的内容不是有效的 Python 表达式(例如空字符串),您将得到一个 SyntaxError。如果您输入的内容可能有效但存在其他问题,您也可能会遇到其他异常(例如,在可能是变量名的随机字符串上调用 eval 可能会引发 NameError 因为没有这样的变量)。

如果这是唯一的问题,您可能只想捕获来自 eval 调用的异常并忽略它们或在您的程序中给出适当的错误消息。

还要注意,根据用户输入调用 eval 可能非常危险。如果用户输入类似 __import__("os").system("rm -Rf /") 的内容,您的程序可能会悄悄删除硬盘驱动器的全部内容(不要尝试!)。如果你的程序在你的系统上的权限比用户自己拥有的权限多 运行 ,这显然是一个更大的问题(对于 GUI 应用程序来说可能不太可能,但对于网络应用程序来说很常见),但即使你只能做用户在命令提示符下无论如何都可以做的事情,对不受信任的输入使用 eval 是个坏主意。

不幸的是,没有真正简单的方法来做我认为你想要的事情(简化数学表达式,可能包括调用像 math.sqrt 这样的函数)而不需要大量的工作。一种选择是将字符串传递给 ast.parse 以获得抽象语法树,然后遍历树以确保它只做你想允许的事情(例如使用数学运算符,并调用特定的白名单函数(例如 math 模块中的那些)。然后您可以将经过验证的 AST 传递给 compile 然后 eval 它确信它不会做任何坏事。

eval() 非常危险 @Blckknght 解释得很好。

附带说明一下,只是为了指出问题的实际根本原因,应该是因为行 -

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

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

我相信如果你想向你的 evaluate() 函数发送一个参数,那么你应该首先让它接受多个参数,因为 bind 本身发送它 event 参数.例子-

def evaluate(event, x):
    ...

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

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