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

Jonathan Fine jfine2358 at gmail.com
Thu Jul 19 08:30:33 EDT 2018


> 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.

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.)

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)

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