On Oct 1, 2019, at 12:17, 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 don’t think anyone takes that perspective.

The correct notion of subtyping for Python is the one that exactly reproduces 
duck typing in an LBYL-checkable way, which I’ll bet is provably equivalent to 
the halting problem.

However, the whole mess of things that go into isinstance and issubclass in 
Python (including third-party code) together define a pretty-good-in-practice 
approximation of that, when user with most real-life code. And a much better 
one than either inheritance or structural tests alone. 

> My problem is not that I can't justify the current behavior, it's that
> if it behaved differently, I could justify that behavior too. I feel
> like you're using CPython as an oracle of what ABCs should do,

Well, I’m using all Python implementations, together with all of the popular 
third-party code out there, as used by thousands of people every day, allowing 
us to work with types in a way that’s more pleasant to read than Java or Go or 
Objective C or Ruby, as an argument that Python’s design is in practice pretty 
good.

I can make a good argument that inheritance alone, or structural subtyping 
alone, would be so terrible as to be nearly useless for Python. I can’t make an 
argument that no possible thing you could think of could be better than what 
Python currently does. (In fact, I can think of things I’d suggest be done 
differently if I had a time machine back. Then again, I could improve even more 
things with even less work by taking that time machine even further back and 
giving Guido the 2.3 type system back in 0.9, or *args and **kw.)

But I don’t see why I have to make an argument for a years-old feature just 
because someone wants to add a minor extension that goes along with the way 
that feature has always been used. If you hate ABCs, you’re not going to use 
collections.abc.Subscriptable now matter how it’s bikeshedded.

> What *should* it mean to inherit from an ABC? The module encourages
> you to use them as mixins, but maybe that isn't the intended meaning,
> just a side hack? Is the primary meaning to do the equivalent of
> registering the class with the predicate?

The intended meaning clearly is a mix of multiple things: some of them do 
structural subtyping, some don’t; some rely heavily on registration; some act 
as useful mixins, some don’t; etc.

Theoretically, abc is a bit of a mess, and collections.abc, numbers, and io are 
a horrible pile of unusable crap. But in practice, they actually work pretty 
nicely in a wide range of code that people read every day.
_______________________________________________
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/4ZZQRTCYXFRFOMQI4S6ZBUWW47YHHKJM/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to