mirror of
https://github.com/python/cpython.git
synced 2025-10-17 12:18:23 +00:00
SF bug 693121: Set == non-Set is a TypeError.
Allow mixed-type __eq__ and __ne__ for Set objects. This is messier than I'd like because Set *also* implements __cmp__. I know of one glitch now: cmp(s, t) returns 0 now when s and t are both Sets and s == t, despite that Set.__cmp__ unconditionally raises TypeError (and by intent). The rub is that __eq__ gets tried first, and the x.__eq__(y) True result convinces Python that cmp(x, y) is 0 without even calling Set.__cmp__.
This commit is contained in:
parent
3ba491e6b1
commit
44f14b0399
3 changed files with 61 additions and 23 deletions
|
@ -232,7 +232,16 @@ class TestBinaryOps(unittest.TestCase):
|
|||
|
||||
def test_cmp(self):
|
||||
a, b = Set('a'), Set('b')
|
||||
self.assertRaises(TypeError, cmp, (a,b))
|
||||
self.assertRaises(TypeError, cmp, a, b)
|
||||
|
||||
# You can view this as a buglet: cmp(a, a) does not raise TypeError,
|
||||
# because __eq__ is tried before __cmp__, and a.__eq__(a) returns,
|
||||
# which Python thinks is good enough to synthesize a cmp() result
|
||||
# without calling __cmp__.
|
||||
self.assertEqual(cmp(a, a), 0)
|
||||
|
||||
self.assertRaises(TypeError, cmp, a, 12)
|
||||
self.assertRaises(TypeError, cmp, "abc", a)
|
||||
|
||||
#==============================================================================
|
||||
|
||||
|
@ -476,17 +485,19 @@ class TestSubsetNonOverlap(TestSubsets):
|
|||
|
||||
class TestOnlySetsInBinaryOps(unittest.TestCase):
|
||||
|
||||
def test_cmp(self):
|
||||
try:
|
||||
self.other == self.set
|
||||
self.fail("expected TypeError")
|
||||
except TypeError:
|
||||
pass
|
||||
try:
|
||||
self.set != self.other
|
||||
self.fail("expected TypeError")
|
||||
except TypeError:
|
||||
pass
|
||||
def test_eq_ne(self):
|
||||
# Unlike the others, this is testing that == and != *are* allowed.
|
||||
self.assertEqual(self.other == self.set, False)
|
||||
self.assertEqual(self.set == self.other, False)
|
||||
self.assertEqual(self.other != self.set, True)
|
||||
self.assertEqual(self.set != self.other, True)
|
||||
|
||||
def test_ge_gt_lt_le(self):
|
||||
# Unlike the others, this is testing that == and != *are* allowed.
|
||||
self.assertRaises(TypeError, lambda: self.set < self.other)
|
||||
self.assertRaises(TypeError, lambda: self.set <= self.other)
|
||||
self.assertRaises(TypeError, lambda: self.set > self.other)
|
||||
self.assertRaises(TypeError, lambda: self.set >= self.other)
|
||||
|
||||
def test_union_update(self):
|
||||
try:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue