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

How to configure IPython to execute cell blocks the same way as a plain Python REPL does?

原版 Python 回复:

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

IPython 具有相同解释器的 REPL:

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

这个差异是, and unrelated to the display hook。是否可以像普通 Python REPL 那样将 IPython 配置为 compile/exec 单元块?我希望 IPython 不会干扰或修改此类底层运行时机制。

通过 %config 魔术命令将 InteractiveShell.ast_node_interactivity 设置为 'all'

%config InteractiveShell.ast_node_interactivity='all'

或在您的 ipython_config.py

c.InteractiveShell.ast_node_interactivity = 'all'

这将导致 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
    

    'all' 会从两个循环中打印出 i 的值。

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

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

  • 'last_expr_or_assign':类似于'last_expr',但如果最后一条语句是赋值语句,则执行一些额外的 AST 转换以打印赋值的值:

    In [2]: xyz = "something else"
    Out[2]: "something else"