在没有打印功能的情况下显示数据时,IPython和REPL的行为不同
请注意,所有实验都是在Python3.4.3和IPython 5.1.0(Python3)上进行的在没有打印功能的情况下显示数据时,IPython和REPL的行为不同,python,python-3.x,ipython,read-eval-print-loop,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]: 但是,在
考虑一个返回标识的函数:
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做了什么?我已经检查了字节码,在这两种情况下,它们都是相同的。因此,它与字节码生成无关,而是与在这两种情况下如何解释有关。关于它的工作原理,因此循环内的表达式语句不会触发sys.displayhook
。常规交互式解释器执行您在单一模式下输入的任何内容'single'
模式是表达式语句触发sys.displayhook
的模式
对于IPython为什么这样做,常规的Python行为与其说是有用的,不如说是恼人的。您很少希望在循环中自动打印表达式语句的值;更常见的情况是,它会偶然发生,并将您感兴趣的内容从屏幕上滚动下来
IPython试图提供更有用的行为。显式打印想要打印的内容比显式抑制不想要打印的内容直观得多。为什么在“它是如何工作的”或“为什么有人创造了这种差异”?常规的Python行为是一个坏主意,IPython试图提供更有用的交互行为。@user2357112我想回答第一个问题,但我想回答两个问题。IPython的行为是标准的行为。它只是把所有的东西都打印出来。但在REPL中,因为它是一个基本的交互式会话,所以它默认打印当前命令的“结果”(实际上不仅如此)。例如,如果您键入
a=5
,然后键入a
,它将输出5
。这在REPL中的行为使调试更容易。@Sraw我观察到的与您所说的相反……这非常有意义!它还解释了为什么在一个REPL上,dis.dis(compile(“for”in range(3):my_func(),“'exec'))
打印出合法的字节码,而在同一个REPL上,dis(“for”in range(3):my_func()”
会吐出垃圾-模式。@cᴏʟᴅsᴘᴇᴇᴅ: 嗯,不是真正的模式。更重要的是,您编译了字符串。如果在Python2上将字符串传递给dis.dis
,它将假定该字符串是字节码,而不是源代码。当你编译它时,你会得到一个代码对象,一个dis.dis
知道如何反汇编的类型。(在Python3上,dis.dis
知道如何反汇编源代码,部分原因是源代码是unicode,字节码现在是字节。)我甚至没有意识到REPL是在python2上运行的。先生,你是个天才,