
On Tue, Jul 24, 2018 at 8:22 AM, Thomas Jollans <tjol@tjol.eu> wrote:
On 18/07/18 19:43, Steve Dower wrote:
When a ``None``-aware operator is present, the left-to-right evaluation may be short-circuited. For example, ``await a?.b(c).d?[e]`` is evaluated::
_v = a if _v is not None: _v = _v.b _v = _v(c) _v = _v.d if _v is not None: _v = _v[e] await _v
## NB I only skimmed most of this thread after reading the PEP, so I ## ## apologize if this has been discussed before and I missed it. ##
I quite like the general idea, but I'm nervous about a rather fundamental aspect: This adds a special case in which you can't add parentheses to an expression involving a chain of operators to make precedence and evaluation order clear.
To use your example, a ?? 2 ** b ?? 3 === (a ?? 2) ** (b ?? 3) # fine
In the present day, a or 2 + 3 * c() === a or (2 + (3 * (c())))
a.b(c).d[e] === (((a.b)(c)).d)[e] # silly, but true.
Short-circuiting doesn't break this. With and and or, the expression that's short-circuited away is a self-contained expression in imagined (or actual) parentheses.
What about: 5 < x < 10 Can you add parentheses to that to "make precedence and evaluation order clear"? ChrisA