[Python-ideas] PEP 505: None-aware operators: operators ?= and ?? and OR

David Foster davidfstr at gmail.com
Thu Aug 2 10:37:49 EDT 2018


RE none-aware operators in general:
+1 overall for the latest version of PEP 505 and the utility of ?? in 
particular. There are several places in my code that could be simplified 
with ??.

find-pep505.py on my current Django-oriented codebase gives:
	Total None-coalescing `if` blocks: 43
	Total [possible] None-coalescing `or`: 4
	Total None-coalescing ternaries: 8
	Total Safe navigation `and`: 0
	Total Safe navigation `if` blocks: 6
	Total Safe navigation ternaries: 17

RE OR and ||:
* -1 for "OR" as an operator. Insufficiently distinct from "or". Reads 
the same out loud despite being a different operator.
* -1 for "||" with none-aware semantics. This differs from the semantics 
in every C-derived language I can think of, which will be confusing to 
several other developers.

David Foster | Seattle, WA, USA

On 7/19/18 5:30 AM, Jonathan Fine wrote:
> Hi
> 
>> There is a formatted version of this PEP at
>> https://www.python.org/dev/peps/pep-0505/
> 
> I've taken a look at this, and have some comments on the first two
> examples drawn from standard library code. (And a very grateful +10
> for writing a script to find such examples.)
> 
> I've started a subthread, just to discuss the ?= and ?? operators. And
> something newish, that I call OR.
> 
> FIRST EXAMPLE
> The first example is
> ---
>  From bisect.py:
> def insort_right(a, x, lo=0, hi=None):
>      # ...
>      if hi is None:
>          hi = len(a)
> ---
> 
> Here, None is a sentinel value. The simpler code
> ---
>    hi = hi or len(a)
> ---
> fails when hi is zero (or any other value that is False in the boolean context).
> 
> This can be fixed by introducing a new operator OR which is similar to
> 'or' but has the semantics this example requires. Thus, given OR we
> can write
> ---
>    hi = hi OR len(a)
> ---
> where (A OR B) returns A if A is not None, otherwise it returns B.
> 
> (Recall that (A or B) returns A if bool(A), otherwise it returns B.)
> 
> SECOND EXAMPLE
> The second example is
> ---
>  From calendar.py:
> encoding = options.encoding
> if encoding is None:
>      encoding = sys.getdefaultencoding()
> optdict = dict(encoding=encoding, css=options.css)
> ---
> 
> Once we have OR we would write this as
> ---
> encoding = encoding OR sys.getdefaultencoding()
> optdict = dict(encoding=encoding, css=options.css)
> ---
> 
> And from here we can condense into a single (longish) line:
> ---
> optdict = dict(encoding=encoding OR sys.getdefaultencoding(), css=options.css)
> --
> 
> SUMMARY
> Here, for reference, are the suggestions using ?= and ?? in PEP 505.
> ---
> hi ??= len(a)
> ---
> optdict = dict(encoding=encoding ?? sys.getdefaultencoding(), css=options.css)
> ---
> 
> Comments ?? suggestions. For example, would a None-aware AND operator be useful?
> 


More information about the Python-ideas mailing list