当显示没有打印功能的数据时,IPython和REPL的行为不同
问题内容:
请注意,所有实验均在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所做的事情吗?我已经检查了字节码,无论哪种情况,它们都是相同的。因此,它与字节码生成无关,而与这两种情况下的解释方式无关。
问题答案:
对于它的工作方式,IPython会以'exec'
模式而不是方式编译循环'single'
,因此sys.displayhook
不会为循环内的表达式语句触发。常规交互式解释器将执行您在'single'
模式下输入的所有内容。'single'
mode是表达式语句触发的模式sys.displayhook
。
对于为什么IPython这样做,常规的Python行为令人讨厌而不是有用。您很少想在循环中自动打印表达式语句的值。更频繁地,它会偶然发生,并在屏幕外滚动您感兴趣的内容。
IPython试图提供更多有用的行为。显式打印要打印的内容比显式抑制不希望打印的内容要直观得多。