Декораторы 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'}
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
Связанные задачи
- Functools.wraps в Python: имя функции и атрибут wrapped
- Декоратор Circuit Breaker на Python: остановка вызовов после сбоев
- Декоратор Python: логирование только медленных вызовов
- Кэширование Python: постройте ключ из выбранных аргументов функции
- Rate limiter на Python: декоратор со скользящим окном запросов
- Retry и fallback на Python: декоратор повторов с резервным вызовом
