ChainMap в Python: исправьте приоритет настроек и удаление переопределений

Напишите решение на Python и проверьте его на странице.

Другие упражнения по этой теме: Collections в Python: задачи на ChainMap, defaultdict и deque.

Многослойная конфигурация шага

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

Что уже дано

В предоставленном скрипте уже реализованы разбор JSON из стандартного ввода и печать результата, но функция apply_mutations содержит ошибки в порядке слоёв и логике удаления переопределений.

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

Исправьте функцию apply_mutations(base_cfg, env_cfg, step_cfg, operations) -> dict.

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

  • base_cfg — словарь базовых настроек;
  • env_cfg — словарь настроек окружения;
  • step_cfg — словарь начальных настроек активного шага;
  • operations — список операций, применяемых строго по порядку.

Каждая операция представляет собой словарь с полем "op":

  • {"op": "set", "key": str, "value": any} — устанавливает или перезаписывает значение ключа в активном слое шага.
  • {"op": "reset", "key": str} — удаляет ключ исключительно из активного слоя шага. Если ключа не было в настройках шага, операция безопасно игнорируется (ошибки возникать не должно, даже если ключ есть в окружении или базе).

Правила формирования результата:

  • Операции мутации затрагивают только активный слой шага. Исходные значения env_cfg и base_cfg остаются неизменными и служат неизменяемыми слоями подстановки.
  • Значения null, false и 0 считаются существующими значениями, а не признаком отсутствия ключа.
  • Итоговая конфигурация ключей разрешается по строгому приоритету: активные настройки шага исходные настройки окружения env_cfg исходные базовые настройки base_cfg. Если ключ отсутствует во всех трёх слоях, он не должен присутствовать в итоговой конфигурации.
  • Начальные настройки step_cfg участвуют в поиске значений с наивысшим приоритетом даже при пустом списке операций operations.

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

  • "resolved_config" — словарь всех видимых ключей с их итоговыми значениями согласно приоритету слоёв;
  • "step_overrides" — словарь итоговых настроек активного слоя шага со всеми применёнными операциями.

Ввод и вывод

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

Формат ввода

В stdin передаётся единая JSON-строка — объект с четырьмя ключами: "base", "env", "step" (словари произвольных значений) и "operations" (список операций set и reset).

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

В stdout выводится одна JSON-строка с ключами "resolved_config" и "step_overrides", отсортированными по алфавиту и с компактными разделителями.

Пример

Ввод
{"base":{"host":"127.0.0.1","port":8080,"retries":3},"env":{"port":9000,"debug":true},"step":{"retries":5},"operations":[{"op":"set","key":"threads","value":8},{"op":"reset","key":"retries"},{"op":"reset","key":"debug"}]}
Вывод
{"resolved_config":{"debug":true,"host":"127.0.0.1","port":9000,"retries":3,"threads":8},"step_overrides":{"threads":8}}
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

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

Связанные задачи