On Mon, Jul 23, 2018 at 02:04:17PM +0200, Giampaolo Rodola' wrote: [I wrote this]
This is the point I was making earlier: you accept existing punctuation doing these things:
try: obj.spam.egsg.tomato.cheese # oops a typo except AttributeError: # evaluation can stop at any time ...
while demanding a higher standard for new punctuation.
All of your criticisms of ? punctuation applies to . as well.
[Giampaolo]
I don't think they do. For once, "a.b" does one and one thing only,
Attribute lookup is a bit more complex than just "one thing only", but okay, I'll accept that for a sufficiently complex "thing", dot access does one thing.
"a?.b" does two and that's a fundamental difference (explicitness).
How is "two things" less explicit than "one thing"? Comments like the above is why I think that "explicit" and "implicit" are used to mean "I like it" and "I don't like it" rather than being objective arguments, or indeed having anything to do with explicitness or implicitness. If this PEP is approved, then *by definition* the ?? operator will mean return the first operand if it isn't None otherwise evaluate and return the second making it just as explicit as: + # add or concatenate the two operands == # return True if the two operands are equal otherwise False sorted(x) # make a list copy of x and sort it etc. Just because the spelling is short doesn't make it implicit.
It does so by introducing a brand new operator ("?") which can be spelled in two forms ("a?.b" and "a?[b]") by using two adjacent symbols not interrupted by any space, which is an absolute first in the Python syntax
It isn't a first. Many existing operators use two adjacent symbols not interrupted by a space: e.g. == <= >= != ** // << >> += -= *= etc.
and that's the second and fundamental difference. I cannot move the same criticism to the "a.b" form: it's simpler, it does one thing and it uses one symbol.
You criticised ?. because it can interupt left-to-right execution: a?.b?.c?.d True. But so can a single dot: a.b.c.d is no more guaranteed to execute all the way to the right. Likewise the logical operators "or" and "and" are designed to short-circuit. If ?? and friends are a mistake because they short-circuit, why aren't "or" and "and" mistakes? I'm not asking this as a rhetorical question. If you think there is a reason why it is okay for or/and to short-circuit, but it is bad for ?? and friends to short-circuit, then please explain why they are different. I will be very happy to listen to your arguments.
Multiple "?" can live on the same line so that's incentive to write one-liners, really, and to me one-liners are always less explicit than the same logic split on multiple lines.
Explicit is not always better.
import this
is much better than:
for location in sys.path: try: for file in os.listdir(location): if os.splitext(file) in ('.pyc', '.py', '.so'): ...
I honestly don't see how this example is related with anything discussed so far.
You keep saying that the proposed ?? etc operators aren't explicit and you criticise them for doing "two things". The import statement does at least ten things: - searches the cache of modules; - if not found, traverse the search path looking for not one kind of file, but multiple kinds of files that the user has no control over; - if a matching file is found, check for a pre-compiled version; - or compile it; - save the compiled byte-code in a new file; - load the compiled byte-code into a module object; - execute that code; - add the module object to the cache; - create a new name in the local namespace; - bind the module object to the name. If doing "two things" is bad, then doing "ten things" is five times worse. If ?? is too implicit, then what is importing? Why is it okay for importing to be "implicit" but ?? needs to be written out over two lines? If behaviour that is acceptable, even desirable in existing features is harmful in these new ? operators, then please tell us how and why. -- Steve