为什么在键入变量(或表达式)时会将其值打印到标准输出?

18

以这个例子为例:

>>> 5+10
15
>>> a = 5 + 10
>>> a
15

Python如何以及为什么可以在没有显式的print语句的情况下完成这个操作?

如果我在IPython单元格中执行相同的操作,只有最后一个值会以这种方式实际打印在标准输出(stdout)中:

In[1]: 5+10
       1

Out[1]: 1
为什么会发生这种情况?
2个回答

35

当Python处于“交互”模式时,它会启用一些在非交互模式下没有的行为。例如,在PEP 217中最初指定的 sys.displayhook

如果值不是None,则此函数将其打印到sys.stdout,并保存在__builtin__._中。

sys.displayhook会在交互Python会话中输入表达式的结果上调用。

您可以修改此行为:

>>> import sys
>>> def shook(expr):
...   print(f'can haz {expr}?')
...
>>> sys.displayhook = shook
>>> 123
can haz 123?
>>> False
can haz False?
>>> None
can haz None?

并将其恢复为正常状态:

>>> sys.displayhook = sys.__displayhook__
>>> 3
3
在默认的Python交互式环境中,sys.displayhook是什么。
>>> import sys;
>>> sys.displayhook
<built-in function displayhook>

但在IPython中,它是这样的

In [1]: import sys

In [2]: sys.displayhook
Out[2]: <IPython.terminal.prompts.RichPromptDisplayHook at 0x7f630717fa58>

所以这就是为什么你会看到Python和IPython之间的不同行为。


2
这就是所有解释器的工作方式。它们不需要任何print,只需要一件事情,没有print,它们会对所有内容进行repr,而print则不会,例如: "最初的回答"。
>>> 'blah'
'blah'
>>> print('blah')
blah
>>> 

看引用。

另请参阅:

>>> print(repr('blah'))
'blah'
>>> 

repr 执行相同的操作。


1
对于IPython的行为有任何评论吗? - Chayan Ghosh
2
假设CPython在交互模式下的工作方式如下。 - Klaus D.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接