True — это единица
Почему isinstance(True, int) истинно и к чему это приводит в проверках.
Факт
isinstance(True, int) # True
True == 1 # True
True + True # 2
sum([True, False, True]) # 2
bool в Python — подвид целого. Исторически так вышло: булев тип
добавили позже чисел, и совместимость сохранили.
Полезная сторона
Подсчёт по условию пишется одной строкой:
sum(1 for x in spisok if x > 0)
sum(x > 0 for x in spisok) # то же самое, короче
Вредная сторона
Проверка типа пропускает True туда, где ждали число:
def cena_verna(znachenie):
return isinstance(znachenie, (int, float))
cena_verna(100) # True — верно
cena_verna(True) # True — а вот это беда
В кривой выгрузке цена может оказаться true. Она пройдёт проверку,
сравнится как единица и окажется самой дешёвой позицией в прайсе.
Как надо
def cena_verna(znachenie):
return isinstance(znachenie, (int, float)) and not isinstance(znachenie, bool)
Некрасиво, но других способов нет: type(znachenie) is int тоже
работает, но откажет законному float.
Когда об этом думать
Только там, где данные приходят снаружи: разобранный JSON, выгрузка, ответ чужой службы. В своём коде, где числа кладёте вы сами, эта проверка избыточна.