[Python-Dev] python 3 niggle: None < 1 raises TypeError

Robert Kern robert.kern at gmail.com
Tue Feb 18 15:29:10 CET 2014


On 2014-02-18 14:11, MRAB wrote:
> On 2014-02-18 13:48, Serhiy Storchaka wrote:
>> 18.02.14 10:10, Paul Moore написав(ла):
>>> Or alternatively, a "default on None" function - Oracle SQL calls this
>>> nvl, so I will too:
>>>
>>> def nvl(x, dflt):
>>>      return dflt if x is None else x
>>>
>>> results = sorted(invoices, key=lambda x: nvl(x.duedate, datetime(MINYEAR,1,1))
>>
>> Or, as was proposed above:
>>
>> results = sorted(invoices,
>>                    key=lambda x: (x.duedate is not None, x.duedate))
>>
> That makes me wonder.
>
> Why is:
>
>      None < None
>
> unorderable and not False but:
>
>       (None, ) < (None, )
>
> orderable?

tuple's rich comparison uses PyObject_RichCompareBool(x, y, Py_EQ) to find the 
first pair of items that is unequal. Then it will test the order of any 
remaining elements.

   http://hg.python.org/cpython/file/79e5bb0d9b8e/Objects/tupleobject.c#l591

PyObject_RichCompareBool(x, y, Py_EQ) treats identical objects as equal.

   http://hg.python.org/cpython/file/79e5bb0d9b8e/Objects/object.c#l716

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco



More information about the Python-Dev mailing list