在没有打印功能的情况下显示数据时,ipython和repl的行为会有所不同



请注意,所有实验均已在Python3.4.3和Ipython 5.1.0上执行(对于Python3)。


考虑返回身份的函数:

def my_func(): 
    return 1

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

for _ in range(3): 
    my_func()

on,ipython,什么都没有显示。

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

,但是,在补充器上,某物是:

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

为什么有区别?

是因为Ipython做的事情吗?我已经检查了字节码,无论哪种情况,它们都是相同的。因此,它与字节码的生成无关,而与哪种情况下的解释方式无关。

对于它的工作方式,ipython以'exec'模式而不是'single'编译循环,因此sys.displayhook不会触发循环中的表达式语句。常规交互式解释器在'single'模式下执行您输入的任何内容。'single'模式是表达式语句触发sys.displayhook

的模式

为何ipython这样做,常规的python行为比有用更令人讨厌。您很少想在循环中自动打印表达语句的值;更频繁地,它会偶然发生并滚动您对屏幕上感兴趣的事情。

ipython试图提供更多有用的行为。明确打印要打印的东西要比明确抑制您不想打印的东西要直观得多。

最新更新