On 19/09/2017 17:30, Steve D'Aprano wrote:
On Tue, 19 Sep 2017 05:56 am, Roel Schroeven wrote:
I do prefer Python 3's print-as-a-function because "special cases aren't
special enough to break the rules", but I feel there's a case to be made
for Python 2's print-as-a-statement because "(although) practicality
beats purity" sometimes.
Nobody has successfully made the argument that print was *better* as a
statement, or given any convincing reason why print *should* be a statement.
(For example, del needs to be a statement, not a function, because it needs to
operate on *names* not the objects bound to the names.)
All they have managed to successfully argue is that they're used to print
without parens and can't unlearn the habit.
The one advantage of print statement is that you save a single character when
typing it. Be still my beating heart.
Compared to that, the disadvantages:
- it makes print a special thing that can't be treated as a first-class
value, it can't be passed to functions or used as a callback or bound
to a name;
- because it is special, beginners have to unlearn the practice of using
parens for calling functions, and stop writing print(x);
- it suffers a silent failure if you inadvertently parenthesise multiple
arguments: `print(x, y)` is *not* the same as `print x, y`;
- it has bizarre syntax that nobody would find normal if it wasn't for
long-experience; I mean, really, you end the argument list with a
comma to suppress printing newlines? who thought that was a good idea?
- it is difficult to control the print statement, since you can't
pass keyword arguments; it's one size fits all;
- which is why we ended up with that awful `print >>file, args` hack;
- it can't be mocked, shadowed, monkey-patched or replaced for testing;
- and you can't even write help(print) in the interactive interpreter
because its a syntax error.
Can't you get around all those with things like sys.stdout.write?
If so, what was the point of having a discrete print statement/function
at all?
--
bartc
--
https://mail.python.org/mailman/listinfo/python-list