<div dir="ltr"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small"><br></div><br><div class="gmail_quote"><div dir="ltr">On Mon, Jul 23, 2018 at 6:52 AM Steve Dower <<a href="mailto:steve.dower@python.org">steve.dower@python.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Responding to a few more ideas that have come up here. <br></blockquote><div><br></div><div><br></div><div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">​Thank you for the clarifications.​</div><br></div><div><span style="font-family:arial,helvetica,sans-serif">​</span><font face="arial, helvetica, sans-serif">I'm trying to wrap my head around the various facets of None aware</font><br></div><div><div class="gmail_default"><font face="arial, helvetica, sans-serif">operators proposal after reading the whole discussion - as well as having</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">read the PEP a few times.  Below is a</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">summary of what I gathered from the discussion, with a few added other</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">points that I have not seen addressed.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">1. It is an operator present in other languages (e.g. C#, Dart), that uses the same notation</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">a) This demonstrates that such an operator has been found to be useful and is</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">definitely worth considering.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">b) The fact that it uses the same notation is a plus for people that know</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">these other languages but it does not mean that the notation is necessarily</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">the best choice for Python. To wit, Python does not use the combination of ? and</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">: for ternary operator; instead it reuses existing keywords.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">c) Some people use languages (e.g. Ruby) that allow ? to be part of an identifier,</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">which means that one could, in principle, write something like</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">a = b?.c</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">in Ruby with a completely different meaning than what it would mean in C# or Dart,</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">or as proposed for Python.</font><span style="font-family:arial,helvetica,sans-serif">Thus, I don't think that that language X uses this operator written this way is,</span></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">**on its own**, a valid justification for using the exact same syntax for Python.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">d) Dart is given as an example. Reading from the link mentioned in the PEP,</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">I was lead to <a href="https://www.dartlang.org/guides/language/language-tour#classes">https://www.dartlang.org/guides/language/language-tour#classes</a></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">where the only mention of ?. was the following:</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">===</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">// If p is non-null, set its y value to 4.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">p?.y = 4;</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">===</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">However, PEP 505 mentions that something like the above would raise a SyntaxError.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Given that Dart's operator has a different semantics than that proposed for Python,</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">I do not think that mentioning Dart in this context without any qualifier </font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">is a valid supportive justification for this proposal.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">2. On the specific choices of ??, ??=, ?., ?[]</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">a) Trying to find what Csharp ?? means by doing a quick internet search is not exactly</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">productive.  By comparison, if one were to use a new keyword (say ifnone instead</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">of ??) or keywords, it would make it easier to find their meaning. The problem with new</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">keywords is that they may introduce some backwards incompatibility.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">b) Admitedly, there are very few remaining symbols in Python that can be</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">used for defining new operators. Introducing operators using ? does not</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">cause problems with existing code.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">c) While using a new keyword for ?? and ??= might work, it is less clear,</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">at least to me, how this could extend to ?. and ?[]</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">d) ? and ?? are already used by IPython with a totally different meaning.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">I almost never use IPython I have no idea what problems this might cause</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">for IPython users.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">3. On some examples given</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">PEP 505 gives these examples from Request:</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">data = [] if data is None else data</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">files = [] if files is None else files</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">headers = {} if headers is None else headers</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">params = {} if params is None else params</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">hooks = {} if hooks is None else hooks</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">It then argues that this is undesirable and that it could have been written instead</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">as </font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">data = data if data is not None else []</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">files = files if files is not None else []</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">headers = headers if headers is not None else {}</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">params = params if params is not None else {}</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">hooks = hooks if hooks is not None else {}</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">which, as written in PEP 505, is deemed to be "more intuitive" - but longer.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Having looked at the code in the Request module, I would argue that it could have been written instead as</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">if data is None: data = []</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">if files is None: files = []</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">if headers is None: headers = {}</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">if params is None: params = {}</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">if hooks is None: hooks = {}</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">which gives the same result and is shorter than the original - but admittedly longer than</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">the proposed notation. I do not think that this specific example as currently written</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">in PEP 505 gives a fair picture of what is currently possible with Python.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">4) On comparisons with other "domain specific operators", like @ and </font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">the bitwise operators.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">I do not remember the exact words that were used in the discussions, but</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">I seem to recall people saying that operators like ??, ?., etc. are no</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">more "mysterious" than @ or the bitwise operators might be: users should</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">not be surprised to have to learn new operators.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Anyone that does numerical work knows that matrix multiplications do not</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">obey the same rules as multiplications of numbers. If you don't do numerical</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">work, you are almost certain not to encounter @ as an operator (but only</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">as a symbol for decorator), so there won't be any mystery to solve.  </font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">A similar situation exists for bitwise operators.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Having dedicated operators to represent special methods on these types of</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">objects makes the code easier to read for people working in these fields.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">I also note that these operators have corresponding dunder methods.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">By contrast, code like</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">if a is None:</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">   a = []</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">can occur in pretty much any type of program and is, arguably, already very readable.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Saying that it could/should be written instead as</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">a ??= []</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">where ??= would be an operator without corresponding dunder method is not the </font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">same. Unless I am mistaken, it would be the first time that operators</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">are introduced in Python without having corresponding dunder methods.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">If I am correct in this, I believe that the PEP should at the very least</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">address this situation and provide an explanation as to why new operators</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">should be introduced that break this non-written rule in Python.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">= = =</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">**Personal biases**: I do admit that I prefer code written in indented blocks</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">to show the logic, over trying to cram everything in as few lines as</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">possible.  (The only exception to this is for list comprehensions,</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">but this might be because I am very familiar with mathematical notation</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">used for sets.)</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Thus, I would likely always prefer to write</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">    if a is None:</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">        a = []</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">over</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">    if a is None: a = []</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">but I do admit that, after the initial shock, I do find</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">    a ??= []</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">to be fairly readable.  One thing I do find helpful is that it is </font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">possible (and desirable) to have spaces around the operator.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Still, if such an operator was introduced, I would prefer a new</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">keyword over the proposed symbols, to be consistent with choices made</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">when the ternary operator construct was introduced.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">However, even after reading it over many times, I do find code using</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">?. and ?[] to be much harder to read then using the current notation.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Python is often described as executable pseudo-code, which I consider</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">one of its strengths, and I find these proposed operators to look like</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">anything but executable pseudo-code.</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif"><br></font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">Unlike the recently approved new operator, :=, whose meaning can be</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">at least guessed based on the presence of "=", there is nothing</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">intuitive about the choices of operators built from ?. The fact that</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">they would not be easily found by doing an internet search (other</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">than specifically looking for "python operators") compared with a search</font></div><div class="gmail_default"><font face="arial, helvetica, sans-serif">for keywords based operators (e.g. "python ifnone") is not desirable imo.</font><span style="font-family:arial,helvetica,sans-serif;font-size:small">​</span></div><br></div><div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif;font-size:small">​André Roberge​</div><br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
_______________________________________________<br>
Python-ideas mailing list<br>
<a href="mailto:Python-ideas@python.org" target="_blank">Python-ideas@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-ideas" rel="noreferrer" target="_blank">https://mail.python.org/mailman/listinfo/python-ideas</a><br>
Code of Conduct: <a href="http://python.org/psf/codeofconduct/" rel="noreferrer" target="_blank">http://python.org/psf/codeofconduct/</a><br>
</blockquote></div></div>