Форум сайта python.su
Приветствую уважаемое сообщество.
Краткая суть проблемы:
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 месяца. Ошибка даже не злит, приводит в недоумение
Офлайн
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
Офлайн
Пока опытным путем выяснил что в версии 2.7.8 “8” вместо “08” срабатывает нормально. Но при этом от 1 до 7 можно писать с нулем.
Офлайн
В Py2 числа начинающиеся с “0” интерпретируются как восьмеричные числа (octal numbers).
Соответственно числа 08-09 и дают ошибку, т.к. не являются правильными.
В Py3 такую форму записи вообще убрали.
Так что просто уберите ноль в начале числа, и у все у вас должно заработать.
Офлайн
Большое спасибо.
Офлайн