[Python-ideas] PEP 505: None-aware operators
Steven D'Aprano
steve at pearwood.info
Mon Jul 23 12:52:56 EDT 2018
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
More information about the Python-ideas
mailing list