Синтаксическая ошибка eval (), когда выражение заканчивается точкой - PullRequest
0 голосов
/ 07 ноября 2018

Я работаю над программой, которая оценивает запрос к базе данных. Ниже я определяю одну запись и показываю проблему, возникающую при использовании 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

если запрос = "пол == 'M'" (как видно в комментарии), eval () работает. Однако, когда запрос «Dept. ==« Продажи »», я получаю синтаксическую ошибку. Понятно, что период вызывает эту проблему (я пробовал с другими ключами из словаря и не было проблем). Есть ли причина, по которой он не примет период? Есть ли способ, которым eval () может распознать точку?

Ждем ваших ответов!

Спасибо!

1 Ответ

0 голосов
/ 07 ноября 2018

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