Генератор можно остановить. Ты можешь явно вызвать g.close(), но…

Генератор можно остановить. Ты можешь явно вызвать g.close(), но обычно это делает сборщик мусора. Когда вызывается close, в точке, где выполнение генератора было приостановлено, выбрасывается исключение GeneratorExit:

def gen():
try:
yield 1
yield 2
finally:
print('END')


g = gen()
print(next(g)) # выведет '1'
g.close() # выведет 'END
'

Обрати внимание на три момента:


1. Нельзя использовать yield при обработке GeneratorExit

Если в блоке finally попытаться сделать yield, возникнет ошибка RuntimeError:

def gen():
try:
yield 1
finally:
yield 3 # ошибка!


g = gen()
next(g)
g.close() # RuntimeError


2. Исключение не выбрасывается, если генератор ещё не запускался

В этом случае генератор просто переходит в состояние остановлен, но finally не выполняется:

def gen():
try:
yield 1
finally:
print('END')


g = gen()
g.close() # ничего не выводит
print(list(g)) # выведет '[]'


3. close() ничего не делает, если генератор уже завершён

Если генератор полностью отработал, close() не вызывает finally повторно и просто игнорируется:

def gen():
try:
yield 1
yield 2
finally:
print('END')


g = gen()
print(list(g)) # ['1', '2']
print('Closing now')
g.close()

# Вывод:
# END
# [1, 2]
# Closing now


👉 @BookPython
Просмотры: 1 151
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

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

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти