Skip to content

Commit d43adbe

Browse files
tharvikgvanrossum
authored andcommitted
WIP: Mapping.{get,pop} can return default type (#223)
* Mapping.{get,pop} can return default type * Mapping values are covariant
1 parent 5b5f01f commit d43adbe

File tree

4 files changed

+44
-20
lines changed

4 files changed

+44
-20
lines changed

stdlib/2.7/__builtin__.pyi

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ from typing import (
88
Sequence, Mapping, Tuple, List, Any, Dict, Callable, Generic, Set,
99
AbstractSet, Sized, Reversible, SupportsInt, SupportsFloat, SupportsAbs,
1010
SupportsRound, IO, BinaryIO, Union, AnyStr, MutableSequence, MutableMapping,
11-
MutableSet
11+
MutableSet, Optional,
1212
)
1313
from abc import abstractmethod, ABCMeta
1414

@@ -534,8 +534,14 @@ class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
534534
def has_key(self, k: _KT) -> bool: ...
535535
def clear(self) -> None: ...
536536
def copy(self) -> Dict[_KT, _VT]: ...
537-
def get(self, k: _KT, default: _VT = None) -> _VT: ...
538-
def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
537+
@overload
538+
def get(self, k: _KT) -> Optional[_VT]: ...
539+
@overload
540+
def get(self, k: _KT, default: _T) -> Union[_VT, _T]: ...
541+
@overload
542+
def pop(self, k: _KT) -> _VT: ...
543+
@overload
544+
def pop(self, k: _KT, default: _T) -> Union[_VT, _T]: ...
539545
def popitem(self) -> Tuple[_KT, _VT]: ...
540546
def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
541547
@overload

stdlib/2.7/typing.pyi

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -157,17 +157,20 @@ class MutableSet(AbstractSet[_T], Generic[_T]):
157157
def __ixor__(self, s: AbstractSet[_S]) -> MutableSet[Union[_T, _S]]: ...
158158
def __isub__(self, s: AbstractSet[Any]) -> MutableSet[_T]: ...
159159

160-
class Mapping(Sized, Iterable[_KT], Container[_KT], Generic[_KT, _VT]):
160+
class Mapping(Sized, Iterable[_KT], Container[_KT], Generic[_KT, _VT_co]):
161161
@abstractmethod
162-
def __getitem__(self, k: _KT) -> _VT: ...
162+
def __getitem__(self, k: _KT) -> _VT_co: ...
163163
# Mixin methods
164-
def get(self, k: _KT, default: _VT = ...) -> _VT: ...
164+
@overload
165+
def get(self, k: _KT) -> Optional[_VT_co]: ...
166+
@overload
167+
def get(self, k: _KT, default: _T) -> Union[_VT_co, _T]: ...
165168
def keys(self) -> list[_KT]: ...
166-
def values(self) -> list[_VT]: ...
167-
def items(self) -> list[Tuple[_KT, _VT]]: ...
169+
def values(self) -> list[_VT_co]: ...
170+
def items(self) -> list[Tuple[_KT, _VT_co]]: ...
168171
def iterkeys(self) -> Iterator[_KT]: ...
169-
def itervalues(self) -> Iterator[_VT]: ...
170-
def iteritems(self) -> Iterator[Tuple[_KT, _VT]]: ...
172+
def itervalues(self) -> Iterator[_VT_co]: ...
173+
def iteritems(self) -> Iterator[Tuple[_KT, _VT_co]]: ...
171174
def __contains__(self, o: object) -> bool: ...
172175

173176
class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
@@ -177,7 +180,10 @@ class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
177180
def __delitem__(self, v: _KT) -> None: ...
178181

179182
def clear(self) -> None: ...
180-
def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
183+
@overload
184+
def pop(self, k: _KT) -> _VT: ...
185+
@overload
186+
def pop(self, k: _KT, default: _T) -> Union[_VT, _T]: ...
181187
def popitem(self) -> Tuple[_KT, _VT]: ...
182188
def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
183189
@overload

stdlib/3/builtins.pyi

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ from typing import (
44
TypeVar, Iterator, Iterable, overload,
55
Sequence, MutableSequence, Mapping, MutableMapping, Tuple, List, Any, Dict, Callable, Generic,
66
Set, AbstractSet, MutableSet, Sized, Reversible, SupportsInt, SupportsFloat, SupportsBytes,
7-
SupportsAbs, SupportsRound, IO, Union, ItemsView, KeysView, ValuesView, ByteString
7+
SupportsAbs, SupportsRound, IO, Union, ItemsView, KeysView, ValuesView, ByteString, Optional,
88
)
99
from abc import abstractmethod, ABCMeta
1010

@@ -507,8 +507,14 @@ class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
507507
def __init__(self, iterable: Iterable[Tuple[_KT, _VT]], **kwargs: _VT) -> None: ...
508508
def clear(self) -> None: ...
509509
def copy(self) -> Dict[_KT, _VT]: ...
510-
def get(self, k: _KT, default: _VT = None) -> _VT: ...
511-
def pop(self, k: _KT, default: _VT = None) -> _VT: ...
510+
@overload
511+
def get(self, k: _KT) -> Optional[_VT]: ...
512+
@overload
513+
def get(self, k: _KT, default: _T) -> Union[_VT, _T]: ...
514+
@overload
515+
def pop(self, k: _KT) -> _VT: ...
516+
@overload
517+
def pop(self, k: _KT, default: _T) -> Union[_VT, _T]: ...
512518
def popitem(self) -> Tuple[_KT, _VT]: ...
513519
def setdefault(self, k: _KT, default: _VT = None) -> _VT: ...
514520
@overload

stdlib/3/typing.pyi

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -215,16 +215,19 @@ class ValuesView(MappingView, Iterable[_VT_co], Generic[_VT_co]):
215215

216216
# TODO: ContextManager (only if contextlib.AbstractContextManager exists)
217217

218-
class Mapping(Iterable[_KT], Container[_KT], Sized, Generic[_KT, _VT]):
218+
class Mapping(Iterable[_KT], Container[_KT], Sized, Generic[_KT, _VT_co]):
219219
# TODO: Value type should be covariant, but currently we can't give a good signature for
220220
# get if this is the case.
221221
@abstractmethod
222-
def __getitem__(self, k: _KT) -> _VT: ...
222+
def __getitem__(self, k: _KT) -> _VT_co: ...
223223
# Mixin methods
224-
def get(self, k: _KT, default: _VT = ...) -> _VT: ...
225-
def items(self) -> AbstractSet[Tuple[_KT, _VT]]: ...
224+
@overload
225+
def get(self, k: _KT) -> Optional[_VT_co]: ...
226+
@overload
227+
def get(self, k: _KT, default: _T) -> Union[_VT_co, _T]: ...
228+
def items(self) -> AbstractSet[Tuple[_KT, _VT_co]]: ...
226229
def keys(self) -> AbstractSet[_KT]: ...
227-
def values(self) -> ValuesView[_VT]: ...
230+
def values(self) -> ValuesView[_VT_co]: ...
228231
def __contains__(self, o: object) -> bool: ...
229232

230233
class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
@@ -234,7 +237,10 @@ class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
234237
def __delitem__(self, v: _KT) -> None: ...
235238

236239
def clear(self) -> None: ...
237-
def pop(self, k: _KT, default: _VT = ...) -> _VT: ...
240+
@overload
241+
def pop(self, k: _KT) -> _VT: ...
242+
@overload
243+
def pop(self, k: _KT, default: _T) -> Union[_VT, _T]: ...
238244
def popitem(self) -> Tuple[_KT, _VT]: ...
239245
def setdefault(self, k: _KT, default: _VT = ...) -> _VT: ...
240246
# 'update' used to take a Union, but using overloading is better.

0 commit comments

Comments
 (0)