Skip to content

Commit a3ecfb2

Browse files
author
raymond.hettinger
committed
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. git-svn-id: http://svn.python.org/projects/python/trunk@60469 6015fed2-1504-0410-9fe1-9d1591cc4771
1 parent 5e1cfe2 commit a3ecfb2

1 file changed

Lines changed: 6 additions & 13 deletions

File tree

Lib/_abcoll.py

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -266,16 +266,6 @@ def pop(self):
266266
self.discard(value)
267267
return value
268268

269-
def toggle(self, value):
270-
"""Return True if it was added, False if deleted."""
271-
# XXX This implementation is not thread-safe
272-
if value in self:
273-
self.discard(value)
274-
return False
275-
else:
276-
self.add(value)
277-
return True
278-
279269
def clear(self):
280270
"""This is slow (creates N new iterators!) but effective."""
281271
try:
@@ -296,10 +286,13 @@ def __iand__(self, c):
296286
return self
297287

298288
def __ixor__(self, it):
299-
# This calls toggle(), so if that is overridded, we call the override
289+
if not isinstance(it, Set):
290+
it = self._from_iterable(it)
300291
for value in it:
301-
self.toggle(it)
302-
return self
292+
if value in self:
293+
self.discard(value)
294+
else:
295+
self.add(value)
303296

304297
def __isub__(self, it):
305298
for value in it:

0 commit comments

Comments
 (0)