We can add .keys() to Mapping to distinguish Mapping and Sequence. But it is breaking change, of course. We shouldn’t change it.
We could use the presence of .keys in the subclasses hook only after first checking explicit cases (i.e. actual subclass or has been registered). Yes this would break code that uses issubclass(X, Mapping) where X looks mapping but isn’t a mapping. But is this really a concern? What if X had to have all 3 keys, values, and items to qualify? Are there really a bunch of classes with __getitem__, __len__, __iter__, keys, values, and items where the class is expected to not be considered a subclass of Mapping? If there really is a classes like this we could add a warning the subclass hook about saying that in a feature version that X is going to be considered a mapping. Additionally we could add a black list to the ABCs which would function like the inverse of register. On Thu, Apr 22, 2021 at 7:32 PM Inada Naoki songofaca...@gmail.com <http://mailto:songofaca...@gmail.com> wrote: 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/ >
_______________________________________________ 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/ZJQMGI7345TC4AU4MQTWZZA2ENK4NWAL/ Code of Conduct: http://python.org/psf/codeofconduct/