Refactor set.discard() and set.remove().

This commit is contained in:
Raymond Hettinger 2003-12-13 18:53:18 +00:00
parent 6a8bbdbe7b
commit 0deab62704

View file

@ -777,21 +777,19 @@ This has no effect if the element is already present.");
static PyObject * static PyObject *
set_remove(PySetObject *so, PyObject *item) set_remove(PySetObject *so, PyObject *item)
{ {
PyObject *tmp; PyObject *tmp, *result;
if (PyDict_DelItem(so->data, item) == -1) { if (PyType_IsSubtype(item->ob_type, &PySet_Type)) {
if (!PyType_IsSubtype(item->ob_type, &PySet_Type))
return NULL;
PyErr_Clear();
tmp = frozenset_dict_wrapper(((PySetObject *)(item))->data); tmp = frozenset_dict_wrapper(((PySetObject *)(item))->data);
if (tmp == NULL) if (tmp == NULL)
return NULL; return NULL;
if (PyDict_DelItem(so->data, tmp) == -1) { result = set_remove(so, tmp);
Py_DECREF(tmp); Py_DECREF(tmp);
return result;
}
if (PyDict_DelItem(so->data, item) == -1)
return NULL; return NULL;
}
Py_DECREF(tmp);
}
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
} }
@ -804,28 +802,21 @@ If the element is not a member, raise a KeyError.");
static PyObject * static PyObject *
set_discard(PySetObject *so, PyObject *item) set_discard(PySetObject *so, PyObject *item)
{ {
PyObject *tmp; PyObject *tmp, *result;
if (PyDict_DelItem(so->data, item) == -1) { if (PyType_IsSubtype(item->ob_type, &PySet_Type)) {
if (PyErr_ExceptionMatches(PyExc_KeyError))
PyErr_Clear();
else {
if (!PyType_IsSubtype(item->ob_type, &PySet_Type))
return NULL;
PyErr_Clear();
tmp = frozenset_dict_wrapper(((PySetObject *)(item))->data); tmp = frozenset_dict_wrapper(((PySetObject *)(item))->data);
if (tmp == NULL) if (tmp == NULL)
return NULL; return NULL;
if (PyDict_DelItem(so->data, tmp) == -1) { result = set_discard(so, tmp);
if (PyErr_ExceptionMatches(PyExc_KeyError))
PyErr_Clear();
else {
Py_DECREF(tmp); Py_DECREF(tmp);
return result;
}
if (PyDict_DelItem(so->data, item) == -1) {
if (!PyErr_ExceptionMatches(PyExc_KeyError))
return NULL; return NULL;
} PyErr_Clear();
}
Py_DECREF(tmp);
}
} }
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;