将变量转换为字符串会产生 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))
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))