[New-bugs-announce] [issue35190] collections.abc.Sequence cannot be used to test whether a class provides a particular interface
Miro Hrončok
report at bugs.python.org
Thu Nov 8 09:41:26 EST 2018
New submission from Miro Hrončok <miro at 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 at python
components: Documentation, Library (Lib)
messages: 329475
nosy: docs at 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 <report at bugs.python.org>
<https://bugs.python.org/issue35190>
_______________________________________
More information about the New-bugs-announce
mailing list