diff options
author | Guido van Rossum <guido@python.org> | 2000-08-08 16:12:54 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 2000-08-08 16:12:54 (GMT) |
commit | 164452cec416fbe032c1173d58ad89adab38820b (patch) | |
tree | dc5b8769a82ffc778d27a8e0679bda4c5125100e | |
parent | 2b042ded19bc7efa43551da297c29dc142b7d73c (diff) | |
download | cpython-164452cec416fbe032c1173d58ad89adab38820b.zip cpython-164452cec416fbe032c1173d58ad89adab38820b.tar.gz cpython-164452cec416fbe032c1173d58ad89adab38820b.tar.bz2 |
Barry's patch to implement the new setdefault() method.
-rw-r--r-- | Lib/UserDict.py | 4 | ||||
-rw-r--r-- | Objects/dictobject.c | 36 |
2 files changed, 40 insertions, 0 deletions
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 */ }; |