Пустые данные в языке Python: полное руководство с примерами

Раздел: Основы Python -> Типы данных

Пустые значения в Python

Python обладает гибкой системой логических значений. Любой объект может быть интерпретирован как истина (truthy) или ложь (falsy). К пустым (falsy) значениям относятся: None, False, нуль числовых типов (0, 0.0, 0j), пустые коллекции ('', [], {}, set(), ()), а также объекты, у которых __bool__ возвращает False или __len__ возвращает 0. Понимание этих значений критично для написания надёжного кода.

Основной идиоматический способ проверки на пустоту

Как в Python принято проверять, является ли значение «пустым»?

Самый распространённый и рекомендуемый вариант - использовать if not value:. Эта конструкция корректно обрабатывает все falsy объекты. Она лаконична и читаема.

x = []
if not x:
    print('x – пустой список')

вещественные значения python (вещественные значения в python)

x – пустой список

вывести тип данных python (вывод типа данных в python)

Потенциальная проблема:

Если требуется отличить, например, None от пустой строки, то if not value не подойдет - оба случая дадут True. В таких ситуациях нужна более точная проверка.

Вариант 1: Явная проверка на None

Как отличить отсутствие значения (None) от других пустых объектов?

Для этого используется оператор is (или is not).

val = None
if val is None:
    print('val равен None')

Python двоичные данные (работа с двоичными данными в python)

val равен None

переменная int python какая переменная (переменная int в python - что это?)

Типичная ошибка:

Использование == None вместо is None. Хотя в большинстве случаев результат будет одинаковым, для None идиоматичным и более быстрым является is. Кроме того, некоторые пользовательские классы могут переопределять __eq__, что приведёт к неверному результату.

Вариант 2: Проверка длины коллекции

Как проверить, что список или строка пусты, но при этом гарантировать, что сам объект существует (не None)?

Используйте len(). Однако будьте осторожны: вызов len(None) вызовет TypeError.

data = []
if len(data) == 0:
    print('data пуст')
else:
    print('data не пуст')

комплексные числа в python (комплексные числа в python)

data пуст

логические значения python (логические значения в python)

Ошибка:

len(None)TypeError: object of type 'NoneType' has no len(). Перед вызовом len нужно убедиться, что объект поддерживает эту функцию.

Вариант 3: Сравнение с пустым объектом того же типа

Как проверить, является ли строка именно пустой строкой, а не None или другой пустой коллекцией?

Можно сравнить с '':

s = ''
if s == '':
    print('пустая строка')

длина переменной python (длина числа и переменной в python)

Аналогично для списка: if lst == [].

Недостаток:

Такой подход не универсален: для каждого типа придётся писать отдельную проверку. Кроме того, для больших коллекций сравнение может быть неэффективным.

Вариант 4: Использование bool(value)

Как явно преобразовать значение в булево для проверки?

Функция bool() возвращает False для falsy объектов и True для truthy.

print(bool([]))    # False
print(bool('abc')) # True

определение объекта python (определение типа объекта в python)

Это эквивалентно if value: и может быть полезно в функциональных стилях, например, при фильтрации.

Вариант 5: Обработка специальных типов (например, классы с __len__ или __bool__)

Как создать собственные объекты, которые ведут себя как пустые?

Достаточно определить __bool__ или __len__. Если объект не реализует ни один из этих методов, он считается truthy.

class MyContainer:
    def __init__(self, items):
        self.items = items
    def __len__(self):
        return len(self.items)

obj = MyContainer([])
if not obj:
    print('MyContainer пуст')

определение типа данных python (определение типов данных в python)

MyContainer пуст

Сложность:

Если класс определяет оба метода, приоритет у __bool__. Кроме того, если __bool__ возвращает True, объект будет считаться truthy независимо от __len__.

Сводка по выбору подхода

  • Если нужно просто проверить «есть ли данные» - используйте if not value.
  • Если нужно отличить None от пустой строки - if value is None.
  • Если требуется проверка конкретной коллекции с гарантией её существования - if len(value) == 0 (после предварительной проверки на None).
  • Для самодельных классов реализуйте __bool__ или __len__ для логической проверки.
- числа с плавающей запятой python (числа с плавающей запятой в python)
- является ли числом python (проверка, является ли значение числом в python)
- Python пустые значения (пустые значения в python)

Расширенные примеры работы с пустыми значениями

Пример 1: Различие между is None и == None

Пример
class BadEquals:
    def __eq__(self, other):
        return True

obj = BadEquals()
print(obj == None)  # True – из-за переопределенного __eq__
print(obj is None)  # False – корректно
True
False

Оператор is сравнивает идентичность объектов, поэтому он надёжен для проверки на None.

Пример 2: Фильтрация пустых значений из списка

Пример
data = [1, 0, None, '', [1,2], [], False, True]
filtered = [x for x in data if x]  # останутся только truthy
print(filtered)
[1, [1, 2], True]

Если нужно оставить, например, только None отдельно, применяют filter(lambda x: x is not None, data).

Пример 3: Проверка вложенных структур с protect от ошибок

Пример
def safe_len(obj):
    try:
        return len(obj)
    except TypeError:
        return None

test_values = [None, 'hello', [], 42]
for v in test_values:
    length = safe_len(v)
    if length is None:
        print(f'{v!r} не поддерживает len()')
    elif length == 0:
        print(f'{v!r} пуст')
    else:
        print(f'{v!r} имеет длину {length}')
None не поддерживает len()
'hello' имеет длину 5
[] пуст
42 не поддерживает len()

Пример 4: Пользовательский класс с __bool__ и __len__

Пример
class Inventory:
    def __init__(self):
        self._items = []
    def add(self, item):
        self._items.append(item)
    def __len__(self):
        return len(self._items)
    def __bool__(self):
        # например, считаем склад пустым, если нет товаров или все товары с ценой 0
        return any(item.price > 0 for item in self._items)

stock = Inventory()
if not stock:
    print('Склад пуст (согласно __bool__)')
if len(stock) == 0:
    print('Список товаров пуст')
Склад пуст (согласно __bool__)
Список товаров пуст

Пример 5: Использование None в качестве значения по умолчанию и распознавание пустых аргументов

Пример
def process(value=None):
    if value is None:
        print('Аргумент не передан')
    elif not value:
        print('Передано пустое falsy значение (например, 0 или "")')
    else:
        print(f'Обрабатываем: {value}')

process()
process(0)
process('text')
Аргумент не передан
Передано пустое falsy значение (например, 0 или "")
Обрабатываем: text

Пример 6: Проверка на None в цепочке вызовов (safe navigation)

В Python нет встроенного оператора safe navigation, как в некоторых языках. Можно использовать условное выражение или getattr с умолчанием:

Пример
config = None
# без проверки: config.get('key') -> AttributeError
value = config.get('key') if config is not None else None
print(value)  # None
None

Более гибкий подход - использовать библиотеку pydantic или создавать свои классы-обёртки, но в рамках базового Python достаточно явной проверки.

Пример 7: Ошибка при смешивании None и выражений типа x or default

Пример
def get_name(user):
    return user.get('name') or 'Гость'

print(get_name({'name': ''}))   # '' -> falsy -> 'Гость'
print(get_name({'name': None})) # None -> 'Гость'
print(get_name({'name': 'Анна'})) # 'Анна'
Гость
Гость
Анна

Проблема:

Если пустая строка должна оставаться пустой, а не заменяться на 'Гость', такой код даст неверный результат. В этих случаях лучше использовать явную проверку if 'name' in user.

Пустые значения в Python - comments

En
Python пустые значения (python)