diff -r 97ce83671ec1 Lib/_abcoll.py --- a/Lib/_abcoll.py Fri Jul 23 10:17:15 2010 +0300 +++ b/Lib/_abcoll.py Mon Jul 26 07:22:41 2010 +0300 @@ -404,6 +404,11 @@ def __iter__(self): for key in self._mapping: yield key + + @classmethod + def _from_iterable(self, it): + return set(it) + KeysView.register(dict_keys) @@ -422,6 +427,10 @@ def __iter__(self): for key in self._mapping: yield (key, self._mapping[key]) + + @classmethod + def _from_iterable(self, it): + return set(it) ItemsView.register(dict_items) diff -r 97ce83671ec1 Lib/test/test_collections.py --- a/Lib/test/test_collections.py Fri Jul 23 10:17:15 2010 +0300 +++ b/Lib/test/test_collections.py Mon Jul 26 07:22:41 2010 +0300 @@ -531,13 +531,41 @@ return iter(()) self.validate_comparison(MyMapping()) - def test_MutableMapping(self): + def test_MutableMapping_types(self): for sample in [dict]: self.assertIsInstance(sample(), MutableMapping) self.assertTrue(issubclass(sample, MutableMapping)) self.validate_abstract_methods(MutableMapping, '__contains__', '__iter__', '__len__', '__getitem__', '__setitem__', '__delitem__') + class MySimpleMapping(MutableMapping): + def __init__(self, *args, **kw): + self.inner = dict(*args, **kw) + def __contains__(self, item): + return item in self.inner + def __iter__(self): + return iter(self.inner) + def __len__(self): + return len(self.inner) + def __getitem__(self, index): + return self.inner[index] + def __setitem__(self, key, value): + self.inner[key] = value + def __delitem__(self, key): + del self.inner[key] + + def test_MutableMapping_subclass(self): + map = self.MySimpleMapping() + map['red'] = 5 + y = map.keys() + self.assertIsInstance(y, Set) + z = map.keys() | {'orange'} + self.assertIsInstance(z, set) + + # Shouldn't affect 'z' + map['blue'] = 7 + self.assertEqual(list(z), ['orange', 'red']) + def test_Sequence(self): for sample in [tuple, list, bytes, str]: self.assertIsInstance(sample(), Sequence)