【问题标题】:Converting a variable into a string creates EOF error将变量转换为字符串会产生 EOF 错误
【发布时间】:2015-11-26 07:32:48
【问题描述】:
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

我尝试在线搜索答案,但他们说我要么缺少括号(我无法找到需要它的位置),要么我使用 input 而不是 raw_input(似乎都不是原因这个错误,至少据我所知)

我只发布了我认为与问题相关的代码,但如果需要,我可以提供更多。请注意,我导入了数学和 Tkinter 以及其他东西。

我使用了eval,因为这是我知道(由于经验有限)从我的 Entry 小部件中获取输入并在通过另一个函数运行它之前对其进行简化的唯一方法。

至于无人机,它让我的评估函数知道将number 传递给哪个函数。我剪掉了所有其他选项,因为它是重复的,并且都导致了这个功能。 entry_drones 可以放入基本表达式,例如 10 * 10 或其他东西。在我的代码中我设置了k = 1000 等等,允许我使用字母来缩写。

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

【问题讨论】:

  • 你为什么用eval
  • drones 是什么?你在entry_drones里面放了什么?
  • 有人声称eval() 确实有一些有效的用途。我不相信他们会认为这是其中之一。
  • entry_drones.get() 返回什么?

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


【解决方案1】:

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() 函数发送一个参数,那么你应该首先让它接受多个参数,因为bind 本身发送它event 参数。示例 -

    def evaluate(event, x):
        ...
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-19
      • 1970-01-01
      • 1970-01-01
      • 2010-09-30
      • 1970-01-01
      • 2011-08-27
      相关资源
      最近更新 更多