From 5463335be2f5e076032ba9041202a46f624fe8e8 Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Thu, 14 Jan 2016 09:14:38 -0800 Subject: [PATCH] Make deque inherit from MutableMapping (with difficulty). Fixes #43. --- stdlib/3/collections.pyi | 25 +++++++++++++++++++++---- stdlib/3/typing.pyi | 6 +++++- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/stdlib/3/collections.pyi b/stdlib/3/collections.pyi index cfca39fbd..956cb286f 100644 --- a/stdlib/3/collections.pyi +++ b/stdlib/3/collections.pyi @@ -18,6 +18,7 @@ from typing import ( from typing import ( MutableMapping as MutableMapping, Sequence as Sequence, + MutableSequence as MutableSequence, AbstractSet as Set, ) @@ -30,17 +31,20 @@ _VT = TypeVar('_VT') namedtuple = object() -class deque(Sized, Iterable[_T], Generic[_T]): +# Technically, deque only derives from MutableSequence in 3.5. +# But in practice it's not worth losing sleep over. +class deque(MutableSequence[_T], Generic[_T]): maxlen = 0 # type: Optional[int] # TODO readonly def __init__(self, iterable: Iterable[_T] = ..., maxlen: int = ...) -> None: ... def append(self, x: _T) -> None: ... def appendleft(self, x: _T) -> None: ... + def insert(self, i: int, x: _T) -> None: ... def clear(self) -> None: ... def count(self, x: _T) -> int: ... def extend(self, iterable: Iterable[_T]) -> None: ... def extendleft(self, iterable: Iterable[_T]) -> None: ... - def pop(self) -> _T: ... + def pop(self, i: int = ...) -> _T: ... def popleft(self) -> _T: ... def remove(self, value: _T) -> None: ... def reverse(self) -> None: ... @@ -51,9 +55,22 @@ class deque(Sized, Iterable[_T], Generic[_T]): def __str__(self) -> str: ... def __hash__(self) -> int: ... - def __getitem__(self, i: int) -> _T: ... + # These methods of deque don't really take slices, but we need to + # define them as taking a slice to satisfy MutableSequence. + @overload + def __getitem__(self, index: int) -> _T: ... + @overload + def __getitem__(self, s: slice) -> Sequence[_T]: raise TypeError + @overload def __setitem__(self, i: int, x: _T) -> None: ... - def __contains__(self, o: _T) -> bool: ... + @overload + def __setitem__(self, s: slice, o: Sequence[_T]) -> None: raise TypeError + @overload + def __delitem__(self, i: int) -> None: ... + @overload + def __delitem__(self, s: slice) -> None: raise TypeError + + def __contains__(self, o: object) -> bool: ... # TODO __reversed__ diff --git a/stdlib/3/typing.pyi b/stdlib/3/typing.pyi index 7181de306..d4a0a0c60 100644 --- a/stdlib/3/typing.pyi +++ b/stdlib/3/typing.pyi @@ -150,8 +150,12 @@ class MutableSequence(Sequence[_T], Generic[_T]): @overload @abstractmethod def __setitem__(self, s: slice, o: Sequence[_T]) -> None: ... + @overload @abstractmethod - def __delitem__(self, i: Union[int, slice]) -> None: ... + def __delitem__(self, i: int) -> None: ... + @overload + @abstractmethod + def __delitem__(self, i: slice) -> None: ... # Mixin methods def append(self, object: _T) -> None: ... def extend(self, iterable: Iterable[_T]) -> None: ...