Декораторы Python: проверка цепочки wrapped и метаданных функции

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

Другие упражнения по этой теме: Декораторы Python: задачи на retry, rate limiter, кэш и Circuit Breaker.

Аудит цепочки декораторов

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

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

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

Что уже дано

В редакторе объявлена функция audit_chain(func, expected_name, expected_depth), которую вам необходимо реализовать.

Во время тестирования также доступны вспомогательные инструменты проверки (включая фабрику цепочек make_chain_probe), которые можно использовать в локальных экспериментах; реализовывать их заново не требуется.

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

Реализуйте функцию audit_chain(func, expected_name, expected_depth).

Параметры функции:

  • func — исследуемая функция (вершина цепочки обёрток);
  • expected_name (str) — доверенное эталонное имя команды (длиной от 1 до 100 символов);
  • expected_depth (int) — ожидаемая глубина наложения декораторов (целое число от 0 до 100).

Правила аудита:

  • Разматывайте цепочку, последовательно переходя по ссылкам в атрибуте __wrapped__, пока этот атрибут присутствует у текущего объекта. Сами исследуемые функции вызывать запрещено.
  • Считайте количество фактически пройденных переходов по __wrapped__ как текущую глубину depth (для функции вовсе без __wrapped__ глубина равна 0). Все цепочки конечны и ацикличны, глубина лежит в диапазоне от 0 до 100.
  • Когда достигнута терминальная функция, у которой атрибут __wrapped__ отсутствует, проверьте её имя в __name__ и накопленную глубину depth против контрольной карточки (expected_name и expected_depth).
  • Функция audit_chain возвращает словарь ровно с тремя ключами:
  • если и имя __name__, и глубина depth точно совпали с ожидаемыми: {"ok": True, "depth": depth, "broken_name": None};
  • если есть расхождение по имени или глубине: {"ok": False, "depth": depth, "broken_name": broken_name}, где broken_name — строковое значение __name__ той терминальной функции, на которой оборвалась цепочка.

Ввод и вывод

Стандартные потоки ввода и вывода не используются: считывать данные через sys.stdin и выводить результат через print() не нужно. Проверяющая система выполняет код ученика, получает из глобального пространства имён функцию верхнего уровня audit_chain и вызывает её с тестовыми объектами.

Пример использования

probe = make_chain_probe("command", [("bad", "lost"), ("good", "outer")])
print(audit_chain(probe.root, "command", 2))

Вывод:

{'ok': False, 'depth': 1, 'broken_name': 'lost'}
РешениеPython

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

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

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