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

eval() syntax error when the expression ends with a period

我正在开发一个评估数据库查询的程序。下面我定义了一条记录,并显示了我在使用 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

if query = "gender == 'M'"(如评论中所示),eval() 确实有效。但是,当查询为 "Dept. == 'Sales'" 时,出现语法错误。很明显,是句点导致了这个问题(我尝试使用字典中的其他键,但没有任何问题)。有没有理由不接受这个时期?有没有办法让 eval() 识别句点?

期待您的回答!

谢谢!

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

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

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

"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)