如何配置IPython以执行单元格块的方式与普通的Python REPL相同?

wim*_*wim 4 python ipython read-eval-print-loop

香草蟒蛇REPL:

>>> 'na'
'na'
>>> for i in range(4):
...     f'{_+_}'
... else:
...     'batman'
... 
'nana'
'nananana'
'nananananananana'
'nananananananananananananananana'
'batman'
>>> 
Run Code Online (Sandbox Code Playgroud)

使用相同解释器的IPython REPL:

>>> 'na'
'na'
>>> for i in range(4): 
...     f'{_+_}' 
... else: 
...     'batman' 
...
>>> _
'na'

Run Code Online (Sandbox Code Playgroud)

这种差异显然与IPython编译代码的模式有关,与显示钩子无关.是否可以将IPython配置为编译/执行单元格块,就像普通的Python REPL一样?我更喜欢IPython不会干扰或修改这样的底层运行时机制.

use*_*ica 6

通过magic命令将InteractiveShell.ast_node_interactivity设置设置为:'all'%config

%config InteractiveShell.ast_node_interactivity='all'
Run Code Online (Sandbox Code Playgroud)

或在你的 ipython_config.py

c.InteractiveShell.ast_node_interactivity = 'all'
Run Code Online (Sandbox Code Playgroud)

这将导致IPython在'single'模式下编译所有内容,触发的模式sys.displayhook,而不是'exec'模式,不使用sys.displayhook.


对于可能的设置InteractiveShell.ast_node_interactivity是目前

  • 'all':在'single'模式下编译所有内容.
  • 'last':在'single'模式下编译单元格的最后一个(简单或复合)语句.与以下'all'情况不同

    In [7]: for i in range(5):
       ...:     i
       ...: for i in range(3):
       ...:     i
       ...:     
    Out[7]: 0
    Out[7]: 1
    Out[7]: 2
    
    Run Code Online (Sandbox Code Playgroud)

    'all'会打印i两个循环的值.

  • ' last_expr':'single'如果该语句是表达式语句,则在模式下编译单元格的最后一个语句.这是IPython的默认值.

  • 'none':在'exec'模式下编译所有内容.

  • 'last_expr_or_assign':喜欢'last_expr',但是如果最后一个语句是赋值语句,则执行一些额外的AST转换来打印赋值:

    In [2]: xyz = "something else"
    Out[2]: "something else"
    
    Run Code Online (Sandbox Code Playgroud)

  • 请注意,在默认配置(OP显然未使用,但其他配置可能会使用)中,它将在所有回显行的前面加上“ Out [#]:”前缀,这会破坏效果。在那种情况下,通过添加配置文件设置`c.TerminalInteractiveShell.prompts_class ='IPython.terminal.prompts.ClassicPrompts',恢复到经典的Python提示符外观可能是一个好主意。 (2认同)