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