From: Guido van Rossum Date: Tue, 8 Aug 2000 16:12:54 +0000 (+0000) Subject: Barry's patch to implement the new setdefault() method. X-Git-Tag: v2.0b1~539 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=164452cec416fbe032c1173d58ad89adab38820b;p=python Barry's patch to implement the new setdefault() method. --- diff --git a/Lib/UserDict.py b/Lib/UserDict.py index 3c48415771..9b6e73b50f 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 4fafb8a963..ddd8eb8b69 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -949,6 +949,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) { @@ -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 */ };