2016-12-07 49 views
3

内置函数quit()在Python-3.x和IPython 3中的行为不同。如果在IPython中执行,则下列代码会打印Hello,但不会打印任何内容Python:在Python-3.x和IPython中quit()的工作方式不同

quit() 
print("Hello") 

IPython中quit()的用途是什么?改变其行为的原因是什么?

+1

这是为了退出翻译会议......?这对我行得通。无论如何,说一般的交互式Python解释器REPL和IPython之间的区别可能更为精确。 IPython与Python 3.x没有区别......无论如何,你是否真的在用'ipython'运行脚本? quit函数只是用于退出python shell会话,不应该在脚本中使用。 –

+0

@ juanpa.arrivillaga由于打印出“Hello”,IPython中的apparenlty quit()并不真正退出解释器 - 至少不会立即。 – DyZ

+1

它的确如果你在解释器* shell会话*,这就是它的意思。这可能是一些松散的结局,因为没有人认为你会在交互式提示符之外使用'quit'。 –

回答

4

它看起来像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(),这也是在脚本内部早期退出的正确方法,并且不能用作交互式提示的钩子。

+0

'quit'甚至不是内建的。 –

+0

正如我上面所说,它是:https://docs.python.org/3/library/constants.html – DyZ

+1

@ juanpa.arrivillaga:排序。它是一个特殊的'Quitter'类的实例,它看起来是在Python中实现的(它有像'repr'这样有用的附加功能,可以提醒你如果键入'quit'并忘记调用它,就需要添加括号)。它仅仅是一个内建的,因为它随核心Python一起提供,而不是CPython解释器核心的实际部分或'__builtins__'的C级实现或任何其他东西,它只是被'site'推到'__builtins__'中。 (在技术上,'site'自动导入可以被禁用,尽管这很少完成)。 – ShadowRanger

相关问题