Когда выполняется finally в недочитанном генераторе
Вопрос
Генератор открывает файл в try/finally и выдаёт строки. Код прочитал две строки и перестал итерировать, сохранив ссылку на генератор. Когда выполнится finally?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Варианты ответа
- Сразу после второго
next - Никогда:
finallyв генераторах не выполняется - При
g.close()или при сборке генератораправильный ответ - При следующем
next, даже если он не нужен
Разбор
close() бросает в точку yield исключение GeneratorExit, и выполняются finally и __exit__. Если явно не закрыть, это сделает финализатор при уничтожении объекта, в CPython обычно сразу после потери последней ссылки, в других реализациях позже. Поэтому для ресурсов надёжнее with closing(gen) или контекстный менеджер снаружи генератора. Сам по себе finally не срабатывает между next, и после ухода со строки ничего не произойдёт, пока жива ссылка.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Предыдущий вопрос
Свой итерируемый класс, который можно обходить много раз
Следующий вопрос
Полезные функции itertools
Термины по теме
Ещё по теме «Итераторы и генераторы»
- Когда выполняется тело генератора
- Разбить последовательность на пачки
- Рекурсивно развернуть вложенные списки
- Конвейер обработки лога на генераторах
- Ленивые вычисления
- Протокол итерации
- Генераторное выражение против list comprehension
- itertools.groupby на несортированных данных