关于python:使用Jupyter Notebook在Python3中使用`exit`关键字做什么?

What does `exit` keyword do in Python3 with Jupyter Notebook?

我目前正在Jupyter笔记本中使用python3,我刚刚遇到一个关键字exit。这个关键字做什么?

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


循环中的exit行不起作用。但是,它们为什么不做比通常的原因更复杂一些,因为exit在Python中不做任何事情。

通常情况下,单独一行的exit不会退出python。最多,在交互模式下,它会打印一条消息,告诉您如何退出python(消息在_sitebuiltins.Quitter.__repr__中实现):

1
2
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit

伊普生做了一些不同的事情。IPython为了交互方便而拥有的许多额外系统中,有一个系统可以自动调用某种类型的实例,即IPython.core.autocall.IPyAutocall。(这与%autocall魔法相似,但不同。)

在IPython中,exitquit被设置为IPython.core.autocall.ExitAutocall的实例,IPyAutocall的一个子类。ipython识别这种类型的对象,所以当执行只包含exitquit的行时,ipython实际上退出。

1
2
In [1]: exit
[IPython dies here]

Jupyter笔记本的ipython内核将exitquit设置为非常密切相关的IPython.core.autocall.ZMQExitAutocall的实例,这些实例有一些额外的功能来支持keep_kernel参数,但在其他方面是相同的。

但是,只有当引用autocalable对象的行是单元格的整个内容时,此功能才会触发。在一个循环中,autocall功能不会触发,所以我们将回到什么都没有发生的状态。

事实上,与正常交互模式相比,在正常的非IPython交互会话中,由于IPython和常规交互模式处理表达式自动打印的方式不同,此循环将在每次迭代中打印"use exit()…"消息。


当条件语句的循环或分支中的ipython中使用exit(sic,无括号)时,它什么也不做,因为它只是引用IPython.core.autocall.ExitAutocall的一个实例:

1
2
3
4
5
6
7
8
9
for i in range(10):
    exit
print(i)
# 9

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

它不会重新启动内核:

1
2
print(i)
# 9

但是,当单独在命令行上使用时,它被视为一种魔力(尽管没有%)并终止内核。


在我的简单测试中,单元1a = 3。单元2江户十一〔一〕号单元3埃多克斯1〔2〕

结果

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

NameError: name 'a' is not defined

exit只是杀死了笔记本执行所依赖的内核。

然而,有趣的是,似乎也有一个参数可以用来修改这种行为。

测试2:单元1a = 3。单元2埃多克斯1〔5〕单元3埃多克斯1〔2〕结果江户十一〔七〕号

编辑:看起来@user2357112的答案会填充缺失的部分。伊迪丝2:实际上,这似乎是一个IPython.core.autocall.ZMQExitAutocall的例子。

1
2
3
4
5
6
 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).