Уведомления

Группа в Telegram: @pythonsu

#1 Дек. 8, 2014 15:25:16

lezginohohol
Зарегистрирован: 2014-12-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Странная ошибка с eval()

Приветствую уважаемое сообщество.

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

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 месяца. Ошибка даже не злит, приводит в недоумение

Офлайн

#2 Дек. 8, 2014 15:31:16

lezginohohol
Зарегистрирован: 2014-12-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Странная ошибка с eval()

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

Офлайн

#3 Дек. 8, 2014 15:40:01

lezginohohol
Зарегистрирован: 2014-12-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Странная ошибка с eval()

Пока опытным путем выяснил что в версии 2.7.8 “8” вместо “08” срабатывает нормально. Но при этом от 1 до 7 можно писать с нулем.

Офлайн

#4 Дек. 8, 2014 15:41:25

GreyZmeem
От: Киев
Зарегистрирован: 2013-12-03
Сообщения: 147
Репутация: +  34  -
Профиль   Отправить e-mail  

Странная ошибка с eval()

В Py2 числа начинающиеся с “0” интерпретируются как восьмеричные числа (octal numbers).
Соответственно числа 08-09 и дают ошибку, т.к. не являются правильными.
В Py3 такую форму записи вообще убрали.

Так что просто уберите ноль в начале числа, и у все у вас должно заработать.

Офлайн

#5 Дек. 8, 2014 15:53:14

lezginohohol
Зарегистрирован: 2014-12-08
Сообщения: 4
Репутация: +  0  -
Профиль   Отправить e-mail  

Странная ошибка с eval()

Большое спасибо.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version