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

This commit is contained in:
Serhiy Storchaka 2013-12-06 23:23:15 +02:00
parent d919da9942
commit 7c573857c7
3 changed files with 33 additions and 2 deletions

View File

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

View File

@ -594,6 +594,35 @@ class TestCollectionABCs(ABCTestCase):
s |= s s |= s
self.assertEqual(s, full) 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()
self.assertFalse(ncs < cs)
self.assertFalse(ncs <= cs)
self.assertFalse(cs > ncs)
self.assertFalse(cs >= ncs)
def test_Mapping(self): def test_Mapping(self):
for sample in [dict]: for sample in [dict]:
self.assertIsInstance(sample(), Mapping) self.assertIsInstance(sample(), Mapping)

View File

@ -15,6 +15,8 @@ Core and Builtins
Library Library
------- -------
- Issue #16373: Prevent infinite recursion for ABC Set class comparisons.
- Issue #19138: doctest's IGNORE_EXCEPTION_DETAIL now allows a match when - Issue #19138: doctest's IGNORE_EXCEPTION_DETAIL now allows a match when
no exception detail exists (no colon following the exception's name, or no exception detail exists (no colon following the exception's name, or
a colon does follow but no text follows the colon). a colon does follow but no text follows the colon).