Issue #16373: Prevent infinite recursion for ABC Set class operations.

This commit is contained in:
Andrew Svetlov 2012-11-01 13:28:54 +02:00
parent eda1f4cf07
commit bcac6ad1f3
2 changed files with 35 additions and 2 deletions

View File

@ -184,12 +184,12 @@ class Set(Sized, Iterable, Container):
def __gt__(self, other):
if not isinstance(other, Set):
return NotImplemented
return other < self
return other.__lt__(self)
def __ge__(self, other):
if not isinstance(other, Set):
return NotImplemented
return other <= self
return other.__le__(self)
def __eq__(self, other):
if not isinstance(other, Set):

View File

@ -651,6 +651,39 @@ class TestCollectionABCs(ABCTestCase):
s |= s
self.assertEqual(s, full)
def test_issue16373(self):
# Recursion error comparing comparable and noncomparable
# Set instances
class MyComparableSet(Set):
def __contains__(self, x):
return False
def __len__(self):
return 0
def __iter__(self):
return iter([])
class MyNonComparableSet(Set):
def __contains__(self, x):
return False
def __len__(self):
return 0
def __iter__(self):
return iter([])
def __le__(self, x):
return NotImplemented
def __lt__(self, x):
return NotImplemented
cs = MyComparableSet()
ncs = MyNonComparableSet()
with self.assertRaises(TypeError):
ncs < cs
with self.assertRaises(TypeError):
ncs <= cs
with self.assertRaises(TypeError):
cs > ncs
with self.assertRaises(TypeError):
cs >= ncs
def test_Mapping(self):
for sample in [dict]:
self.assertIsInstance(sample(), Mapping)