On Wed, 20 Sep 2017 02:55 pm, Pavol Lisy wrote:

> On 9/19/17, Steve D'Aprano <steve+pyt...@pearwood.info> wrote:
> 
> [...]
> 
>> The point is, we all make the occasional silly error. Doesn't mean we should
>> cripple our functions and fill the language with special cases like the
>> print
>> statement to avoid such rare errors. If print had always been a function,
>> and
>> someone suggested making it a statement, who would be willing to accept all
>> those disadvantages for the sake of saving one character?
> 
> I am not going to support print as a statement in this discussion!
> 
> But what you are describing is some kind of alternative history which
> did not happen.

Right. The philosophical term is "counterfactual", the more common term
is "hypothetical situation".

https://en.wikipedia.org/wiki/Counterfactual_conditional

It is sometimes called the historical subjunctive, after the subjunctive
grammatical tense:

https://www.goodreads.com/quotes/606824-it-s-subjunctive-history-you-know-the-subjunctive-the-mood-used

See also:

https://en.wikipedia.org/wiki/Subjunctive_possibility


> Question was not about crippling function to statement. (Which function?)
> 
> What I mean is that if we like to convince people that it was good
> decision then we need to use proper arguments.

The hypothetical question is a good argument. We want Python to be the language
it could possible be. Which would give us a better language?

1. Start with print statement, and change to print function. (This is what
really happened.)

2. Start with a print function, and change to a print statement. (This is a
hypothetical situation.)

I think that number 1 is *much better* than two.

Now consider that we already live in world number 1. print is now a function. To
anyone who argues that print was better as a statement, would you like to live
in world 2? Its not too late. We could say that the change in 1 was a terrible
mistake, and revert it, and then number 2 will be the actual world.

To make that come true, all you need do is make a strong enough argument for why
the print statement is *so much better* than the function that it is worth the
disruption of changing the language again.

But I'd be satisfied with any reason at all with the statement was better, apart
from:

(a) "you save one character (two keystrokes)"; and

(b) "that's what I was used to".


 
> For example some others which seems like not so proper to me:
> 
> 1. "learn-unlearn" argument could be viewed differently from opposite
> camp (they need to unlearn statement)

Beginners and novices don't have to unlearn the print statement, because they
haven't learned it yet.

A beginner to Python hasn't learned anything yet. They start to learn the
language, and discover that `len` needs parentheses. `int` needs parens. `str`
needs parens. `math.sqrt` needs parens. `chr` needs parens. `open` needs
parens. `str.find` needs parens. Dozens upon dozens, hundreds, even thousands
of functions and methods all need parens.

Except for `print`, which looks like a function but isn't.

So for `print`, they need to unlearn the rule "always use parentheses when
calling a function" and replace it with "except for print", or "but print is
not a function, so the rule doesn't apply". Either way, print is an exception
that has to be unlearned from the general rule.

I agree, once you have learned that print is special, then moving to Python 3
means you have to unlearn that print is special. Its not special any more in
Python 3.


> 2. "print foo" save more than one character ("print foo ," more than
> two characters)

Count the characters more closely:

print foo  # nine characters, including the space
print(foo)  # ten characters, including the parentheses

The difference between ten and nine is one, as I said.


Suppressing the newline at the end is a little shorter:

print foo,  #  ten characters
print(foo, end='')  # eighteen characters

but the loss of brevity is more than made up for by the gain in self-documenting
code.

Changing the separator between items is a big win for the print function:

print ', '.join(str(obj) for obj in (foo, bar, baz))  # 52 chars
# and builds up a potentially large string ahead of time

print(foo, bar, baz, sep=', ')  # 30 chars 
# and DOESN'T build up a large string ahead of time
# and is self-explanatory



> 3. "for sake of saving one character"? Could we really simplify
> motivation of opposite side to just this? (what about breaking old
> code?)

I don't know what the motivation of the "print should be a statement!" side is,
because they never say why it was better. (If they have said, I have never seen
it.) All they do is say "it was a terrible mistake to change, print was better
as a statement".

I *completely agree* that there was some pain in breaking backwards
compatibility. That's why Guido waited so many years before fixing his mistake
in making print a statement.

"print is a statement" was in Guido's list of regrets all the way back in 2002:

http://legacy.python.org/doc/essays/ppt/regrets/PythonRegrets.pdf

and it wasn't fixed until Python 3. He explains some of his reasons why here:

https://mail.python.org/pipermail/python-dev/2005-September/056154.html

Guido is not the only one who found that print was too limiting and best
avoided:

https://mail.python.org/pipermail/python-dev/2005-September/056164.html


I admit I haven't read ALL the posts discussing the question of print:

https://mail.python.org/pipermail/python-dev/2005-September/thread.html

but I'm still looking for a good argument beyond "don't want to type parens"
and "we've always done it that way" for keeping print a statement. The closest
I came to was Fredrik Lundh's post:

https://mail.python.org/pipermail/python-dev/2005-September/056247.html

The only problem with his arguments for keeping print a statement is that they
apply equally to print as a function!

Fredrik: A reserved word makes it easy to grep for.

You can grep for "print(" just as easily as "print".

Fredrik: It does the right thing under the hood: converts things to their
string representation, calls write repeatedly instead of allocating
a buffer large enough to hold all components, doesn't print un-
necessary trailing spaces, etc.

So does the print function.

Fredrik: Using a statement syntax makes it possible to use a readable
syntax for redirection (and other possible extensions); it's obvious
that this isn't printing to stdout:

    print >>file, bacon(ham), spam, "=", eggs(number=count)

I suppose that Unix system admins might be used to > used for file re-direction,
but that's one of the most hated features of print statement, and its hardly
something that is easy to guess for people who haven't learned it.

print(args, file=sys.stderr) is surely more self-explanatory than 

print >>sys.stderr, args

even if it takes a couple of extra characters.


Fredrik: It can print to anything that implements a "write" method.

And so can the print function.


So out for Fredrik's four arguments in favour of print statement, one is a
matter of opinion (he likes >>file, most people hate it) and the other three
hold equally for print as a function.


> BTW if python would only bring "from __cleverness__ import
> print_function" how many people would accept your reasons and use it?

Many people use "from __future__ import print_function".

Are you aware that Python 3 exists? print is already a function, and Python 2.7
supports it as a future import.


> And how many would rewrite old code?

*shrug*

Some people will upgrade old code to new versions of Python. Some people won't.
It depends on the program, whether it is worth upgrading or not.

But what I want to see are reasons why print as a statement was better. Not
just "that's what I'm used to".



-- 
Steve
“Cheer up,” they said, “things could be worse.” So I cheered up, and sure
enough, things got worse.

-- 
https://mail.python.org/mailman/listinfo/python-list

Reply via email to