PythonJuniorTechnical

Что такое truthy и falsy значения в Python?

Falsy значения в Python: None, False, 0, 0.0, '', [], {}, set(), и объекты, у которых __bool__ возвращает False или __len__ возвращает 0. Всё остальное — truthy.

Truthy и falsy значения в Python

Python оценивает любой объект как булево значение в контексте условий (if, while, логические операторы). Объект считается falsy, если он «пустой» или «нулевой», и truthy — в противном случае.

Полный список falsy значений

  • None
  • False
  • Числовой ноль: 0, 0.0, 0j (комплексный), Decimal(0), Fraction(0, 1)
  • Пустые коллекции: "", b"", [], (), {}, set(), frozenset()
  • Объекты, у которых __bool__ возвращает False или __len__ возвращает 0

Примеры поведения

falsy_values = [None, False, 0, 0.0, "", [], {}, set()]

for val in falsy_values:
    assert not val, f"{val!r} должно быть falsy"

# Truthy примеры
assert 1
assert "0"      # непустая строка
assert [False]  # список с одним элементом
assert {0}      # множество с нулём
assert 0.1

# Практическое применение
users = []
if not users:
    print("Список пользователей пуст")

name = ""
display = name or "Аноним"   # "Аноним"
print(display)

timeout = None
effective = timeout or 30    # 30

Пользовательские объекты

class Cart:
    def __init__(self, items: list) -> None:
        self.items = items

    def __bool__(self) -> bool:
        return len(self.items) > 0

    def __len__(self) -> int:
        return len(self.items)


empty_cart = Cart([])
full_cart = Cart(["apple", "bread"])

if not empty_cart:
    print("Корзина пуста")   # выведется

if full_cart:
    print("Корзина не пустая")  # выведется

Логические операторы возвращают объекты, а не bool

# 'or' возвращает первый truthy операнд или последний
print(0 or "" or 42)     # 42
print(0 or "" or None)   # None

# 'and' возвращает первый falsy операнд или последний
print(1 and 2 and 3)     # 3
print(1 and 0 and 3)     # 0

Подводные камни

  • Проверка if x: вместо if x is not None: ошибочна, когда 0 или [] — валидные значения (например, пустой список как результат запроса).
  • Строка "0", "False", "None" — все truthy, потому что непустые строки; новички часто ожидают обратного.
  • NumPy массивы: bool(np.array([0, 1])) выбрасывает ValueError — используйте .any() / .all().
  • Если класс определяет __len__ без __bool__, Python использует __len__ != 0 как булево значение — это неочевидно.
  • Паттерн val = arg or default не работает если arg=0 или arg="" — используйте val = arg if arg is not None else default.
  • В pandas bool(Series) тоже выбрасывает исключение — требуется явное .empty или len().

Common mistakes

  • Говорить, что условие принимает только bool.
  • Не отличать None от других falsy-значений.
  • Забывать про bool и len.

What the interviewer is testing

  • Называет основные falsy-значения.
  • Понимает bool-протокол.
  • Выбирает is None, когда важна именно отсутствующая величина.

Sources

Related topics