Что делает ключевое слово `exit` в Python3 с Jupyter Notebook? - PullRequest
0 голосов
/ 07 декабря 2018

В настоящее время я использую Python3 в Jupyter Notebook, и я наткнулся на ключевое слово exit.Что делает это ключевое слово?

with open("some_file.txt") as f:
    for lines in f:
        print(lines)
        exit

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Строки 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 и обычный интерактивный режим обрабатывают автоматическую печать выражений.

0 голосов
/ 07 декабря 2018

Когда exit ( sic без скобок) используется в iPython в цикле или ветви условного оператора , он ничего не делает, потому что это простоссылка на экземпляр IPython.core.autocall.ExitAutocall:

for i in range(10): 
    exit 
print(i)
# 9

if i==9: 
   exit 
   print(exit)    
# <IPython.core.autocall.ExitAutocall object at 0x7f76ad78a4a8>      

Не перезапускает ядро:

print(i)
# 9

Однако при использовании только в командной строке , рассматривается как разновидность магии (хотя и без %) и завершает работу ядра.

0 голосов
/ 07 декабря 2018

В моем простом тесте
Ячейка 1
a = 3
Ячейка 2
exit
Ячейка 3
print(a)

В результате

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-1-3f786850e387> in <module>
----> 1 a

NameError: name 'a' is not defined

exit просто убивает ядро, на которое рассчитывает ноутбук для выполнения.

Интересно, однако, что, похоже, есть параметр, который вы также можете передать, чтобы изменить это поведение.

Тест 2: Ячейка 1
a = 3
Ячейка 2
exit(keep_kernel=True)
Ячейка 3
print(a) В результате 3

РЕДАКТИРОВАТЬ: И похоже, что ответ @ user2357112 заполняет недостающие фрагменты.
EDIT2: На самом деле, это, кажется, экземпляр IPython.core.autocall.ZMQExitAutocall

 class IPython.core.autocall.ZMQExitAutocall(ip=None)

    Bases: IPython.core.autocall.ExitAutocall

    Exit IPython. Autocallable, so it needn’t be explicitly called.
    Parameters: keep_kernel (bool) – If True, leave the kernel alive. Otherwise, tell the kernel to exit too (default).
...