[Python-Dev] == on object tests identity in 3.x

Andreas Maier andreas.r.maier at gmx.de
Tue Jul 8 03:18:16 CEST 2014


Am 2014-07-08 01:50, schrieb Ethan Furman:
> On 07/07/2014 04:36 PM, Andreas Maier wrote:
>> Am 2014-07-07 19:43, schrieb Ethan Furman:
>>>
>>> Python cannot know which values are important in an equality test, 
>>> and which are not.  So it refuses to guess.
>>
>> Well, one could argue that using the address of an object for its 
>> value equality test is pretty close to guessing,
>> considering that given a sensible definition of value equality, 
>> objects of different identity can very well be equal but
>> will always be considered unequal based on the address.
>
> And what would be this 'sensible definition'?

One that only a class designer can define. That's why I argued for 
raising an exception if that is not defined.

But as I stated elsewhere in this thread: It is as it is, and we need to 
document it.
>
>> So we have many cases of classes whose designers thought about 
>> whether a sensible definition of equality was needed, and
>> decided that an address/identity-based equality definition was just 
>> what they needed, yet they did not want to or could
>> not use the "is" operator?
>
> 1) The address of the object is irrelevant.  While that is what 
> CPython uses, it is not what every Python uses.
>
> 2) The 'is' operator is specialized, and should only rarely be 
> needed.  If equals is what you mean, use '=='.
>
> 3) If Python forced us to write our own __eq__ /for every single 
> class/ what would happen?  Well, I suspect quite a few would make 
> their own 'object' to inherit from, and would have the fallback of 
> __eq__ meaning object identity. Practicality beats purity.
>
>
>> Can you give me an example for such a class (besides type object)? 
>> (I.e. a class that does not have __eq__() and
>> __ne__() but whose instances are compared with == or !=)
>
> I never add __eq__ to my classes until I come upon a place where I 
> need to check if two instances of those classes are 'equal', for 
> whatever I need equal to mean in that case.

With that strategy, you would not be hurt if the default implementation 
raised an exception in case the two objects are not identical. ;-)

>>> Ordering is much less frequent, and since we already tried always 
>>> ordering things, falling back to type name if
>>> necessary, we have discovered that that is not a good trade-off.  So 
>>> now if one tries to order things without
>>> specifying how it should be done, one gets an exception.
>>
>> In Python 2, the default ordering implementation on type object uses 
>> the identity (address) as the basis for ordering.
>> In Python 3, that was changed to raise an exception. That seems to be 
>> in sync with what you are saying.
>>
>> Maybe it would have been possible to also change that for the default 
>> equality implementation in Python 3. But it was
>> not changed. As I wrote in another response, we now need to document 
>> this properly.
>
> Doc patches are gratefully accepted.  :)

Understood. I will be working on it. :-)

Andy



More information about the Python-Dev mailing list