如何配置IPython以执行单元格块,就像普通的Python REPL一样?

发布于 2021-01-29 16:42:38

香草Python REPL:

>>> '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'

这种差异显然与IPython编译代码的方式有关,与显示挂钩无关。是否可以像普通的Python
REPL一样配置IPython来编译/执行单元块?我希望IPython不会干扰或修改此类基础运行时机制。

关注者
0
被浏览
40
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    %config InteractiveShell.ast_node_interactivity='all'
    

    或在你的 ipython_config.py

    c.InteractiveShell.ast_node_interactivity = 'all'
    

    这将导致IPython在'single'mode(可触发sys.displayhook'exec'模式)而不是不使用mode的模式下编译所有内容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”



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看