Исправьте остановку генераторного конвейера Python

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

Другие упражнения по этой теме: Генераторы Python: задачи на ленивые конвейеры и закрытие ресурсов.

Безопасная остановка конвейера

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

При остановке конвейера промежуточный генератор пытается отправить итоговое резюме через yield прямо во время своего завершения. Из-за этого возникает RuntimeError, и штатное закрытие нижележащего читателя срывается: дескриптор так и остаётся незакрытым.

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

Что уже дано

В заготовке объявлена функция close_pipeline(aggregator, reader), которую вам предстоит реализовать.

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

Реализуйте функцию close_pipeline(aggregator, reader).

Функция принимает два объекта:

  • aggregator — обёртка над генератором, метод close() которой делегирует вызов генератору и может возбудить RuntimeError;
  • reader — источник данных, управляющий открытым файлом. Метод reader.close() освобождает ресурс и никогда не выбрасывает ошибок на допустимых входах, а свойство reader.closed возвращает булево состояние закрытия файла.

При закрытии конвейера соблюдайте следующие правила:

  • Обязательно вызовите метод close() у обоих объектов: aggregator и reader. Закрывать их можно в любом порядке, но вызов reader.close() должен произойти гарантированно, даже если закрытие aggregator завершилось ошибкой.
  • Не вычитывайте элементы из aggregator или reader: не вызывайте next() и не запускайте обход в цикле.
  • Функция должна вернуть кортеж из двух элементов (closed, error):
  • closed (bool) — значение свойства reader.closed после завершения очистки;
  • error (Exception | None) — исходный объект исключения, если закрытие aggregator завершилось ошибкой, либо None, если агрегатор закрылся без исключений. Заменять или повторно выбрасывать исключение нельзя.

Агрегатор во входных данных может быть как активным (обычным или проблемным), так и ещё не запущенным.

Ввод и вывод

Стандартный ввод stdin не используется. Печатать через print в stdout ничего не нужно: тестирующая система считывает из пространства имён модуля функцию верхнего уровня close_pipeline и вызывает её напрямую в проверяющих сценариях.

РешениеPython

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

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

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