IPython 和 REPL 在没有打印功能的情况下显示数据时表现不同

IPython and REPL behave differently when displaying data without the print function

请注意,所有实验都是在 Python3.4.3 和 IPython 5.1.0(python3)上进行的。


考虑一个 returns 恒等式的函数:

def my_func(): 
    return 1

现在,从 REPL 会话中的循环调用此函数。

for _ in range(3): 
    my_func()

打开,IPython,没有任何显示。

In [96]: for _ in range(3): 
    ...:     my_func()
    ...:     

In [97]: 

但是,在 REPL 上,有些东西是:

>>> for _ in range(3): 
...     my_func()
... 
1
1
1
>>>

为什么会有差异?

难道是因为IPython的事情吗?我检查了字节码,无论哪种情况,它们都是相同的。因此,它与字节码生成无关,而是与它在任何一种情况下的解释方式有关。

对于它的工作原理,IPython compiles loops in 'exec' mode instead of 'single',因此对于循环内的表达式语句不会触发 sys.displayhook。常规交互式解释器执行您在 'single' 模式下输入的任何内容。 'single' 模式是表达式语句触发 sys.displayhook.

的模式

为什么 IPython 这样做,常规的 Python 行为与其说有用不如说烦人。您很少希望在循环中自动打印表达式语句的值;更频繁的是,它会偶然发生并将您感兴趣的内容滚动到屏幕外。

IPython 试图提供更有用的行为。显式打印你想打印的东西比显式抑制你不想打印的东西直观得多。