Issue #9214: Fix set operations on KeysView and ItemsView.

This commit is contained in:
Raymond Hettinger 2010-08-22 07:44:24 +00:00
parent a52bae7521
commit 9117c75148
3 changed files with 37 additions and 1 deletions

View File

@ -393,6 +393,10 @@ class MappingView(Sized):
class KeysView(MappingView, Set):
@classmethod
def _from_iterable(self, it):
return set(it)
def __contains__(self, key):
return key in self._mapping
@ -405,6 +409,10 @@ KeysView.register(dict_keys)
class ItemsView(MappingView, Set):
@classmethod
def _from_iterable(self, it):
return set(it)
def __contains__(self, item):
key, value = item
try:

View File

@ -13,7 +13,7 @@ import sys
from collections import Hashable, Iterable, Iterator
from collections import Sized, Container, Callable
from collections import Set, MutableSet
from collections import Mapping, MutableMapping
from collections import Mapping, MutableMapping, KeysView, ItemsView, UserDict
from collections import Sequence, MutableSequence
from collections import ByteString
@ -548,6 +548,31 @@ class TestCollectionABCs(ABCTestCase):
self.validate_abstract_methods(MutableMapping, '__contains__', '__iter__', '__len__',
'__getitem__', '__setitem__', '__delitem__')
def test_MutableMapping_subclass(self):
# Test issue 9214
mymap = UserDict()
mymap['red'] = 5
self.assertIsInstance(mymap.keys(), Set)
self.assertIsInstance(mymap.keys(), KeysView)
self.assertIsInstance(mymap.items(), Set)
self.assertIsInstance(mymap.items(), ItemsView)
mymap = UserDict()
mymap['red'] = 5
z = mymap.keys() | {'orange'}
self.assertIsInstance(z, set)
list(z)
mymap['blue'] = 7 # Shouldn't affect 'z'
self.assertEqual(sorted(z), ['orange', 'red'])
mymap = UserDict()
mymap['red'] = 5
z = mymap.items() | {('orange', 3)}
self.assertIsInstance(z, set)
list(z)
mymap['blue'] = 7 # Shouldn't affect 'z'
self.assertEqual(sorted(z), [('orange', 3), ('red', 5)])
def test_Sequence(self):
for sample in [tuple, list, bytes, str]:
self.assertIsInstance(sample(), Sequence)

View File

@ -66,6 +66,9 @@ Core and Builtins
Extensions
----------
- Issue #9214: Set operations on a KeysView or ItemsView in collections
now correctly return a set. (Patch by Eli Bendersky.)
- Issue #5737: Add Solaris-specific mnemonics in the errno module. Patch by
Matthew Ahrens.