Найти - Пользователи
Полная версия: Странная ошибка с eval()
Начало » Центр помощи » Странная ошибка с eval()
1
lezginohohol
Приветствую уважаемое сообщество.

Краткая суть проблемы:

Python 2.7.8

В программе строка:
currentdict=eval(line) line читается из файла.
как правило строка следующего вида:
“{'reportname':'AServices2-list1', ‘path’:'/Services?Statistics Object/Categories?ServiceObject', ‘startdate’:datetime(2014, 12, 01, 0), ‘enddate’:datetime(2014, 12, 01, 0), ‘period’:dict(hours=1)}”

Сегодня попалась следующая строка: "{'reportname':'AServices2-list1', ‘path’:'/Services?Statistics Object/Categories?ServiceObject', ‘startdate’:datetime(2014, 12, 01, 0), ‘enddate’:datetime(2014, 12, 08, 0), ‘period’:dict(hours=1)}“

Выдало вот такую ошибку:
Traceback (most recent call last):
File ”<pyshell#3>“, line 1, in <module>
eval(”{'reportname':'AServices2-list1', ‘path’:'/Services?Statistics Object/Categories?ServiceObject', ‘startdate’:datetime(2014, 12, 01, 0), ‘enddate’:datetime(2014, 12, 08, 0), ‘period’:dict(hours=1)}“)
File ”<string>“, line 1
{'reportname':'AServices2-list1', ‘path’:'/Services?Statistics Object/Categories?ServiceObject', ‘startdate’:datetime(2014, 12, 01, 0), ‘enddate’:datetime(2014, 12, 08, 0), ‘period’:dict(hours=1)}
^
SyntaxError: invalid token

стрелочка в точности над выделенной цифрой.

помучавшись с отладчиком открыл IDLE и попробовал выполнить следующий код:
from datetime import date, datetime, timedelta
eval(”{'reportname':'AServices2-list1', ‘path’:'/Services?Statistics Object/Categories?ServiceObject', ‘startdate’:datetime(2014, 12, 01, 0), ‘enddate’:datetime(2014, 12, 08, 0), ‘period’:dict(hours=1)}“)

когда в выделенной части ”08“ или ”09" - дает ошибку invalid token. При остальных значениях создает словарь (как и задумывалось).

Попробовал вверсии 3.4.1: invalid token в строке datetime(2014, 12, 01, 0) при любых значениях.

Опыт работы в Python 3 месяца. Ошибка даже не злит, приводит в недоумение
lezginohohol
P.S.
вот этот код в IDLE 2.7.8 (убрал eval()):
from datetime import date, datetime, timedelta
{'reportname':'AServices2-list1', ‘path’:'/Services?Statistics Object/Categories?ServiceObject', ‘startdate’:datetime(2014, 12, 01, 0), ‘enddate’:datetime(2014, 12, 08, 0), ‘period’:dict(hours=1)}

на значениях 08 и 09 дает ту же ошибку



в версии 3.4.1

from datetime import date, datetime, timedelta
a=datetime(2014, 12, 08, 0)
SyntaxError: invalid token при любом месяце.
При нуле:
a=datetime(2014, 12, 00, 0)
ValueError: day is out of range for month
lezginohohol
Пока опытным путем выяснил что в версии 2.7.8 “8” вместо “08” срабатывает нормально. Но при этом от 1 до 7 можно писать с нулем.
GreyZmeem
В Py2 числа начинающиеся с “0” интерпретируются как восьмеричные числа (octal numbers).
Соответственно числа 08-09 и дают ошибку, т.к. не являются правильными.
В Py3 такую форму записи вообще убрали.

Так что просто уберите ноль в начале числа, и у все у вас должно заработать.
lezginohohol
Большое спасибо.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB