Я думаю, что мой вопрос связан с этим, но не совсем похожим. Рассмотрим этот код:
def countdown(n):
try:
while n > 0:
yield n
n -= 1
finally:
print('In the finally block')
def main():
for n in countdown(10):
if n == 5:
break
print('Counting... ', n)
print('Finished counting')
main()
Результат этого кода:
Counting... 10
Counting... 9
Counting... 8
Counting... 7
Counting... 6
In the finally block
Finished counting
Гарантировано ли, что строка "В блоке finally" будет напечатана перед "Готовым подсчетом"? Или это из-за детализации реализации cPython, что объект будет собирать мусор, когда счетчик ссылок достигает 0.
Также мне интересно о том, как, finally
, блок countdown
выполнен генератор? например, если я изменю код main
на
def main():
c = countdown(10)
for n in c:
if n == 5:
break
print('Counting... ', n)
print('Finished counting')
то я вижу, что Finished counting
напечатанный до In the finally block
. Как сборщик мусора напрямую переходит в блок finally
? Я думаю, что я всегда принимал try/except/finally
по его номинальной стоимости, но мышление в контексте генераторов заставляет меня дважды подумать об этом.