Почему Django IntegerField преобразует unicode в str перед преобразованием в int?

#python #django

#python #django

Вопрос:

Я просмотрел код Django для IntegerField to_python метода ‘s. Часть преобразования типа

     try:
        value = int(str(value))
    except (ValueError, TypeError):
        raise ValidationError(self.error_messages['invalid'], code='invalid')
 

Код преобразует value (введите unicode) в str first и then int . Почему он не может быть приведен int непосредственно, т.е.

     try:
        value = int(value)
    except...
 

Комментарии:

1. Потому value что может быть объектом, а не просто строковым литералом. Вызов str вызовет его строковое представление, а не его repr . Кроме того, рассмотрите «Явное лучше, чем неявное» из the Zen of Python.

2. Объект в Python естественным образом представляется как мусор. Он будет отображаться как что-то вроде <экземпляр myfile.object в 0x38DF32> . Это не может быть преобразовано в целое число. Объекты, представляющие числа, чаще всего имеют обработчики, такие как __ unicode __ или переопределенный repr, которые возвращают представление этого объекта. Обычно они печатаются как более разумное значение, например, истинное значение объекта (надеюсь, число). Конечно, это не всегда так, но значение str() объекта обычно дает что-то более близкое к истинному значению объекта. Это трудно объяснить, я надеюсь, это поможет!