17

举个例子:

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

Python 如何以及为什么在没有明确的 print 语句的情况下做到这一点?

如果我在IPython单元格中做同样的事情,只有最后一个这样的值实际上以这种方式打印在标准输出上:

In[1]: 5+10
       1

Out[1]: 1

为什么会这样?

4

2 回答 2

35

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

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

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

您可以修改此行为:

>>> 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 repl 中,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 之间的行为不同的原因。

于 2019-02-25T04:33:58.693 回答
2

这就是所有口译员的工作方式。他们不需要任何print,而是一件事,没有print他们做repr所有事情,并且print不需要,例如:

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

看看引号。

另请参阅:

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

repr做同样的事情。

于 2019-02-25T04:21:50.770 回答