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?
The interactive interpreter will print whatever is returned by the expression you type and execute, as a way to make testing and debugging convenient.
See Read–eval–print loop on Wikipedia for more information about this.
Most interactive shells use a REPL loop - read-eval-print.
They read your input. They evaluate it. And they print the result.
Non-function examples are (using the ipython shell):
It is a feature of the interactive shell. Yes, it is supposed to happen. The benefit is that it makes interactive development more convenient.
In Python's interactive mode, expressions that evaluate to some value have their
repr()
(representation) printed. This so you can do:Instead of having to do:
The exception is when an expression evaluates to
None
. This isn't printed.Your function call is an expression, and it evaluates to the return value of the function, which isn't
None
, so it is printed.Interestingly, this doesn't apply to just the last value evaluated! Any statement that consists of an expression that evaluates to some (non-
None
) value will print that value. Even in a loop:Different Python command lines can handle this in different ways; this is what the standard Python shell does.
First of all, its not
return
ning, and it's not related to functions. You just have an expression that evaluates to an object (big surprise! everything in Python is an object).In this case, an interpreter can choose what to display. The interpreter you're using apparently uses
__repr__
. If you'd use IPython, you'd see there's a whole protocol, depending on the frontend, determining what will be displayed.