带有Jupyter Notebook的Python3中的`exit`关键字有什么作用?

时间:2018-12-07 19:53:28

标签: python jupyter-notebook exit keyword

我目前在Jupyter Notebook中使用Python3,但刚遇到关键字exit。此关键字的作用是什么?

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

3 个答案:

答案 0 :(得分:7)

循环中的exit行无效。为什么它们什么都不做比exit在Python中什么都不做的通常原因复杂。


通常,一行上的exit本身不会退出Python。最多在交互模式下,它将显示一条消息,告诉您如何退出Python(在_sitebuiltins.Quitter.__repr__中实现的消息):

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

IPython做一些不同的事情。 IPython为方便交互而具有的众多其他系统中,有一个autocall特定类型IPython.core.autocall.IPyAutocall实例的系统。 (这类似于%autocall魔术,但与之不同。)

在IPython中,exitquit设置为IPyAutocall的子类IPython.core.autocall.ExitAutocall的实例。 IPython会识别这种类型的对象,因此当执行仅包含exitquit的行时,IPython实际上会退出。

In [1]: exit
[IPython dies here]

Jupyter笔记本的IPython内核已将exitquit设置为密切相关的IPython.core.autocall.ZMQExitAutocall的实例,该实例具有一些额外的功能来支持keep_kernel参数,但是否则是相同的。

该功能仅在引用自动调用对象的行是单元格的全部内容时触发。在循环内部,自动调用功能不会触发,因此我们什么也没做。

实际上,发生的情况比正常交互模式下要少得多-在正常的非IPython交互会话中,由于不同,此循环将在每次迭代中打印“ Use exit()...”消息IPython和常规交互模式如何处理表达式自动打印。

答案 1 :(得分:4)

在iPython 的循环或条件语句分支中使用exit sic ,不带括号)时,它什么都不做,因为它只是对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

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

答案 2 :(得分:3)

在我的简单测试中,
单元格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).