问题
I am currently using Python3 in Jupyter Notebook and I just ran into a keyword exit
. What does this keyword do ?
with open("some_file.txt") as f:
for lines in f:
print(lines)
exit
回答1:
The exit
lines in your loop do nothing. Why they do nothing is a bit more complicated than the usual reason exit
would do nothing in Python, though.
Normally, exit
on a line by its own wouldn't exit Python. At most, in interactive mode, it would print a message telling you how to quit Python (message implemented in _sitebuiltins.Quitter.__repr__):
>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
IPython does something different. Among the many extra systems IPython has for interactive convenience is a system to autocall instances of a certain type, IPython.core.autocall.IPyAutocall
. (This is similar to but distinct from the %autocall magic.)
In IPython, exit
and quit
are set to instances of IPython.core.autocall.ExitAutocall, a subclass of IPyAutocall
. IPython recognizes objects of this type, so when a line containing just exit
or quit
is executed, IPython actually exits.
In [1]: exit
[IPython dies here]
A Jupyter notebook's IPython kernel has exit
and quit
set to instances of the very closely related IPython.core.autocall.ZMQExitAutocall, which has some extra functionality to support a keep_kernel
argument, but is otherwise the same.
This functionality only triggers when a line referring to the autocallable object is the entire content of the cell, though. Inside a loop, the autocall functionality doesn't trigger, so we're back to nothing happening.
In fact, even less happens than what would happen in normal interactive mode - in a normal, non-IPython interactive session, this loop would print the "Use exit()..." message on each iteration, due to differences in how IPython and the regular interactive mode handle expression auto-printing.
回答2:
When exit
(sic, with no parentheses) is used in iPython in a loop or a branch of a conditional statement, it is doing nothing because it is simply a reference to an instance of 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>
It does not restart the kernel:
print(i)
# 9
However, when used on the command line alone, it is treated as a kind of magic (though without a %
) and terminates the kernel.
回答3:
On my simple test,
Cell 1a = 3
Cell 2exit
cell 3print(a)
resulted in
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-3f786850e387> in <module>
----> 1 a
NameError: name 'a' is not defined
exit
just kills the kernel that the notebook is relying on for execution.
Interestingly enough however, There seems to be a parameter you can pass to modify that behaviour as well.
Test 2:
Cell 1a = 3
Cell 2exit(keep_kernel=True)
cell 3print(a)
resulted in
3
EDIT: And looks like @user2357112's answer fills in the missing pieces.
EDIT2: Actually, it seems to be an instance of 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).
来源:https://stackoverflow.com/questions/53676034/what-does-exit-keyword-do-in-python3-with-jupyter-notebook