Python: использование продолжения в инструкции try-finally в цикле
Будет ли следующий код:
while True:
try:
print("waiting for 10 seconds...")
continue
print("never show this")
finally:
time.sleep(10)
Всегда печатайте сообщение "Ожидание 10 секунд...", сон в течение 10 секунд и повторите его снова? Другими словами, выполняются ли операторы в выражениях finally
, даже если цикл continue
-ed?
Ответы
Ответ 1
Из python docs:
Если в наборе try из инструкции try... finally выполняется оператор return, break или continue, предложение finally также выполняется "на выходе". Оператор continue является незаконным в предложении finally. (Причина - проблема с текущей реализацией - это ограничение может быть отменено в будущем).
Ответ 2
Это должно быть доступно в будущем, уже есть запрос на слияние, который вышел в начале 2018 года.
https://github.com/serhiy-storchaka/cpython/pull/2/commits
Ответ 3
Документация использует немного неясный язык ("на выход"), чтобы объяснить, как этот сценарий заканчивается. Если оператор continue выполняется внутри условия исключения, будет выполнен код в предложении finally, а затем цикл продолжится до следующей итерации.
Вот очень наглядный пример, демонстрирующий поведение.
Код:
i=0
while i<5:
try:
assert(i!=3) #Raises an AssertionError if i==3
print("i={0}".format(i))
except:
continue
finally:
i+= 1; #Increment i
'''
Output:
i=0
i=1
i=2
i=4
'''
Ответ 4
Наконец, вы можете сделать это, CPython 3.8 делает это утверждение действительным:
Оператор continue недопустим в предложении finally из-за проблемы с реализацией. В Python 3.8 это ограничение было снято. (что нового)