代码之家  ›  专栏  ›  技术社区  ›  Anina

使用字符串类型的变量调用eval返回错误

  •  -1
  • Anina  · 技术社区  · 1 年前

    我对python中的eval函数有问题。我在修补程序中有一个窗口,它会返回一个字符串值。我把它们传给eval,结果出现语法错误。在名称字段中,输入“abc”。为什么?

    from tkinter import *
    from tkinter.messagebox import showerror
    
    fieldnames = ('name', 'age', 'job', 'pay')
    
    
    
    def makeWidgets():
        global entries
        window = Tk()
        window.title('People Shelve')
        form = Frame(window)
        form.pack()
        entries = {}
        for (ix, label) in enumerate(('key',) + fieldnames):
            lab = Label(form, text=label)
            ent = Entry(form)
            lab.grid(row=ix, column=0)
            ent.grid(row=ix, column=1)
            entries[label] = ent
        Button(window, text="Update", command=updateRecord).pack(side=LEFT)
        Button(window, text="Quit", command=window.quit).pack(side=RIGHT)
        return window
    
    
    
    def updateRecord():
        for field in fieldnames:
            text = entries[field].get()
            eval(text) # ERROR invalid syntax
    
    window = makeWidgets()
    window.mainloop()
    

    我想知道为什么我会出错。我想向我解释一下这个错误。

    1 回复  |  直到 1 年前
        1
  •  0
  •   Danya K    1 年前

    问题是,如果您的某些字段为空, entries[field].get() 将返回一个空字符串 "" 。因此,您将尝试计算一个空字符串( eval('') ),而您无法执行此操作。这将导致您看到的错误。您可以通过不同的方式解决此问题,例如,检查文本是否不是空字符串,如下所示:

    text = entries[field].get()
    if text != '':
        eval(text)
    

    或者您可以添加try-except块,如下所示:

    text = entries[field].get()
    try:
        eval(text)
    except SyntaxError:
        print("no values in a field")
    except NameError:
        print("text must be entered as 'some text'")