summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaymond Hettinger <python@rcn.com>2005-08-13 02:29:58 (GMT)
committerRaymond Hettinger <python@rcn.com>2005-08-13 02:29:58 (GMT)
commit038ca2a5516f6b445a8548f3999d1db3b6b8abb1 (patch)
tree3359f325b2eb27e8ed326bdac148d0de7ff62387
parentf98e6b15bab7efb786ab65db63146afea388b022 (diff)
downloadcpython-038ca2a5516f6b445a8548f3999d1db3b6b8abb1.zip
cpython-038ca2a5516f6b445a8548f3999d1db3b6b8abb1.tar.gz
cpython-038ca2a5516f6b445a8548f3999d1db3b6b8abb1.tar.bz2
Teach the sets module to correctly compute s-=s and s^=s as the empty set.
-rw-r--r--Lib/sets.py4
-rw-r--r--Lib/test/test_sets.py13
2 files changed, 17 insertions, 0 deletions
diff --git a/Lib/sets.py b/Lib/sets.py
index 8ec7e2f..32a0dd6 100644
--- a/Lib/sets.py
+++ b/Lib/sets.py
@@ -480,6 +480,8 @@ class Set(BaseSet):
value = True
if not isinstance(other, BaseSet):
other = Set(other)
+ if self is other:
+ self.clear()
for elt in other:
if elt in data:
del data[elt]
@@ -497,6 +499,8 @@ class Set(BaseSet):
data = self._data
if not isinstance(other, BaseSet):
other = Set(other)
+ if self is other:
+ self.clear()
for elt in ifilter(data.has_key, other):
del data[elt]
diff --git a/Lib/test/test_sets.py b/Lib/test/test_sets.py
index c5a48b1..ff834e0 100644
--- a/Lib/test/test_sets.py
+++ b/Lib/test/test_sets.py
@@ -243,6 +243,19 @@ class TestBinaryOps(unittest.TestCase):
self.assertRaises(TypeError, cmp, a, 12)
self.assertRaises(TypeError, cmp, "abc", a)
+ def test_inplace_on_self(self):
+ t = self.set.copy()
+ t |= t
+ self.assertEqual(t, self.set)
+ t &= t
+ self.assertEqual(t, self.set)
+ t -= t
+ self.assertEqual(len(t), 0)
+ t = self.set.copy()
+ t ^= t
+ self.assertEqual(len(t), 0)
+
+
#==============================================================================
class TestUpdateOps(unittest.TestCase):