[Python-Dev] Re: Keeping Python a Duck Typed Language.

2021年4月22日 19:38:29 -0700

On Fri, Apr 23, 2021 at 10:33 AM Chris Angelico <[email protected]> wrote:
>
> On Fri, Apr 23, 2021 at 11:22 AM Larry Hastings <[email protected]> wrote:
> >
> >
> > On 4/20/21 10:03 AM, Mark Shannon wrote:
> >
> > If you guarded your code with `isinstance(foo, Sequence)` then I could not 
> > use it with my `Foo` even if my `Foo` quacked like a sequence. I was forced 
> > to use nominal typing; inheriting from Sequence, or explicitly registering 
> > as a Sequence.
> >
> >
> > If I'm reading the library correctly, this is correct--but, perhaps, it 
> > could be remedied by adding a __subclasshook__ to Sequence that looked for 
> > an __iter__ attribute. That technique might also apply to other ABCs in 
> > collections.abc, Mapping for example. Would that work, or am I missing an 
> > critical detail?
> >
>
> How would you distinguish between a Sequence and a Mapping? Both have
> __iter__ and __len__. Without actually calling those methods, how
> would the subclass hook tell them apart?
>
> ChrisA
We can add .keys() to Mapping to distinguish Mapping and Sequence.
But it is breaking change, of course. We shouldn't change it.
I think using ABC to distinguish sequence or mapping is a bad idea.
There are three policies:
a) Use duck-typing; just us it as sequence. No type check at all.
b) Use strict type checking; isinstance(x, list) / isinstance(x, (list, tuple)).
c) Use ABC.
But (c) is broken by design. It is not fixable.
IMHO, We should chose (a) or (b) and reject any idea relying on Sequence ABC.
Regards,
-- 
Inada Naoki <[email protected]>
_______________________________________________
Python-Dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at 
https://mail.python.org/archives/list/[email protected]/message/ESLOPO4GLC2QZW4ZDBYEQDPPGB4ZYDWM/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to