表达式以句点结尾时,eval()语法错误

时间:2018-11-06 21:51:34

标签: python-3.x eval

我正在研究一个评估数据库查询的程序。在下面,我定义一个记录,并显示使用eval()时遇到的问题

record = {'name': 'John_Smith', 'gender': 'M', 'age':45,'Dept.': 'Sales'}

query = "Dept. == 'Sales'"
#query = "gender == 'M'"

if eval(query, {__builtins__: None}, record):
    print(record)

我得到的错误是

File "<string>", line 1 Dept. == 'Sales' ^ SyntaxError: invalid syntax

如果query =“ gender =='M'”(如注释所示),则eval()起作用。但是,当查询为“部门=='销售'”时,出现语法错误。很明显,这段时间是造成此问题的原因(我尝试使用字典中的其他键,但没有任何问题)。是否有理由不接受该期限?有什么方法可以让eval()识别周期吗?

期待您的回答!

谢谢!

1 个答案:

答案 0 :(得分:1)

Python不允许使用句点.作为简单变量名称的一部分。

Dept. = 'x'   # NOT OK
dept = 'x'    # ok

变量必须以字母或下划线开头,然后可以有更多字母,数字或下划线。句点用于引用班级成员,但这是另一个答案。

“ Dept”字符串是词典的一部分,因此使用此名称对python没有可见性。它可以作为字典的一部分引用:

if record["Dept."] == 'blah':
    ...

因此您的代码可以像这样工作:

record = {'name': 'John_Smith', 'gender': 'M', 'age':45,'start_date':'2010/05/01','salary': 50000,'Dept.': 'Sales'}

query = "record['Dept.'] == 'Sales'"

if eval(query):
    print(record)

由于您要将record传递给eval()作为第三个参数(局部变量的对象),因此只需删除句点就足够了。

record = {'name': 'John_Smith', 'gender': 'M', 'age':45,'start_date':'2010/05/01','salary': 50000,'Dept': 'Sales'}

query = "Dept == 'Sales'"

if eval(query, {__builtins__: None}, record):
    print(record)