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 试图提供更有用的行为。显式打印你想打印的东西比显式抑制你不想打印的东西直观得多。
请注意,所有实验都是在 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 试图提供更有用的行为。显式打印你想打印的东西比显式抑制你不想打印的东西直观得多。