Skip to content

Commit

Permalink
Stop inheriting Sized in collection ABCs (#2658)
Browse files Browse the repository at this point in the history
Instead define abstract __len__ in affected classes.

Fixes #2655 without breaking
rominf/ordered-set-stubs#1
  • Loading branch information
gvanrossum authored Nov 30, 2018
1 parent eaeb5fc commit de50614
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 11 deletions.
22 changes: 16 additions & 6 deletions stdlib/2/typing.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ class Container(Protocol[_T_co]):
@abstractmethod
def __contains__(self, x: object) -> bool: ...

class Sequence(Iterable[_T_co], Container[_T_co], Sized, Reversible[_T_co], Generic[_T_co]):
class Sequence(Iterable[_T_co], Container[_T_co], Reversible[_T_co], Generic[_T_co]):
@overload
@abstractmethod
def __getitem__(self, i: int) -> _T_co: ...
Expand All @@ -157,6 +157,9 @@ class Sequence(Iterable[_T_co], Container[_T_co], Sized, Reversible[_T_co], Gene
def __contains__(self, x: object) -> bool: ...
def __iter__(self) -> Iterator[_T_co]: ...
def __reversed__(self) -> Iterator[_T_co]: ...
# Implement Sized (but don't have it as a base class).
@abstractmethod
def __len__(self) -> int: ...

class MutableSequence(Sequence[_T], Generic[_T]):
@abstractmethod
Expand Down Expand Up @@ -187,7 +190,7 @@ class MutableSequence(Sequence[_T], Generic[_T]):
def remove(self, object: _T) -> None: ...
def __iadd__(self, x: Iterable[_T]) -> MutableSequence[_T]: ...

class AbstractSet(Sized, Iterable[_T_co], Container[_T_co], Generic[_T_co]):
class AbstractSet(Iterable[_T_co], Container[_T_co], Generic[_T_co]):
@abstractmethod
def __contains__(self, x: object) -> bool: ...
# Mixin methods
Expand All @@ -201,6 +204,10 @@ class AbstractSet(Sized, Iterable[_T_co], Container[_T_co], Generic[_T_co]):
def __xor__(self, s: AbstractSet[_T]) -> AbstractSet[Union[_T_co, _T]]: ...
# TODO: argument can be any container?
def isdisjoint(self, s: AbstractSet[Any]) -> bool: ...
# Implement Sized (but don't have it as a base class).
@abstractmethod
def __len__(self) -> int: ...


class MutableSet(AbstractSet[_T], Generic[_T]):
@abstractmethod
Expand All @@ -216,14 +223,14 @@ class MutableSet(AbstractSet[_T], Generic[_T]):
def __ixor__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: ...
def __isub__(self, s: AbstractSet[Any]) -> MutableSet[_T]: ...

class MappingView(Sized):
class MappingView(object):
def __len__(self) -> int: ...

class ItemsView(AbstractSet[Tuple[_KT_co, _VT_co]], MappingView, Generic[_KT_co, _VT_co]):
class ItemsView(MappingView, AbstractSet[Tuple[_KT_co, _VT_co]], Generic[_KT_co, _VT_co]):
def __contains__(self, o: object) -> bool: ...
def __iter__(self) -> Iterator[Tuple[_KT_co, _VT_co]]: ...

class KeysView(AbstractSet[_KT_co], MappingView, Generic[_KT_co]):
class KeysView(MappingView, AbstractSet[_KT_co], Generic[_KT_co]):
def __contains__(self, o: object) -> bool: ...
def __iter__(self) -> Iterator[_KT_co]: ...

Expand All @@ -238,7 +245,7 @@ class ContextManager(Protocol[_T_co]):
exc_value: Optional[BaseException],
traceback: Optional[TracebackType]) -> Optional[bool]: ...

class Mapping(Iterable[_KT], Container[_KT], Sized, Generic[_KT, _VT_co]):
class Mapping(Iterable[_KT], Container[_KT], Generic[_KT, _VT_co]):
# TODO: We wish the key type could also be covariant, but that doesn't work,
# see discussion in https: //github.com/python/typing/pull/273.
@abstractmethod
Expand All @@ -256,6 +263,9 @@ class Mapping(Iterable[_KT], Container[_KT], Sized, Generic[_KT, _VT_co]):
def itervalues(self) -> Iterator[_VT_co]: ...
def iteritems(self) -> Iterator[Tuple[_KT, _VT_co]]: ...
def __contains__(self, o: object) -> bool: ...
# Implement Sized (but don't have it as a base class).
@abstractmethod
def __len__(self) -> int: ...

class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
@abstractmethod
Expand Down
17 changes: 12 additions & 5 deletions stdlib/3/typing.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -235,11 +235,18 @@ class Container(Protocol[_T_co]):

if sys.version_info >= (3, 6):
@runtime
class Collection(Sized, Iterable[_T_co], Container[_T_co], Protocol[_T_co]): ...
class Collection(Iterable[_T_co], Container[_T_co], Protocol[_T_co]):
# Implement Sized (but don't have it as a base class).
@abstractmethod
def __len__(self) -> int: ...

_Collection = Collection
else:
@runtime
class _Collection(Sized, Iterable[_T_co], Container[_T_co], Protocol[_T_co]): ...
class _Collection(Iterable[_T_co], Container[_T_co], Protocol[_T_co]):
# Implement Sized (but don't have it as a base class).
@abstractmethod
def __len__(self) -> int: ...

class Sequence(_Collection[_T_co], Reversible[_T_co], Generic[_T_co]):
@overload
Expand Down Expand Up @@ -317,14 +324,14 @@ class MutableSet(AbstractSet[_T], Generic[_T]):
def __ixor__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: ...
def __isub__(self, s: AbstractSet[Any]) -> MutableSet[_T]: ...

class MappingView(Sized):
class MappingView:
def __len__(self) -> int: ...

class ItemsView(AbstractSet[Tuple[_KT_co, _VT_co]], MappingView, Generic[_KT_co, _VT_co]):
class ItemsView(MappingView, AbstractSet[Tuple[_KT_co, _VT_co]], Generic[_KT_co, _VT_co]):
def __contains__(self, o: object) -> bool: ...
def __iter__(self) -> Iterator[Tuple[_KT_co, _VT_co]]: ...

class KeysView(AbstractSet[_KT_co], MappingView, Generic[_KT_co]):
class KeysView(MappingView, AbstractSet[_KT_co], Generic[_KT_co]):
def __contains__(self, o: object) -> bool: ...
def __iter__(self) -> Iterator[_KT_co]: ...

Expand Down

0 comments on commit de50614

Please sign in to comment.