On Fri, Apr 23, 2021 at 10:33 AM Chris Angelico <ros...@gmail.com> wrote: > > On Fri, Apr 23, 2021 at 11:22 AM Larry Hastings <la...@hastings.org> 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 <songofaca...@gmail.com> _______________________________________________ Python-Dev mailing list -- python-dev@python.org To unsubscribe send an email to python-dev-le...@python.org https://mail.python.org/mailman3/lists/python-dev.python.org/ Message archived at https://mail.python.org/archives/list/python-dev@python.org/message/ESLOPO4GLC2QZW4ZDBYEQDPPGB4ZYDWM/ Code of Conduct: http://python.org/psf/codeofconduct/