Задача курса

Python: Диспетчер отчётов: полиморфный вызов без isinstance

Курс «Python для продвинутых: ООП, типизация и тестирование» · урок «Полиморфизм через общий интерфейс»

Условие

Диспетчер отчётов: полиморфный вызов без isinstance

Ты пишешь диспетчер отчётов для внутренней системы мониторинга. В системе появляются разные источники данных — каждый умеет генерировать текстовую сводку через метод report(). Диспетчер не должен знать конкретные классы: он просто вызывает report() у каждого объекта в списке.

Что уже дано

Проверяющая система ничего не создаёт заранее. Программа получает все данные через stdin и должна напечатать результат в stdout.

В редакторе есть незавершённый каркас с тремя классами и функцией-диспетчером.

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

Допиши программу так, чтобы она:

  1. Определяла три класса — ServerMetrics, DatabaseMetrics, QueueMetrics — каждый с методом report(self) -> str, который возвращает строку по правилам ниже.
  2. Определяла функцию dispatch(sources: list) -> list[str], которая принимает список объектов и без каких-либо isinstance-проверок вызывает у каждого метод report(), собирая результаты в список строк.
  3. Читала из stdin записи и создавала объекты нужного класса, затем передавала список в dispatch и печатала каждую строку из результата.

Форматы метода report() для каждого класса:

  • ServerMetrics(host: str, cpu: float) → "Server {host}: CPU {cpu}%"
  • DatabaseMetrics(name: str, queries: int) → "DB {name}: {queries} queries"
  • QueueMetrics(topic: str, lag: int) → "Queue {topic}: lag {lag}"

Важно: функция dispatch не должна содержать isinstance, type() или любые условия, зависящие от типа объекта.

Ввод и вывод

Программа читает данные из stdin и печатает результат в stdout.

Формат ввода

Первая строка — целое число n (количество записей).
Каждая из следующих n строк содержит тип и параметры, разделённые пробелом:

  • server <host> <cpu> — host это строка без пробелов, cpu — вещественное число
  • db <name> <queries> — name это строка без пробелов, queries — целое число
  • queue <topic> <lag> — topic это строка без пробелов, lag — целое число

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

n строк — результат вызова report() для каждого объекта в исходном порядке.

Примеры

Пример 1

Ввод
4
server web-01 73.5
db orders 1200
queue payments 42
server db-backup 12.0
Ожидаемый результат
Server web-01: CPU 73.5%
DB orders: 1200 queries
Queue payments: lag 42
Server db-backup: CPU 12.0%

Попробуйте решить

РешениеPython
Без регистрации · результат не сохраняется
Python: Диспетчер отчётов: полиморфный вызов без isinstance