Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 24, 2013 21:04:23

fobiasmog
Зарегистрирован: 2013-11-11
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Использование try except

Lexander, спасибо. По сути задачи: эта проверка идёт в джанговской модели, перед запросом к базе. Делается для того, чтобы не обрабатывались запросы вида /?id=123abc.
Спасибо всем!

Офлайн

#2 Ноя. 24, 2013 21:24:56

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Использование try except

fobiasmog
По сути задачи: эта проверка идёт в джанговской модели, перед запросом к базе.
Советую использовать готовый валидатор.



Офлайн

#3 Ноя. 25, 2013 11:49:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Использование try except

fobiasmog
Lexander, спасибо. По сути задачи: эта проверка идёт в джанговской модели, перед запросом к базе. Делается для того, чтобы не обрабатывались запросы вида /?id=123abc.Спасибо всем!
Если передавать id, как это принято в Джанге,
url(r'^reports/(?P<id>\d+)/$', 'credit.views.report'),
то до запросов дело вообще не дойдет



Офлайн

#4 Ноя. 25, 2013 14:16:33

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Использование try except

Lexander, int(1.23) не выдаст, а вот int('1.23') очень даже выдаст.

А вот Ваш пример с isdigit не покрывает всех случаев использования преобразования к int, ибо работает только подмножестве целых чисел, а именно работает только с положительными числами. Нет конечно можно сделать что-то по типу:

def is_integer(s):
    s = s.strip()
    if s[0] in "+-":
        s = s[1:]
    return s.isdigit()

А вот применимость в том или ином случае зависит от задачи.



Отредактировано cutwater (Ноя. 25, 2013 14:26:48)

Офлайн

#5 Ноя. 25, 2013 14:44:59

Lexander
От:
Зарегистрирован: 2008-09-19
Сообщения: 1139
Репутация: +  33  -
Профиль   Отправить e-mail  

Использование try except

cutwater
Lexander, int(1.23) не выдаст, а вот int('1.23') очень даже выдаст.
Вы уводите от сути. Это софистика.
То, что я хотел написать, я написал. Если бы int('1.23'), допустим, не выдавал ошибки и я намеревался именно этот момент уточнить, я бы так и написал.
Цель была в другом: я показал 2 разных примера, когда ожидаемый результат отличается от фактического, и, как следствие, конструкция try-except не работает на уровне бизнес-логики, хотя работает на уровне синтаксиса.
cutwater
А вот Ваш пример с isdigit
У меня не было такого примера.
Тем не менее, в указанном контексте сообщения JOHN_16 (как один из примеров) он указан вполне корректно.
К вашему примеру никто ведь не придирается, а ведь есть за что ;)



Офлайн

#6 Ноя. 25, 2013 21:48:32

cutwater
От:
Зарегистрирован: 2009-01-08
Сообщения: 444
Репутация: +  19  -
Профиль   Отправить e-mail  

Использование try except

Эта конструкция очень затратна. Поэтому лучше использовать явные проверки, даже если их несколько.

Речь была о том, что проверки при помощи встроенных функций int, float и пример проверки при помощи isdigit ведут себя по-разному. Поэтому однозначно утверждать, что лучше использовать явные проверки нельзя, только потому что обработка исключений работает чуть медленней (~2-3 раза) чем простой разбор строки.

Однако, как Вы правильно заметили способ следует выбиртаь из задачи. Для валидации URL в большинстве случаев как раз таки проверка при помощи isdigit или regexp покрывает все необходимые случаи.

Производительность в данном конкретном случае не столь существенна на мой взгляд.



Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version