Commit 7c573857 authored by Serhiy Storchaka's avatar Serhiy Storchaka

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

parent d919da99
......@@ -165,12 +165,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):
......
......@@ -594,6 +594,35 @@ 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()
self.assertFalse(ncs < cs)
self.assertFalse(ncs <= cs)
self.assertFalse(cs > ncs)
self.assertFalse(cs >= ncs)
def test_Mapping(self):
for sample in [dict]:
self.assertIsInstance(sample(), Mapping)
......
......@@ -15,6 +15,8 @@ Core and Builtins
Library
-------
- Issue #16373: Prevent infinite recursion for ABC Set class comparisons.
- Issue #19138: doctest's IGNORE_EXCEPTION_DETAIL now allows a match when
no exception detail exists (no colon following the exception's name, or
a colon does follow but no text follows the colon).
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment