[Python-ideas] checking for identity before comparing built-in objects

Joshua Landau joshua.landau.ws at gmail.com
Wed Oct 10 23:33:45 CEST 2012


On 10 October 2012 02:14, Steven D'Aprano <steve at pearwood.info> wrote:

> On 10/10/12 09:13, Joshua Landau wrote:
>
>> Just a curiosity here (as I can guess of plausible reasons myself, so
>> there
>> probably are some official stances).
>>
>> Is there a reason NaNs are not instances of NaN class?
>>
>
> Because that would complicate Python's using floats for absolutely no
> benefit.
> Instead of float operations always returning a float, they would have to
> return
> a float or a NAN. To check for a valid floating point instance, instead of
> saying:
>
> isinstance(x, float)
>
> you would have to say:
>
> isinstance(x, (float, NAN))
>

Not the way I'm proposing it.

>>> class NAN(float):
> ...     def __new__(self):
> ...             return float.__new__(self, "nan")
> ...     def __eq__(self, other):
> ...             return other is self
> ...
> >>> isinstance(NAN(), float)
> True
> >>> NAN() is NAN()
> False
> >>> NAN() == NAN()
> False
> >>> x = NAN()
> >>> x is x
> True
> >>> x == x
> True
> >>> x
> nan




> And what about infinities, denorm numbers, and negative zero? Do they get
> dedicated classes too?
>

Infinities? No, although they might well if the infinities were different
(set of reals vs set of ints, for example).
Denorms? No, that's a completely different thing.
-0.0? No, that's a completely different thing.

I was asking, because instances of a class maps on to a behavior that
matches *almost exactly* what *both* parties want, why was it not used?
This is not the case with anything other than that.

And what is the point of this added complexity? Nothing.
>

Simplicity. It's simpler.


> You *still* have the rule that "x == x for all x, except for NANs".


False. I was proposing that x == x but NAN() != NAN().


> The only difference is that "NANs" now means "instances of NAN class"
> rather than
> "NAN floats" (and Decimals).


False, if you subclass float.


> Working with IEEE 754 floats is now far more of
> a nuisance because some valid floating point values aren't floats but have
> a
> different class, but nothing meaningful is different.



 Then x == x would be True (as they want), but [this NaN] == [that NaN]
>> would be False, as expected.
>>
>
> Making NANs their own class wouldn't give you that. If we wanted that
> behaviour, we could have it without introducing a NAN class: just change
> the
> list __eq__ method to scan the list for a NAN using math.isnan before
> checking
> whether the lists were identical.
>

False.

>>> x == x
> True
> >>> [NAN()] == [NAN()]
> False


as per my previous "implementation".


> But that would defeat the purpose of the identity check (an optimization to
> avoid scanning the list)! Replacing math.isnan with isinstance doesn't
> change
> that.
>
>
>  I guess that raises the question about why x == x but sqrt(-1) !=
>> sqrt(-1),
>>
>
> That question has already been raised, and answered, repeatedly in this
> thread.


False. x != x, so that has *not* been "answered". This was an example
problem with my own suggested implementation.

 but it seems a lot less of a big deal than all of the exceptions with
>> container equalities.
>>
>
> Container equalities are not a big deal. I'm not sure what problem you
> think
> you are solving.


 Why would you assume that? I mentioned it from *honest* *curiosity*, and
all I got back was an attack. Please, I want to be civil but you need to
act less angrily.

[Has not been spell-checked, as I don't really have time </lie>]

Thank you for your time, even though I disagree,

Joshua Landau
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20121010/29dd6651/attachment.html>


More information about the Python-ideas mailing list