请注意,所有实验都是在Python3.4.3和IPython 5.1.0(对于python3)上进行的。
考虑一个返回身份的函数:
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的事情吗?我检查了字节码,在任何一种情况下,它们都是相同的。因此,它与字节码生成无关,而是与两种情况下的解释方式无关。
答案 0 :(得分:4)
关于它是如何工作的,IPython compiles loops in 'exec'
mode instead of 'single'
,因此不会为循环内的表达式语句触发sys.displayhook
。常规交互式解释器执行您在'single'
模式下输入的任何内容。 'single'
模式是表达式语句触发sys.displayhook
的模式。
为什么IPython这样做,常规Python行为比使用更烦人。您很少想在循环中自动打印表达式语句的值;更频繁地,它会偶然发生,并在屏幕上滚动您感兴趣的内容。
IPython尝试提供更多有用的行为。明确打印您想要打印的内容比明确禁止您不想要打印的内容更直观。