【问题标题】:Why does typing a variable (or expression) print the value to stdout?为什么键入变量(或表达式)会将值打印到标准输出?
【发布时间】:2019-07-18 10:58:57
【问题描述】:

举个例子:

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

在没有显式打印语句的情况下,Python 如何以及为什么这样做?

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

In[1]: 5+10
       1

Out[1]: 1

为什么会这样?

【问题讨论】:

    标签: python ipython read-eval-print-loop python-interactive


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      看看引号。

      另见:

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

      repr 也是如此。

      【讨论】:

      • 对 IPython 行为有何评论?
      • 假设 CPython 在交互模式下是这样工作的。
      猜你喜欢
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 2013-05-01
      • 2016-07-27
      • 1970-01-01
      • 2018-07-02
      • 1970-01-01
      • 2011-11-25
      相关资源
      最近更新 更多