From 164452cec416fbe032c1173d58ad89adab38820b Mon Sep 17 00:00:00 2001 From: Guido van Rossum Date: Tue, 8 Aug 2000 16:12:54 +0000 Subject: Barry's patch to implement the new setdefault() method. --- Lib/UserDict.py | 4 ++++ Objects/dictobject.c | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/Lib/UserDict.py b/Lib/UserDict.py index 3c48415..9b6e73b 100644 --- a/Lib/UserDict.py +++ b/Lib/UserDict.py @@ -34,3 +34,7 @@ class UserDict: self.data[k] = v def get(self, key, failobj=None): return self.data.get(key, failobj) + def setdefault(self, key, failobj=None): + if not self.data.has_key(key): + self.data[key] = failobj + return self.data[key] diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 4fafb8a..ddd8eb8 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -950,6 +950,41 @@ dict_get(register dictobject *mp, PyObject *args) static PyObject * +dict_setdefault(register dictobject *mp, PyObject *args) +{ + PyObject *key; + PyObject *failobj = Py_None; + PyObject *val = NULL; + long hash; + + if (!PyArg_ParseTuple(args, "O|O:setdefault", &key, &failobj)) + return NULL; + if (mp->ma_table == NULL) + goto finally; + +#ifdef CACHE_HASH + if (!PyString_Check(key) || + (hash = ((PyStringObject *) key)->ob_shash) == -1) +#endif + { + hash = PyObject_Hash(key); + if (hash == -1) + return NULL; + } + val = lookdict(mp, key, hash)->me_value; + + finally: + if (val == NULL) { + val = failobj; + if (PyDict_SetItem((PyObject*)mp, key, failobj)) + val = NULL; + } + Py_XINCREF(val); + return val; +} + + +static PyObject * dict_clear(register dictobject *mp, PyObject *args) { if (!PyArg_NoArgs(args)) @@ -993,6 +1028,7 @@ static PyMethodDef mapp_methods[] = { {"clear", (PyCFunction)dict_clear}, {"copy", (PyCFunction)dict_copy}, {"get", (PyCFunction)dict_get, METH_VARARGS}, + {"setdefault", (PyCFunction)dict_setdefault, METH_VARARGS}, {NULL, NULL} /* sentinel */ }; -- cgit v0.12