2016-12-07 26 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

相關問題