quit()在Python-3.x和IPython中的工作方式不同

quit() works differently in Python-3.x and IPython

内置函数quit()在python-3.x和ipython 3中的行为不同。如果在IPython中执行,则以下代码将打印Hello,但不在python中打印任何内容:

1
2
quit()
print("Hello")

在伊普敦,quit()的目的是什么?改变行为的原因是什么?


看起来IPythonquit/exit的"函数"简化为只设置一个标志来表示"下次检查时应该退出"。它本身不会提升SystemExit,因此它可能依赖于一个间歇性检查,即如果同时对两个命令进行排队,则在第二个命令完成之前不会执行该检查。

你可以在ipython提示下自己检查它,首先运行quit??,看看它是一个可调用类,其__call__委托给self._ip.ask_exit()。接下来,运行quit._ip.ask_exit??,您将看到ask_exit刚刚设置了一个标志,self.exit_now = True(如果检查它,它是一个普通属性,而不是一个隐藏代码执行的property)。

欢迎您跟踪IPython正在检查的地方;我猜它是在IPython的任何给定行或单元完成之后完成的。

从根本上讲,区别在于ipython中的quit在常规python的交互交互接口中从来没有与quit相同;quit/exit作为内置接口,打算替换为交替的交互解释程序,并且不需要完全相同的行为。如果您想要一致的退出行为,那么import sys和运行sys.exit(),这也是在脚本中尽早退出的正确方法,并且不打算作为交互提示的挂钩。