web-dev-qa-db-ja.com

Jupyter Notebookを使用するPython3で「exit」キーワードは何をしますか?

私は現在Jupyter NotebookでPython3を使用していて、キーワードexitに遭遇しました。このキーワードは何をしますか?

with open("some_file.txt") as f:
    for lines in f:
        print(lines)
        exit
9
Backrub32

ループの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では、exitquitIPyAutocallのサブクラスである _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()...」メッセージを出力します。また、通常のインタラクティブモードでは、式の自動印刷が処理されます。

exitsic、かっこなし)が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の場合、これは一種の魔法として扱われる%なしで)であり、カーネルを終了します。

4
DYZ

私の簡単なテストでは、
セル1
_a = 3_
セル2
exit
セル3
print(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_
セル2
exit(keep_kernel=True)
セル3
print(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).
_
3
Paritosh Singh