Проверка на пустоту и ловушка с нулём
Почему if znachenie — не то же самое, что if znachenie is not None.
Что считается ложью
В условии Python сам решает, истинно значение или нет. Ложными считаются:
None, False, 0, 0.0, "", [], {}, set(), ()
Остальное — истина.
Отсюда две записи, которые путают
if not spisok: # список пуст
if spisok is None: # списка нет вовсе
Это разные проверки, и разница всплывает в самый неудобный момент.
Ловушка
Функция принимает необязательный довод. Незаданный — значит «не ограничивать».
def podobrat(tovary, do_ceny=None):
for t in tovary:
if do_ceny and t["цена"] > do_ceny: # ошибка
continue
При do_ceny = 0 фильтр молча отключается: ноль ложен, условие не
срабатывает. А «до нуля рублей» — осмысленный запрос, пусть и
редкий.
Правильно так:
if do_ceny is not None and t["цена"] > do_ceny:
То же с анкетами: графа «число детей: 0» заполнена, и if not
znachenie объявит её пустой.
Когда проверка на истинность уместна
Когда пустое и отсутствующее означают одно и то же.
if not spisok:
return [] # пустой список и None — оба «нечего делать»
И для флагов: if tolko_v_nalichii — здесь None и False значат
одно, и различать их незачем.
Как решать
Спросите себя: может ли законное значение оказаться ложным? Ноль,
пустая строка, пустой список — законные значения во множестве
случаев. Если да — пишите is None.