Специализированные структуры данных и потоковая обработка

Коллекции стандартной библиотеки: deque, Counter, defaultdict и ChainMap

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

0 / 1 баллов

Иерархия настроек организаций

Облачная платформа обслуживает независимые организации, для каждой из которых действует собственный набор параметров. Если конкретная настройка не задана для организации индивидуально, система обращается к глобальным значениям по умолчанию. При обработке входящих запросов клиенты могут временно переопределять любые параметры: такие переопределения действуют строго в рамках текущего обращения и не должны влиять на последующие операции того же или других клиентов. Кроме вычисления итоговых значений, платформа ведёт аудит всех ключей, которые хотя бы раз переопределялись для каждой организации.

Что уже дано

Готовый скрипт считывает входной JSON-объект, передаёт данные в функцию resolve_tenant_requests и выводит результат обратно в формате JSON.

Что нужно сделать

Реализуйте функцию resolve_tenant_requests(platform_defaults, tenants_config, requests).

Функция принимает три аргумента:

  • platform_defaults — словарь базовых настроек платформы по умолчанию;
  • tenants_config — словарь конфигураций организаций, где ключом является строковый идентификатор организации (tenant_id), а значением — словарь её индивидуальных настроек;
  • requests — упорядоченный список запросов.

Каждый элемент списка requests представляет собой словарь со следующими полями:

  • tenant_id — строковый идентификатор организации (гарантированно присутствует среди ключей tenants_config);
  • overrides — словарь настроек, переопределяемых исключительно для этого запроса;
  • query_keys — список имён настроек, значения которых требуется вернуть в ответе на этот запрос.

Функция должна вернуть словарь ровно с двумя ключами: "responses" и "audit_modified_keys".

Правила формирования списка responses:

  • Порядок элементов строго соответствует порядку запросов в requests.
  • Каждый словарь ответа содержит только те ключи, которые перечислены в query_keys текущего запроса.
  • Значение для каждого ключа выбирается по строгому приоритету:
  1. Значение из overrides текущего запроса, если ключ в нём присутствует;
  2. Значение из конфигурации организации в tenants_config, если ключ в нём присутствует;
  3. Значение из глобального словаря platform_defaults, если ключ в нём присутствует;
  4. Если ключ отсутствует на всех трёх уровнях, его значением становится None (в JSON — null).
  • Значения False, 0, пустые строки или None считаются реально заданными значениями, а не признаком отсутствия ключа.
  • Переопределения из overrides изолированы: они действуют только в рамках своего запроса и не должны изменять настройки организации или платформы для любых последующих обращений.

Правила формирования словаря audit_modified_keys:

  • Ключами являются идентификаторы всех организаций из tenants_config, включая те, для которых в requests не поступило ни одного запроса.
  • Значением для каждой организации является список уникальных имён ключей, которые хотя бы раз встречались в словаре overrides запросов этой организации, отсортированный по возрастанию (лексикографически).
  • В аудит включаются все ключи из overrides, даже если их не запрашивали в query_keys, независимо от их значений (включая None, False и 0).
  • Если для организации не было запросов или ни в одном из её запросов не передавались ключи в overrides, значением должен быть пустой список [].

Ввод и вывод

Программа взаимодействует с внешним окружением через стандартные потоки stdin и stdout.

Формат ввода

В стандартный ввод передаётся единый JSON-объект, содержащий:

  • "platform_defaults" — объект со строковыми ключами настроек платформы по умолчанию;
  • "tenants" — объект, отображающий строковые идентификаторы организаций в объекты их настроек;
  • "requests" — массив объектов, каждый из которых содержит поля "tenant_id", "overrides" и "query_keys".

Формат вывода

В стандартный вывод выводится одна JSON-строка — объект с ключами "audit_modified_keys" и "responses", сериализованный с сортировкой ключей и компактными разделителями.

О данных в ответах

Используйте учебные данные. Не вставляйте пароли, токены, ключи доступа, паспортные и банковские данные, а также персональные данные других людей. Политика обработки данных.

Проверяется тестами (1)
  • Тест 1
    Ввод
    {"platform_defaults":{"audit_log":false,"max_batch":100,"theme":"light"},"tenants":{"alpha":{"max_batch":250,"tier":"pro"},"beta":{"audit_log":true}},"requests":[{"tenant_id":"alpha","overrides":{"theme":"dark"},"query_keys":["theme","max_batch","audit_log","tier","missing_flag"]},{"tenant_id":"beta","overrides":{"max_batch":500},"query_keys":["audit_log","max_batch","tier"]},{"tenant_id":"alpha","overrides":{"custom_rate":10},"query_keys":["custom_rate","theme"]}]}
    Ожидаемый вывод
    {"audit_modified_keys":{"alpha":["custom_rate","theme"],"beta":["max_batch"]},"responses":[{"audit_log":false,"max_batch":250,"missing_flag":null,"theme":"dark","tier":"pro"},{"audit_log":true,"max_batch":500,"tier":null},{"custom_rate":10,"theme":"light"}]}
Решение
Как проверяется решение

Сравнение вывода: Правила исходной проверяющей системы. Интерактивный запуск не влияет на оценку. Лимит сессии — 5 минут, процессорного времени — 10 секунд.

Отправьте решение, чтобы увидеть результаты тестов.

Начать заново?

Помощник начнёт новый диалог по этой задаче. Текущая переписка останется в истории до конца срока хранения.

О переписке

Можно приложить до трёх фото PNG, JPEG или WebP по 5 МБ.

Переписка и фото хранятся 90 дней после последнего принятого сообщения и доступны преподавателям курса. Чтобы попросить преподавателя подключиться, отправьте обращение из диалога.

Проверка решения остаётся отдельным действием.