[Python-Dev] Second post: PEP 557, Data Classes

Eric V. Smith eric at trueblade.com
Tue Nov 28 15:56:28 EST 2017

On 11/28/2017 1:57 PM, Guido van Rossum wrote:
> I would also be happy with a retreat, where we define `__eq__` to insist 
> that the classes are the same, and people can override this to their 
> hearts' content.

I agree. And I guess we could always add it later, if there's a huge 
demand and someone writes a decent implementation. There would be a 
slight backwards incompatibility, though. Frankly, I think it would 
never be needed.

One question remains: do we do what attrs does: for `__eq__` and 
`__ne__` use an exact type match, and for the 4 ordered comparison 
operators use an isinstance check? On the comparison operators, they 
also ignore attributes defined on any derived class [0]. As I said, I 
couldn't find an attrs issue that discusses their choice. I'll ask Hynek 
over on the dataclasses github issue.

Currently the dataclasses code on master uses an exact type match for 
all 6 methods.


[0] That is, they do the following (using dataclasses terms):


class B:
     i: int
     j: int

class C:
     k: int

Then B.__eq__ is:

def __eq__(self, other):
     if other.__class__ is self.__class__:
         return (other.i, other.j) == (self.i, self.j)
     return NotImplemented

And B.__lt__ is:

def __lt__(self, other):
     if isinstance(other, self.__class__):
         return (other.i, other.j) < (self.i, self.j)
     return NotImplemented

So if you do:
b = B(1, 2)
c = C(1, 2, 3)

Then `B(1, 2) < C(1, 2, 3)` ignores `c.k`.

More information about the Python-Dev mailing list