Короткий ответ
Для проверки на None используют is None / is not None, потому что None — синглтон, а не значение, которое сравнивают по равенству; if x: проверяет "истинность" объекта и даст одинаковый результат для None, 0, пустой строки, пустого списка и False, что обычно не то же самое, что отсутствие значения.
Как это работает подробнее
is None сравнивает идентичность с единственным объектом NoneType в системе, что быстро и однозначно. if x: вызывает bool(x), который для многих объектов определён через __bool__ или __len__ (пустые контейнеры — False), поэтому 0, "", [], {}, False и None все проходят как "ложные" в условии.
Пример кода
example.py
def describe_quantity(qty):
if qty is None:
return "количество не указано"
if qty:
return f"в наличии: {qty}"
return "товар закончился" # qty == 0, но это не None
print(describe_quantity(None)) # количество не указано
print(describe_quantity(0)) # товар закончился
print(describe_quantity(5)) # в наличии: 5Что использовать на практике
- Практика. Если функция должна различать "значение не передано" (None) и "передано пустое значение" (например, пустая строка или 0), нужно явно писать
if x is None:. Если же любое "пустое" значение должно обрабатываться одинаково,if x:— осознанный и уместный выбор.
Подводные камни
- Риски. Пишут
if value:для параметра, который может легитимно быть0или""(например, количество товаров или пустая строка поиска), и теряют обработку этих валидных случаев, считая их отсутствием значения.