On 02.11.2016 17:17, Nick Coghlan wrote:
The gist is that rather than writing the bare:
target = expr1 ?? expr2 ?? expr3
You'd instead write None-coalescing as:
target = exists(expr1) ?? exists(expr2) ?? expr3
and None-propagating as:
target = missing(expr1) ?? missing(expr2) ?? expr3
with ?? being a protocol-driven short-circuiting binary operator controlled by the left operand rather than defining any particular semantics of its own.
I am sorry that I had to read this twice to get what you mean.
The "obj?." and "obj?" would then be shorthand for particular uses of "missing(obj) ?? ..." that avoid duplicate evaluation of the left operand (as well as bypassing the overhead of actually creating a "missing" instance).
That could work if we accept that ?. and ? is only about the left hand-side. However, as the ? visually applies also to the attribute/index access on the right, which means it could be a more readable way of doing
getattr(x, 'attr', None) or x if len(x) > 0 else None
Imagine you need to work with incomplete data and do some chaining with the new syntax. As soon as one single attribute isn't there, we hit an exception. The same for index.
If the ?. and ? are introduced, I think applying the "non-existence" property also the right hand make sense here as well for a wide range of applications.