我目前在Jupyter Notebook中使用Python3,但刚遇到关键字exit
。此关键字的作用是什么?
with open("some_file.txt") as f:
for lines in f:
print(lines)
exit
答案 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中,exit
和quit
设置为IPyAutocall
的子类IPython.core.autocall.ExitAutocall
的实例。 IPython会识别这种类型的对象,因此当执行仅包含exit
或quit
的行时,IPython实际上会退出。
In [1]: exit
[IPython dies here]
Jupyter笔记本的IPython内核已将exit
和quit
设置为密切相关的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).