On Fri, Sep 27, 2019 at 10:11:15AM -0700, Andrew Barnert wrote:
> On Sep 27, 2019, at 09:05, Steven D'Aprano <st...@pearwood.info> wrote:
> > 
> > What 
> > I'd really like to do is use the collections.abc module to do the check:
> > 
> >    if isinstance(obj, collections.abc.Subscriptable): ...
> 
> What about isinstance(obj, (Sequence, Mapping))?

No, they require more than just being subscriptable.

py> class Test(object):
...     def __getitem__(self, idx):
...             return idx**2
...
py> squares = Test()
py> squares[5]
25
py> from collections.abc import Sequence, Mapping
py> isinstance(squares, (Sequence, Mapping))
False


One of the tests I want is for something which is subscriptable but not 
sized, like squares above.

To be a (virtual) subclass of Sequence, the object has to provide 
__getitem__ and __len__, and to be a Mapping it also has to provide 
__iter__. Neither __len__ nor __iter__ are necessary for my purposes, 
and in fact __len__ may be undesirable.

> That isn’t quite the same thing, since you can have types that are 
> subscriptable, but its subscripts don’t mean either index or key. 

Its not even close to the same thing :-(

> _GenericAlias is probably not the best example here, but it is an 
> example.

Where is that from?

> Plus, it seems like it’s actually a more direct LBYL translation of 
> what you’re EAFPing with your except (IndexError, KeyError) test.

Sorry, that doesn't fly. There's nothing in my except test which 
requires the existence of __len__. All I need is an object that 
supports subscripting, but the current state of the ABCs requires that I 
either roll my own test which will probably be wrong, or test for 
methods that I don't need or want.



-- 
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/QTZUKQNRDBXCRZORD2QZX7ZUAWPHW3EI/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to