quit() works differently in Python-3.x and IPython
内置函数quit()在python-3.x和ipython 3中的行为不同。如果在IPython中执行,则以下代码将打印Hello,但不在python中打印任何内容:
在伊普敦,quit()的目的是什么?改变行为的原因是什么?
- 是为了退出口译环节…?这对我很有用。无论如何,也许更准确地说,普通的交互式Python解释器repl和ipython之间的区别是什么。ipython和python 3.x没有区别…不管怎样,您是否在使用ipython运行脚本?quit函数仅用于退出Python shell会话,不应在脚本中使用。
- @juanpa.arrivilaga既然打印了"hello",ipython中的apparenlty quit()就不会真正退出解释器——至少不会立即退出。
- 如果您在一个解释器shell会话中,它会这样做,这就是它要做的。这可能是一些松散的结束,因为没有人认为您会在交互提示之外使用quit。
- 如果我在外壳中键入quit();print(10),它仍然会在退出前打印10。
- 好吧,护林员调查了一下,并发布了一个看起来很完整的答案。总之,quit不是内置函数。
- 实际上,它是:docs.python.org/3/library/constants.html
看起来IPython的quit/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(),这也是在脚本中尽早退出的正确方法,并且不打算作为交互提示的挂钩。
- quit甚至不是一个内置的。
- 如上所述,它是:docs.python.org/3/library/constants.html
- @Juanpa.arrivilaga:差不多。它是一个特殊的Quitter类的实例,看起来是在python中实现的(它有一些有用的额外功能,比如repr,提醒您如果键入quit并忘记调用它,就需要添加括号)。它是一个内置的,仅仅是因为它附带了核心python,而不是cpython解释器核心的实际部分,或者__builtins__的C级实现,或者其他东西,它在启动时被site包推到__builtins__中(从技术上讲,site自动导入可以被禁用,尽管很少这样做)。