在没有打印功能

时间:2017-09-04 00:58:05

标签: python python-3.x ipython read-eval-print-loop

请注意,所有实验都是在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的事情吗?我检查了字节码,在任何一种情况下,它们都是相同的。因此,它与字节码生成无关,而是与两种情况下的解释方式无关。

1 个答案:

答案 0 :(得分:4)

关于它是如何工作的,IPython compiles loops in 'exec' mode instead of 'single',因此不会为循环内的表达式语句触发sys.displayhook。常规交互式解释器执行您在'single'模式下输入的任何内容。 'single'模式是表达式语句触发sys.displayhook的模式。

为什么IPython这样做,常规Python行为比使用更烦人。您很少想在循环中自动打印表达式语句的值;更频繁地,它会偶然发生,并在屏幕上滚动您感兴趣的内容。

IPython尝试提供更多有用的行为。明确打印您想要打印的内容比明确禁止您不想要打印的内容更直观。