<div dir="ltr">Am Freitag, 14. Oktober 2016 23:11:48 UTC-7 schrieb Nick Coghlan:<blockquote class="gmail_quote" style="margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><br>Regarding the spelling details, my current preferences are as follows:
<br>
<br>* None-coalescing operator: x ?or y
<br>* None-severing operator: x ?and y
<br>* None-coalescing augmented assignment: x ?= y
<br>* None-severing attribute access: x?.attr
<br>* None-severing subscript lookup: x?[expr]
<br> <br></blockquote><div><br>This is, more or less, the syntax added in Nick's <a href="https://www.python.org/dev/peps/pep-0531/">PEP 531 draft</a>. The <a href="https://www.reddit.com/r/Python/comments/59d2he/pep_531_existence_checking_operators/">reddit discussion</a> about it raised some pretty major concerns about clarity, and I have to admit, I think if you're learning Python as a first language, the ?and, ?else, x?.attr, etc syntax is likely to be very confusing. For me personally, combining a new operator "?" with existing keywords like "and" or "else" just does not make any intuitive sense. I definitely see the value, though, in particular of None-severing, especially as a tool to explicitly specify which attr can be missing -- ie, disambiguating which attribute is missing in a foo.bar.baz lookup (the alternative to which is nested try: except AttributeError: blocks, which gets very messy very quickly). I'm on board with the idea, and I can absolutely imagine using it in my code, but I disagree on the spelling.<br><br>A thought I had (perhaps <a href="https://www.reddit.com/r/Python/comments/59d2he/pep_531_existence_checking_operators/d98rnbu/">more readable in a reddit comment</a>) is to condense everything into a single "?" symbol, used for:<br><br>+ Coalescing binary operator: foo ? bar<br>+ Coalescing augmented assignment operator: foo ?= bar<br>+ Severing unary operator: ?foo<br><br><b>Pseudocode binary operator examples:</b><br><br><pre><code>>>> foo_exists ? bar_never_evaluated
foo_exists

>>> foo_missing ? foo_exists
foo_exists

>>> foo_missing ? bar_missing
foo_missing</code></pre><br><b>Pseudocode augmented examples:</b><br><br><pre><code>>>> foo_exists = 'foo'
>>> foo_exists ?= bar_never_evaluated
>>> foo_exists == 'foo'
True

>>> foo = Missing
>>> bar_exists = 'bar'
>>> foo ?= bar_exists
>>> foo == 'bar'
True

>>> foo = None
>>> bar_missing = Missing
>>> foo ?= bar_missing
>>> foo == None
True</code></pre><br><b>Pseudocode unary examples:</b><br><br><pre><code>>>> ?(foo_exists).bar.baz
foo_exists.bar.baz
>>> ?(foo_exists)[bar][baz]
foo_exists[bar][baz]

>>> ?(foo_missing).bar.baz
Missing
>>> ?(foo_missing)[bar][baz]
Missing

>>> ?(foo_exists).bar.baz_missing
Traceback...
AttributeError: <foo_exists.bar> object has no attribute 'baz_missing'
>>> ?(foo_exists)[bar][baz_missing]
Traceback...
KeyError: 'baz_missing'

>>> ?(foo_missing).bar.baz_missing
Missing
>>> ?(foo_missing)[bar][baz_missing]
Missing</code></pre><br>I personally think that's substantially more readable, but I suppose that's at least somewhat a matter of personal preference.<br></div></div>