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

Guido van Rossum guido at python.org
Mon Nov 27 11:15:42 EST 2017


Sounds good.

On Nov 27, 2017 8:00 AM, "Eric V. Smith" <eric at trueblade.com> wrote:

> On 11/27/17 10:51 AM, Guido van Rossum wrote:
>
>> Following up on this subthread (inline below).
>>
>> On Mon, Nov 27, 2017 at 2:56 AM, Eric V. Smith <eric at trueblade.com
>> <mailto:eric at trueblade.com>> wrote:
>>
>>     On 11/27/2017 1:04 AM, Nick Coghlan wrote:
>>
>>         On 27 November 2017 at 15:04, Greg Ewing
>>         <greg.ewing at canterbury.ac.nz
>>         <mailto:greg.ewing at canterbury.ac.nz>> wrote:
>>
>>             Nick Coghlan wrote:
>>
>>
>>                 Perhaps the check could be:
>>
>>                    (type(lhs) == type(rhs) or fields(lhs) ==
>>                 fields(rhs)) and all
>>                 (individual fields match)
>>
>>
>>
>>             I think the types should *always* have to match, or at least
>>             one should be a subclass of the other. Consider:
>>
>>             @dataclass
>>             class Point3d:
>>                  x: float
>>                  y: float
>>                  z: float
>>
>>             @dataclass
>>             class Vector3d:
>>                  x: float
>>                  y: float
>>                  z: float
>>
>>             Points and vectors are different things, and they should never
>>             compare equal, even if they have the same field names and
>>             values.
>>
>>
>>         And I guess if folks actually want more permissive structure-based
>>         matching, that's one of the features that collections.namedtuple
>>         offers that data classes don't.
>>
>>
>>     And in this case you could also do:
>>     astuple(point) == astuple(vector)
>>
>>
>> Didn't we at one point have something like
>>
>> isinstance(other, self.__class__) and fields(other) == fields(self) and
>> <all individual fields match>
>>
>> (plus some optimization if the types are identical)?
>>
>> That feels ideal, because it means you can subclass Point just to add
>> some methods and it will stay comparable, but if you add fields it will
>> always be unequal.
>>
>
> I don't think we had that before, but it sounds right to me. I think it
> could be:
>
> isinstance(other, self.__class__) and len(fields(other)) ==
> len(fields(self)) and <all individual fields match>
>
> Since by definition if you're a subclass you'll start with all of the same
> fields. So if the len's match, you won't have added any new fields. That
> should be sufficiently cheap.
>
> Then the optimized version would be:
>
> (self.__class__ is other.__class__) or (isinstance(other, self.__class__)
> and len(fields(other)) == len(fields(self))) and <all individual fields
> match>
>
> I'd probably further optimize len(fields(obj)), but that's the general
> idea.
>
> Eric.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-dev/attachments/20171127/379e73c4/attachment-0001.html>


More information about the Python-Dev mailing list