私は現在Jupyter NotebookでPython3を使用していて、キーワードexit
に遭遇しました。このキーワードは何をしますか?
with open("some_file.txt") as f:
for lines in f:
print(lines)
exit
ループのexit
行は何もしません。ただし、何もしない理由は、Pythonでexit
が何もしない通常の理由よりも少し複雑です。
通常、行のexit
だけではPythonを終了しません。せいぜい、インタラクティブモードでは、終了方法を伝えるメッセージを出力しますPython(メッセージは __sitebuiltins.Quitter.__repr__
_ に実装されています):
_>>> exit
Use exit() or Ctrl-D (i.e. EOF) to exit
_
IPythonは別のことを行います。 IPythonがインタラクティブな利便性のために用意している多くの追加システムには、特定のタイプの_IPython.core.autocall.IPyAutocall
_のインスタンスを autocall にするシステムがあります。 (これは _%autocall
_ マジックと似ていますが異なります。)
IPythonでは、exit
とquit
はIPyAutocall
のサブクラスである _IPython.core.autocall.ExitAutocall
_ のインスタンスに設定されます。 IPythonはこのタイプのオブジェクトを認識するため、exit
またはquit
だけを含む行が実行されると、IPythonは実際に終了します。
_In [1]: exit
[IPython dies here]
_
JupyterノートブックのIPythonカーネルには、非常に密接に関連する _IPython.core.autocall.ZMQExitAutocall
_ のインスタンスにexit
およびquit
が設定されており、_keep_kernel
_引数ですが、それ以外は同じです。
ただし、この機能は、自動呼び出し可能なオブジェクトを参照する行がセルのコンテンツ全体である場合にのみトリガーされます。ループ内では、自動呼び出し機能はトリガーされないため、何も起こらない状態に戻ります。
実際、通常のインタラクティブモードで発生するよりもさらに少ない発生-通常の非IPythonインタラクティブセッションでは、IPythonの方法の違いにより、このループは各反復で「Use exit()...」メッセージを出力します。また、通常のインタラクティブモードでは、式の自動印刷が処理されます。
exit
(sic、かっこなし)がiPythonで使用された場合条件ステートメントのループまたは分岐での場合、何もしないので単に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>
カーネルは再起動しません。
print(i)
# 9
ただし、コマンドラインで使用した場合aloneの場合、これは一種の魔法として扱われる(%
なしで)であり、カーネルを終了します。
私の簡単なテストでは、
セル1
_a = 3
_
セル2exit
セル3print(a)
をもたらしました
_---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-1-3f786850e387> in <module>
----> 1 a
NameError: name 'a' is not defined
_
exit
は、ノートブックの実行に依存しているカーネルを強制終了するだけです。
ただし、興味深いことに、その動作を変更するために渡すことができるパラメーターがあるようです。
テスト2:セル1
_a = 3
_
セル2exit(keep_kernel=True)
セル3print(a)
は_3
_をもたらしました
編集:そして@ user2357112の答えが欠けている部分を埋めるように見えます.
EDIT2:実際には、それは _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).
_