]> granicus.if.org Git - python/commitdiff
Mapping key type is invariant.
authorGuido van Rossum <guido@python.org>
Sun, 7 Jun 2015 20:36:19 +0000 (13:36 -0700)
committerGuido van Rossum <guido@python.org>
Sun, 7 Jun 2015 20:36:19 +0000 (13:36 -0700)
Lib/test/test_typing.py
Lib/typing.py

index 97404258a328e2ae3ebe1afedc70061b72ebdd22..2bb21edc188975841b2640777ae6931ecac59c57 100644 (file)
@@ -707,11 +707,11 @@ class VarianceTests(TestCase):
                               typing.Sequence[Manager])
 
     def test_covariance_mapping(self):
-        # Ditto for Mapping (a generic class with two parameters).
+        # Ditto for Mapping (covariant in the value, invariant in the key).
         assert issubclass(typing.Mapping[Employee, Manager],
                           typing.Mapping[Employee, Employee])
-        assert issubclass(typing.Mapping[Manager, Employee],
-                          typing.Mapping[Employee, Employee])
+        assert not issubclass(typing.Mapping[Manager, Employee],
+                              typing.Mapping[Employee, Employee])
         assert not issubclass(typing.Mapping[Employee, Manager],
                               typing.Mapping[Manager, Manager])
         assert not issubclass(typing.Mapping[Manager, Employee],
index 66bee917d812725fc205e300ffd593782546e523..bc6fcdd03d7cf713276e2b666ff982a25d1d9d96 100644 (file)
@@ -439,7 +439,6 @@ KT = TypeVar('KT')  # Key type.
 VT = TypeVar('VT')  # Value type.
 T_co = TypeVar('T_co', covariant=True)  # Any type covariant containers.
 V_co = TypeVar('V_co', covariant=True)  # Any type covariant containers.
-KT_co = TypeVar('KT_co', covariant=True)  # Key type covariant containers.
 VT_co = TypeVar('VT_co', covariant=True)  # Value type covariant containers.
 T_contra = TypeVar('T_contra', contravariant=True)  # Ditto contravariant.
 
@@ -1308,7 +1307,8 @@ class MutableSet(AbstractSet[T], extra=collections_abc.MutableSet):
     pass
 
 
-class Mapping(Sized, Iterable[KT_co], Container[KT_co], Generic[KT_co, VT_co],
+# NOTE: Only the value type is covariant.
+class Mapping(Sized, Iterable[KT], Container[KT], Generic[KT, VT_co],
               extra=collections_abc.Mapping):
     pass
 
@@ -1378,13 +1378,13 @@ class MappingView(Sized, Iterable[T_co], extra=collections_abc.MappingView):
     pass
 
 
-class KeysView(MappingView[KT_co], AbstractSet[KT_co],
+class KeysView(MappingView[KT], AbstractSet[KT],
                extra=collections_abc.KeysView):
     pass
 
 
-# TODO: Enable Set[Tuple[KT_co, VT_co]] instead of Generic[KT_co, VT_co].
-class ItemsView(MappingView, Generic[KT_co, VT_co],
+# TODO: Enable Set[Tuple[KT, VT_co]] instead of Generic[KT, VT_co].
+class ItemsView(MappingView, Generic[KT, VT_co],
                 extra=collections_abc.ItemsView):
     pass