mirror of https://github.com/python/cpython
Issue #16373: Prevent infinite recursion for ABC Set class operations.
This commit is contained in:
parent
eda1f4cf07
commit
bcac6ad1f3
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue