Первый работающий API

Query-параметры и фильтрация каталога

Содержание курса

Два условия фильтрации одного каталога

Каталог хранится как словарь rooms_by_id, где ключ — числовой id, а значение — словарь с полями комнаты. Нас интересуют два поля: capacity (количество мест) и has_projector (булево наличие проектора).

Фильтрация работает в два шага. Первый — отсев по вместимости:

result = [r for r in rooms_by_id.values() if r["capacity"] >= min_capacity]

Мы берём все значения словаря и оставляем только те комнаты, где мест не меньше, чем запрошено. Если min_capacity=0 (значение по умолчанию), условие пройдут все комнаты.

Второй шаг — фильтр по проектору, но только если он был передан:

if has_projector is not None:
    result = [r for r in result if r["has_projector"] == has_projector]

Проверка is not None принципиальна. Если написать if has_projector:, то явно переданный False тоже не пройдёт условие — Python посчитает его ложным, и фильтрация по комнатам без проектора молча отключится. Проверка is not None отличает «фильтр не задан» от «фильтр задан как False».

Когда has_projector=False, второй шаг оставит только комнаты с has_projector == False — то есть именно те, где проектора нет. Когда параметр не передан и равен None, шаг пропускается, и ограничений по оборудованию нет.

Оба условия применяются последовательно к одному списку, поэтому результат — пересечение: комнаты, удовлетворяющие обоим критериям одновременно.

При этом rooms_by_id остаётся нетронутым. Мы создаём новые списки через list comprehension, а не удаляем записи из словаря. Следующий запрос снова получит полный каталог.