Just FYI there is a closely related issue on b.p.o. https://bugs.python.org/issue25988. FWIW I am in favor of the idea, but some people are against it (see e.g. the issue).
-- Ivan On Fri, 27 Sep 2019 at 17:12, Steven D'Aprano <st...@pearwood.info> wrote: > I keep finding myself needing to test for objects that support > subscripting. This is one case where EAFP is *not* actually easier: > > try: > obj[0] > except TypeError: > subscriptable = False > except (IndexError, KeyError): > subscriptable = True > else: > subscriptable = True > if subscriptable: > ... > > > But I don't like manually testing for it like this: > > if getattr(obj, '__getitem__', None) is not None: ... > > because it is wrong. (Its wrong because an object with __getitem__ > defined as an instance attribute isn't subscriptable; it has to be in > the class, or a superclass.) > > But doing it correctly is too painful: > > if any(getattr(T, '__getitem__', None) is not None for T in > type(obj).mro()) > > and besides I've probably still got it wrong in some subtle way. What > I'd really like to do is use the collections.abc module to do the check: > > if isinstance(obj, collections.abc.Subscriptable): ... > > in the same way we can check for Sized, Hashable etc. > > Alternatively, if we had a getclassattr that skipped the instance > attributes, I could say: > > if getclassattr(obj, '__getitem__', None) is not None: ... > > > (1) Am I doing it wrong? Perhaps I've missed some already existing > solution to this. > > (2) If not, is there any reason why we shouldn't add Subscriptable to > the collection.abc module? I think I have the implementation: > > class Subscriptable(metaclass=ABCMeta): > __slots__ = () > @abstractmethod > def __getitem__(self, idx): > return None > @classmethod > def __subclasshook__(cls, C): > if cls is Subscriptable: > return _check_methods(C, "__getitem__") > return NotImplemented > > Comments, questions, flames? > > > > -- > Steven > _______________________________________________ > 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/JCQJP5K32SELHRZFQB75CNLTECT3YD3K/ > Code of Conduct: http://python.org/psf/codeofconduct/ >
_______________________________________________ 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/BJ7QNL3OWOBVXLRGHCS25W2Y4IXANWWV/ Code of Conduct: http://python.org/psf/codeofconduct/