Commit d78b9dcb authored by Amaury Forgeot d'Arc's avatar Amaury Forgeot d'Arc

#4069: aSet.remove(otherSet) would always report the empty frozenset([]) as the missing key.

Now it correctly refers to the initial otherset.

Reviewed by Raymond. Will backport to 2.6.
parent 39defbe6
......@@ -382,6 +382,17 @@ class TestSet(TestJointOps):
else:
self.fail()
def test_remove_keyerror_set(self):
key = self.thetype([3, 4])
try:
self.s.remove(key)
except KeyError as e:
self.assert_(e.args[0] is key,
"KeyError should be {0}, not {1}".format(key,
e.args[0]))
else:
self.fail()
def test_discard(self):
self.s.discard('a')
self.assert_('a' not in self.s)
......
......@@ -12,6 +12,11 @@ What's New in Python 2.7 alpha 1
Core and Builtins
-----------------
- Issue #4069: When set.remove(element) is used with a set element, the element
is temporarily replaced with an equivalent frozenset. But the eventual
KeyError would always report the empty frozenset([]) as the missing key. Now
it correctly refers to the initial element.
Library
-------
......
......@@ -1874,7 +1874,7 @@ PyDoc_STRVAR(contains_doc, "x.__contains__(y) <==> y in x.");
static PyObject *
set_remove(PySetObject *so, PyObject *key)
{
PyObject *tmpkey, *result;
PyObject *tmpkey;
int rv;
rv = set_discard_key(so, key);
......@@ -1886,11 +1886,14 @@ set_remove(PySetObject *so, PyObject *key)
if (tmpkey == NULL)
return NULL;
set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
result = set_remove(so, tmpkey);
rv = set_discard_key(so, tmpkey);
set_swap_bodies((PySetObject *)tmpkey, (PySetObject *)key);
Py_DECREF(tmpkey);
return result;
} else if (rv == DISCARD_NOTFOUND) {
if (rv == -1)
return NULL;
}
if (rv == DISCARD_NOTFOUND) {
set_key_error(key);
return NULL;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment