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

问题描述 投票:8回答:3

我目前在Jupyter Notebook中使用Python3,我刚刚遇到了关键字exit。这个关键字有什么作用?

with open("some_file.txt") as f:
    for lines in f:
        print(lines)
        exit
python jupyter-notebook exit keyword
3个回答
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被设置为IPython.core.autocall.ExitAutocall的子类IPyAutocall的实例。 IPython可识别此类型的对象,因此当执行仅包含exitquit的行时,IPython实际上会退出。

In [1]: exit
[IPython dies here]

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

但是,仅当引用自动对象对象的行是单元格的整个内容时,才会触发此功能。在循环内部,自动调用功能不会触发,因此我们不会发生任何事情。

事实上,发生的情况甚至比正常的交互模式更少 - 在正常的非IPython交互式会话中,由于IPython的不同,这个循环会在每次迭代时打印“使用exit()...”消息。和常规交互模式句柄表达式自动打印。


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

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


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).
© www.soinside.com 2019 - 2024. All rights reserved.