Skip to content

Commit

Permalink
Make Mapping covariant.
Browse files Browse the repository at this point in the history
Fixes #510.

This requires a `# type: ignore` on `__getitem__` and `get` because
mypy complains about covariant parameters.

FWIW typing.py needs to be changed too.  (It was covariant in the
value but invariant in the key -- typeshed was invariant in both.)
  • Loading branch information
Guido van Rossum authored and Guido van Rossum committed Sep 2, 2016
1 parent 23c44d3 commit cb2836c
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 17 deletions.
22 changes: 12 additions & 10 deletions stdlib/2.7/typing.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -176,17 +176,19 @@ class ValuesView(MappingView, Iterable[_VT_co], Generic[_VT_co]):
def __contains__(self, o: object) -> bool: ...
def __iter__(self) -> Iterator[_VT_co]: ...

class Mapping(Sized, Iterable[_KT], Container[_KT], Generic[_KT, _VT]):
@abstractmethod
def __getitem__(self, k: _KT) -> _VT: ...
class Mapping(Sized, Iterable[_KT_co], Container[_KT_co], Generic[_KT_co, _VT_co]):
@abstractmethod # type: ignore
def __getitem__(self, k: _KT_co) -> _VT_co: # type: ignore
...
# Mixin methods
def get(self, k: _KT, default: _VT = ...) -> _VT: ...
def keys(self) -> list[_KT]: ...
def values(self) -> list[_VT]: ...
def items(self) -> list[Tuple[_KT, _VT]]: ...
def iterkeys(self) -> Iterator[_KT]: ...
def itervalues(self) -> Iterator[_VT]: ...
def iteritems(self) -> Iterator[Tuple[_KT, _VT]]: ...
def get(self, k: _KT_co, default: _VT_co = ...) -> _VT_co: # type: ignore
...
def keys(self) -> list[_KT_co]: ...
def values(self) -> list[_VT_co]: ...
def items(self) -> list[Tuple[_KT_co, _VT_co]]: ...
def iterkeys(self) -> Iterator[_KT_co]: ...
def itervalues(self) -> Iterator[_VT_co]: ...
def iteritems(self) -> Iterator[Tuple[_KT_co, _VT_co]]: ...
def __contains__(self, o: object) -> bool: ...

class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
Expand Down
16 changes: 9 additions & 7 deletions stdlib/3/typing.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -226,16 +226,18 @@ class ValuesView(MappingView, Iterable[_VT_co], Generic[_VT_co]):

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

class Mapping(Iterable[_KT], Container[_KT], Sized, Generic[_KT, _VT]):
class Mapping(Iterable[_KT_co], Container[_KT_co], Sized, Generic[_KT_co, _VT_co]):
# TODO: Value type should be covariant, but currently we can't give a good signature for
# get if this is the case.
@abstractmethod
def __getitem__(self, k: _KT) -> _VT: ...
@abstractmethod # type: ignore
def __getitem__(self, k: _KT_co) -> _VT_co: # type: ignore
...
# Mixin methods
def get(self, k: _KT, default: _VT = ...) -> _VT: ...
def items(self) -> AbstractSet[Tuple[_KT, _VT]]: ...
def keys(self) -> AbstractSet[_KT]: ...
def values(self) -> ValuesView[_VT]: ...
def get(self, k: _KT_co, default: _VT_co = ...) -> _VT_co: # type: ignore
...
def items(self) -> AbstractSet[Tuple[_KT_co, _VT_co]]: ...
def keys(self) -> AbstractSet[_KT_co]: ...
def values(self) -> ValuesView[_VT_co]: ...
def __contains__(self, o: object) -> bool: ...

class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
Expand Down

0 comments on commit cb2836c

Please sign in to comment.