← Назад к вопросам

Пустой словарь переводится как True или False

2.0 Middle🔥 111 комментариев
#Python Core#Архитектура и паттерны

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пустой словарь в контексте истинности (truthiness)

Пустой словарь {} переводится как False в Python.

Основное правило

# Пустой словарь
empty_dict = {}
bool(empty_dict)  # False

if empty_dict:
    print("Dictionary is not empty")  # ❌ Не выполнится
else:
    print("Dictionary is empty")      # ✅ Выполнится

Правила для других типов

В Python есть глобальное правило: контейнеры оцениваются как False, если пусты.

# ❌ False (пусто)
bool({})           # False - пустой словарь
bool([])           # False - пустой список
bool(())           # False - пустой кортеж
bool("")           # False - пустая строка
bool(set())        # False - пустое множество
bool(frozenset())  # False - пустой frozenset

# ✅ True (не пусто)
bool({"key": "value"})  # True - словарь с данными
bool([1, 2, 3])         # True - список с данными
bool("hello")           # True - строка с данными
bool({1, 2, 3})         # True - множество с данными

Практические примеры

Проверка наличия данных

def process_config(config: dict):
    """Обработать конфиг, если он не пустой"""
    
    if not config:  # Эквивалентно: if len(config) == 0
        print("No configuration provided")
        return
    
    for key, value in config.items():
        print(f"{key}: {value}")

# Использование
process_config({})                    # Ничего не выведет
process_config({"debug": True})       # Выведет debug: True

Установка значений по умолчанию

# ❌ Неправильно (проверяет только существование ключа)
result = user_data.get('preferences') or {}
# Если user_data['preferences'] = {}, всё равно используем пустой словарь

# ✅ Правильно (явная проверка на None)
result = user_data.get('preferences') or {}
if not result:  # Результат пустой
    result = get_default_preferences()

Фильтрация пустых результатов

def search_users(filters: dict):
    """Искать пользователей, если есть фильтры"""
    
    if not filters:  # Если filters пустой
        # Вернуть всех пользователей без фильтрации
        return User.objects.all()
    
    # Применить фильтры
    query = User.objects.all()
    for field, value in filters.items():
        query = query.filter(**{field: value})
    return query

# Использование
search_users({})                              # Все пользователи
search_users({"is_active": True, "role": "admin"})  # С фильтрами

Важный нюанс: разница между None и {}

# Это РАЗНЫЕ вещи!
bool(None)  # False - отсутствие значения
bool({})    # False - пустой контейнер

# Но оба дают False!
if None:
    print("Won't print")  # ❌

if {}:
    print("Won't print")  # ❌

# Нужно проверить явно если нужно различить
def handle_config(config):
    if config is None:
        print("Config not provided")  # None — не передали
    elif not config:
        print("Config is empty")      # {} — пустой словарь
    else:
        print(f"Config: {config}")    # Есть данные

handle_config(None)              # Config not provided
handle_config({})                # Config is empty
handle_config({"key": "value"})  # Config: {...}

В контексте условий

data = {}

# Все эти условия эквивалентны для пустого словаря:
if not data:             # ✅ Самое понятное
if len(data) == 0:       # ✅ Явное, но многословное
if data == {}:           # ✅ Очень явное
if bool(data) == False:  # ❌ Излишне сложно

# Все вернут True для пустого словаря
print(not {})            # True
print(len({}) == 0)      # True
print({} == {})          # True

Проверка пустого словаря в функциях

from typing import Optional

def process_data(options: dict) -> str:
    """Обработать данные с опциями"""
    
    if not options:  # Пустой словарь → False
        return "Processing with defaults"
    
    return f"Processing with options: {options}"

process_data({})              # Processing with defaults
process_data({"mode": "fast"})  # Processing with options: {'mode': 'fast'}

Класс с методом bool

Вы можете определить, как ваш класс оценивается:

class Config:
    def __init__(self, data: dict):
        self.data = data
    
    def __bool__(self):
        """Определяем, что означает истина для Config"""
        return len(self.data) > 0  # True если есть данные

config_empty = Config({})
config_full = Config({"key": "value"})

bool(config_empty)  # False
bool(config_full)   # True

if config_empty:
    print("Config has data")  # ❌ Не выполнится
else:
    print("Config is empty")  # ✅ Выполнится

Частая ошибка

# ❌ НЕПРАВИЛЬНО: проверяем просто существование
response = make_api_call()  # может вернуть {} или None

if response:
    print(f"Got response: {response}")
else:
    print("No response")

# Если response = {}, условие выдаст False,
# хотя вызов был успешным!

# ✅ ПРАВИЛЬНО: проверяем явно
if response is None:
    print("No response")
elif not response:  # Пустой ответ
    print("Empty response")
else:
    print(f"Got response: {response}")

Итоговая справка

# ПАМЯТКА
dict_empty = {}

# Проверка на пустоту
bool(dict_empty)        # False
if not dict_empty: ...  # True (пусто)
len(dict_empty) == 0    # True

# Проверка на наличие ключей
if dict_empty:          # False (пусто)
if dict_empty.keys():   # False (пусто)

# Проверка на наличие значения
dict_empty.get('key')   # None (нет ключа)
'key' in dict_empty     # False (нет ключа)

Практический пример из Django

# Django ORM QuerySet
users = User.objects.filter(is_active=False)

# Проверка, нашли ли пользователей
if users:  # Если QuerySet не пустой
    print(f"Found {users.count()} inactive users")
else:      # QuerySet пустой (не найдено)
    print("No inactive users")

# Для словарей работает аналогично
user_data = {}

if user_data:  # False — нет данных
    print("User data found")
else:          # True — пусто
    print("No user data")

Вывод

Пустой словарь {} переводится как False в контексте истинности. Это следует из общего правила Python: пустые контейнеры ([], (), "", set(), dict()) оцениваются как False, а непустые — как True.

Это удобно для проверок:

if my_dict:
    # Делаем что-то если словарь не пустой
else:
    # Словарь пустой
Пустой словарь переводится как True или False | PrepBro