Search code examples
pythonreturnstdoutpython-idle

Why does returning in Interactive Python print to sys.stdout?


I ran into something different today. Consider this simple function:

def hi():
    return 'hi'

If I call it in a Python shell,

>>> hi()
'hi'
>>> print hi()
hi

It prints out the 'returned' value, even if it's just the repr. This felt odd to me, how could returning be printing to stdout? So I changed it to a script to be run:

def hi():
    return 'hi'
hi()

I ran this from terminal:

Last login: Mon Jun  1 23:21:25 on ttys000
imac:~ zinedine$ cd documents
imac:documents zinedine$ python hello.py
imac:documents zinedine$ 

Seemingly, there's no output. Then, I started thinking this is an Idle thing, so I tried this:

Last login: Tue Jun  2 13:07:19 on ttys000
imac:~ zinedine$ cd documents
imac:documents zinedine$ idle -r hello.py

And here is what shows in Idle:

Python 2.7.6 (v2.7.6:3a1db0d2747e, Nov 10 2013, 00:42:54) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "copyright", "credits" or "license()" for more information.
>>> 
>>> 

So returning prints only in an interactive python shell. Is this a feature? Is this supposed to happen? What are the benefits of this?


Solution

  • The interactive interpreter will print whatever is returned by the expression you type and execute, as a way to make testing and debugging convenient.

    >>> 5
    5
    >>> 42
    42
    >>> 'hello'
    'hello'
    >>> (lambda : 'hello')()
    'hello'
    >>> def f():
    ...     print 'this is printed'
    ...     return 'this is returned, and printed by the interpreter'
    ...
    >>> f()
    this is printed
    'this is returned, and printed by the interpreter'
    >>> None
    >>>
    

    See Read–eval–print loop on Wikipedia for more information about this.