From: Raymond Hettinger Date: Thu, 31 Jan 2008 01:38:15 +0000 (+0000) Subject: Fix defect in __ixor__ which would get the wrong X-Git-Tag: v2.6a1~334 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e67420d72e26d976af2c8cd8603f2dfe158b6d24;p=python Fix defect in __ixor__ which would get the wrong answer if the input iterable had a duplicate element (two calls to toggle() reverse each other). Borrow the correct code from sets.py. --- diff --git a/Lib/_abcoll.py b/Lib/_abcoll.py index e1e65106ce..75a8072528 100644 --- a/Lib/_abcoll.py +++ b/Lib/_abcoll.py @@ -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: