]> granicus.if.org Git - python/commitdiff
Fix defect in __ixor__ which would get the wrong
authorRaymond Hettinger <python@rcn.com>
Thu, 31 Jan 2008 01:38:15 +0000 (01:38 +0000)
committerRaymond Hettinger <python@rcn.com>
Thu, 31 Jan 2008 01:38:15 +0000 (01:38 +0000)
answer if the input iterable had a duplicate element
(two calls to toggle() reverse each other).  Borrow
the correct code from sets.py.

Lib/_abcoll.py

index e1e65106ceaab86857492d7453bf3addacf8c439..75a807252827ebd50233758c5b8e517292cc0003 100644 (file)
@@ -266,16 +266,6 @@ class MutableSet(Set):
         self.discard(value)
         return value
 
-    def toggle(self, value):
-        """Return True if it was added, False if deleted."""
-        # XXX This implementation is not thread-safe
-        if value in self:
-            self.discard(value)
-            return False
-        else:
-            self.add(value)
-            return True
-
     def clear(self):
         """This is slow (creates N new iterators!) but effective."""
         try:
@@ -296,10 +286,13 @@ class MutableSet(Set):
         return self
 
     def __ixor__(self, it):
-        # This calls toggle(), so if that is overridded, we call the override
+        if not isinstance(it, Set):
+            it = self._from_iterable(it)
         for value in it:
-            self.toggle(it)
-        return self
+            if value in self:
+                self.discard(value)
+            else:
+                self.add(value)
 
     def __isub__(self, it):
         for value in it: