Строки exit
в вашем цикле ничего не делают.Почему они ничего не делают, это немного сложнее, чем обычная причина, по которой exit
ничего не делает в Python.
Обычно, exit
на отдельной строке не выходит из Python.Самое большее, в интерактивном режиме, это напечатало бы сообщение, говорящее вам, как выйти из Python (сообщение реализовано в _sitebuiltins.Quitter.__repr__
):
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
IPython делает что-то другое.Среди многих дополнительных систем, которые IPython имеет для интерактивного удобства, есть система для автоматического вызова экземпляров определенного типа, IPython.core.autocall.IPyAutocall
.(Это похоже на магию %autocall
, но отличается от нее.)
В IPython exit
и quit
устанавливаются в экземплярах IPython.core.autocall.ExitAutocall
, подкласс IPyAutocall
.IPython распознает объекты этого типа, поэтому при выполнении строки, содержащей только exit
или quit
, IPython фактически завершается.
In [1]: exit
[IPython dies here]
В ядре IPython ноутбука Jupyter установлено exit
и quit
к экземплярам очень тесно связанного IPython.core.autocall.ZMQExitAutocall
, который имеет некоторые дополнительные функции для поддержки аргумента keep_kernel
, но в остальном тот же.
Эта функция срабатывает только при обращении к строкек объекту, который может автоматически вызываться, является все содержимое ячейки.Внутри цикла функция автоматического вызова не срабатывает, поэтому мы возвращаемся к тому, что ничего не происходит.
На самом деле, происходит даже меньше, чем то, что происходит в обычном интерактивном режиме - в обычном интерактиве, отличном от IPython.сеанс, этот цикл будет выводить сообщение «Использовать выход () ...» на каждой итерации из-за различий в том, как IPython и обычный интерактивный режим обрабатывают автоматическую печать выражений.