On Wed, Oct 2, 2019 at 5:18 AM Ben Rudiak-Gould <benrud...@gmail.com> wrote:
>
> On Tue, Oct 1, 2019 at 9:26 AM Andrew Barnert <abarn...@yahoo.com> wrote:
> > On Sep 30, 2019, at 23:46, Ben Rudiak-Gould <benrud...@gmail.com> wrote:
> > > ABC membership is a subtype relationship in some sense, and ordinary 
> > > Python subclassing is a subtype relationship in some sense, but they 
> > > aren't quite the same sense,
> >
> > But in this case, they actually match. Hashable is correctly checking for 
> > structural subtyping, and the problem is that list isn’t actually a proper 
> > subtype of object, not that object isn’t a proper subtype of Hashable.
>
> If you take the perspective that the ABC notion of subtyping is the
> correct one, then list isn't a proper subtype of object. I wasn't
> taking the perspective that either one is the correct one. I think
> they're probably both okay in isolation.
>

If you want to get REALLY technical, very few types - if any - are
actually proper subtypes. A strict reading of the Liskov Substitution
Principle would imply that the repr of every object should remain
identical to object.__repr__ of that object. That's completely
useless, of course, but the question is: if a subclass is allowed to
make changes to its parent's behaviour, where do you draw the line?
For instance, it is extremely common to expect that x == x for any
object x, but float is a subtype of object, and not every float
maintains that property.

The base object type compares by identity, so object() != object(). Is
it violating LSP if two non-identical objects compare equal?

The base object is immutable. Subtypes that are also immutable will
follow the principle that if a == b now, then a == b forever. Is it
violating LSP to have mutable objects that can compare equal now but
unequal later?

The hashability issue is a logical consequence of accepting that the
above violations are reasonable and practically useful. Since a==b
must imply that hash(a)==hash(b), it logically follows that either the
hash of every list is the same (thus destroying the value of hashing
at all), or the hash of a list could change (thus destroying the very
meaning of object hashes). I'm not sure what would break if every list
object had a hash of 0x142857, but certainly it wouldn't be of much
practical use, and would be a performance nightmare (you use a list as
a dict key and suddenly every lookup is a linear search). Yes, it's
not a "proper subtype", but proper subtypes are impractically
restrictive.

ChrisA
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/HHHKXLRQSYA7UAUQVFSZIPIYEANZHX32/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to