Search code examples
pythonipythonread-eval-print-looppython-interactive

Why does typing a variable (or expression) print the value to stdout?


Take this example:

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

How and why does Python do this without an explicit print statement?

If I do the same thing in an IPython cell, only the last such value is actually printed on stdout in this way:

In[1]: 5+10
       1

Out[1]: 1

Why does this happen?


Solution

  • When Python is in "interactive" mode, it enables certain behaviors it doesn't have in non-interactive mode. For example, sys.displayhook, originally specified in PEP 217.

    If value is not None, this function prints it to sys.stdout, and saves it in __builtin__._.

    sys.displayhook is called on the result of evaluating an expression entered in an interactive Python session.

    You can modify this behavior:

    >>> 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?
    

    And also set it back to normal:

    >>> sys.displayhook = sys.__displayhook__
    >>> 3
    3
    

    In the default Python repl, sys.displayhook is

    >>> import sys;
    >>> sys.displayhook
    <built-in function displayhook>
    

    but in IPython it's

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

    So that's why you see different behavior between Python and IPython.