Proposed new syntax

Gregory Ewing greg.ewing at canterbury.ac.nz
Tue Aug 15 18:59:31 EDT 2017


Steve D'Aprano wrote:
> I take issue with your statement that relying on order of evaluation is always 
> "a very bad idea".

Perhaps what I should say is that relying on side effects in
an expression occurring in a particular order is a bad idea.
Boolean operators are a well-understood special case that
doesn't extend to other expression elements. If you saw

    x = foo(y) + bar(z)

you wouldn't immediately assume it relied critically on
foo being called before bar -- would you?

> And especially now that print is a regular function instead of a
> statement, it is incredibly useful to stick a print or two in the middle of an
> expression for debugging.

That's fine as a temporary hack, but I would never use that
for something the program needs to do as part of its normal
operation.

>     # paraphrase, not an actual quote
>     "Comprehensions might actually have well-defined semantics in terms
>     of for-loops, just as they are documented to have, but we should
>     pretend that they don't because some really complicated expressions
>     with side-effects can be confusing or buggy."

That's pretty much it, except I would delete "really
complicated". Any reliance on side effects in an expression
is confusing and bug-prone, IMO.

The whole reason to write something as a comprehension is
because you want to express it declaratively. You're saying
"this is the list I want, I don't care how you compute it."

Likewise, the reader should be able to read it as "this is
the list produced, and you *don't have to care* how it
gets computed."

Introducing procedural elements such as "while" into a
comprehension messes that up, because suddenly the reader
*does* have to care about details of how it gets computed.

And those details can be tricky. We've already seen how a
subtle error can creep in when you get a "while" and an
"if" in the wrong order!

-- 
Greg



More information about the Python-list mailing list