请注意,所有实验均已在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试图提供更多有用的行为。明确打印要打印的东西要比明确抑制您不想打印的东西要直观得多。