New submission from Miro Hrončok <m...@hroncok.cz>: The collections.abc — Abstract Base Classes for Containers documentation says:
> This module provides abstract base classes that can be used to test whether a > class provides a particular interface; for example, whether it is hashable or > whether it is a mapping. https://docs.python.org/3/library/collections.abc.html However this is not true for Sequence. When I implement a class that provides a particular interface (defined in the Collections Abstract Base Classes table in that very page), I cannot check whether it implements a Sequence. See an example: from collections import abc class Box: def __init__(self, wrapped): self._w = wrapped def __len__(self): return len(self._w) def __iter__(self): yield from self._w def __getitem__(self, i): return self._w[i] def __reversed__(self): yield from reversed(self._w) def __contains__(self, i): return i in self._w def index(self, value, start=0, stop=None): return self._w.index(value, start, stop) def count(self, value): return self._w.count(value) b = Box([1, 2, 3]) for t in 'Sized', 'Iterable', 'Reversible', 'Container', 'Collection', 'Sequence': print(f'{t}: {isinstance(b, getattr(abc, t))}') My class is Reversible. My class is a Collection (as it is a Sized Iterable Container). It implements __getitem__, __len__, __contains__, __iter__, __reversed__, index, and count. Yet my class instance is not an instance of Sequence. I suppose this behavior might be intentional, as discussed in issue16728 - or it might as well not be. The main concern was that dict also provides these methods, but is not considered a Sequence, however dict does not provide index() or count(). Regardless whether this is right or wrong behavior, as documented this should be a Sequence. See also https://stackoverflow.com/questions/34927949/issubclass-of-abstract-base-class-sequence As I see it, either: collections.abc.Sequence needs a __subclasshook__ so it can be used as the documentation implies. Or: the documentation should not say that "abstract base classes (from abc module) can be used to test whether a class provides a particular interface" if it doesn't generally apply Or: the Sequence documentation should say: "this particular abstract base class cannot be used to test whether a class provides a particular interface because reasons" (yet I don't really get those reasons) ---------- assignee: docs@python components: Documentation, Library (Lib) messages: 329475 nosy: docs@python, hroncok, vstinner priority: normal severity: normal status: open title: collections.abc.Sequence cannot be used to test whether a class provides a particular interface versions: Python 3.6, Python 3.7, Python 3.8 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue35190> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com