Marc 'BlackJack' Rintsch wrote: > On Fri, 25 Jan 2008 07:57:38 +0000, Pete Forman wrote: > >> Mark Dickinson <[EMAIL PROTECTED]> writes: >> >> > Any change to Python that made == and != checks involving NaNs raise >> > an exception would have to consider the consequences for set, dict, >> > list membership testing. >> > […] >> > and if Python had separate operators for these two purposes it >> > wouldn't be Python any more. >> >> There are separate Python operators, "==" and "is". > > So what? ``==`` is used for both ``==`` and set/dict/list membership > testing and "nested comparison" of those structures. There is no ``is`` > involved.
Sure, there is. ``is`` is checked before ``==``. But that's just an optimization for the usual case where "x is x" implies "x == x", to bring this full circle, something that is not true for NaNs. In [48]: class A(object): def __init__(self, x): self.x = x def __eq__(self, other): print '%r.__eq__(%r)' % (self, other) return self.x == other.x def __ne__(self, other): return not (self == other) def __hash__(self): print '%r.__hash__()' % (self,) return hash(self.x) def __repr__(self): return 'A(%r)' % (self.x,) ....: ....: In [61]: a = A(1) In [62]: b = A(2) In [63]: c = A(1) In [64]: a is c Out[64]: False In [65]: a == c A(1).__eq__(A(1)) Out[65]: True In [66]: a == b A(1).__eq__(A(2)) Out[66]: False In [67]: L = [a, b, c] In [68]: a in L Out[68]: True In [69]: b in L A(2).__eq__(A(1)) Out[69]: True In [70]: c in L A(1).__eq__(A(1)) Out[70]: True In [71]: S = set([a, b, c]) A(1).__hash__() A(2).__hash__() A(1).__hash__() A(1).__eq__(A(1)) In [72]: a in S A(1).__hash__() Out[72]: True In [73]: b in S A(2).__hash__() Out[73]: True In [74]: c in S A(1).__hash__() A(1).__eq__(A(1)) Out[74]: True In [75]: D = {a: 1, b: 2, c: 1} A(1).__hash__() A(2).__hash__() A(1).__hash__() A(1).__eq__(A(1)) In [76]: D Out[76]: A(2).__eq__(A(1)) {A(1): 1, A(2): 2} In [77]: a in D A(1).__hash__() Out[77]: True In [78]: b in D A(2).__hash__() Out[78]: True In [79]: c in D A(1).__hash__() A(1).__eq__(A(1)) Out[79]: True -- 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 -- http://mail.python.org/mailman/listinfo/python-list