[Python-Dev] PyObject_RichCompareBool identity shortcut

Robert Kern robert.kern at gmail.com
Thu Apr 28 17:52:02 CEST 2011


On 4/27/11 11:54 PM, Guido van Rossum wrote:
> On Wed, Apr 27, 2011 at 9:25 PM, Robert Kern<robert.kern at gmail.com>  wrote:
>> On 2011-04-27 23:01 , Guido van Rossum wrote:
>>> And I wouldn't want to change that. It sounds like NumPy wouldn't be
>>> much affected if we were to change this (which I'm not saying we
>>> would).
>>
>> Well, I didn't say that. If Python changed its behavior for (float('nan') ==
>> float('nan')), we'd have to seriously consider some changes.
>
> Ah, but I'm not proposing anything of the sort! float('nan') returns a
> new object each time and two NaNs that are not the same *object* will
> still follow the IEEE std. It's just when comparing a NaN-valued
> *object* to *itself* (i.e. the *same* object) that I would consider
> following the lead of Python's collections.

Ah, I see!

>> We do like to
>> keep *some* amount of correspondence with Python semantics. In particular,
>> we like our scalar types that match Python types to work as close to the
>> Python type as possible. We have the np.float64 type, which represents a C
>> double scalar and corresponds to a Python float. It is used when a single
>> item is indexed out of a float64 array. We even subclass from the Python
>> float type to help working with libraries that may not know about numpy:
>>
>> [~]
>> |5>  import numpy as np
>>
>> [~]
>> |6>  nan = np.array([1.0, 2.0, float('nan')])[2]
>>
>> [~]
>> |7>  nan == nan
>> False
>
> Yeah, this is where things might change, because it is the same
> *object* left and right.
>
>> [~]
>> |8>  type(nan)
>> numpy.float64
>>
>> [~]
>> |9>  type(nan).mro()
>> [numpy.float64,
>>   numpy.floating,
>>   numpy.inexact,
>>   numpy.number,
>>   numpy.generic,
>>   float,
>>   object]
>>
>>
>> If the Python float type changes behavior, we'd have to consider whether to
>> keep that for np.float64 or change it to match the usual C semantics used
>> elsewhere. So there *would* be a dilemma. Not necessarily the most
>> nerve-wracking one, but a dilemma nonetheless.
>
> Given what I just said, would it still be a dilemma? Maybe a smaller one?

Smaller, certainly. But now it's a trilemma. :-)

1. Have just np.float64 and np.complex128 scalars follow the Python float 
semantics since they subclass Python float and complex, respectively.
2. Have all np.float* and np.complex* scalars follow the Python float semantics.
3. Keep the current IEEE-754 semantics for all float scalar types.

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