From: Barry Warsaw Date: Mon, 6 Oct 1997 17:49:20 +0000 (+0000) Subject: dict_get(): New method for item access with different semantics than X-Git-Tag: v1.5a4~77 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c38c5da5d0ce35442e859d64e6cfa734688a470e;p=python dict_get(): New method for item access with different semantics than __getitem__(). This method never raises an exception; if the key is not in the dictionary, the second (optional) argument is returned. If the second argument is not provided and the key is missing, None is returned. mapp_methods: added "get" method. --- diff --git a/Objects/dictobject.c b/Objects/dictobject.c index 3362655b4c..e5a461031e 100644 --- a/Objects/dictobject.c +++ b/Objects/dictobject.c @@ -952,6 +952,43 @@ dict_has_key(mp, args) return PyInt_FromLong(ok); } +static PyObject * +dict_get(mp, args) + register dictobject *mp; + PyObject *args; +{ + PyObject *key; + PyObject *failobj = NULL; + PyObject *val = NULL; + long hash; + + if (mp->ma_table == NULL) + goto finally; + + if (!PyArg_ParseTuple(args, "O|O", &key, &failobj)) + return NULL; + + if (failobj == NULL) + failobj = Py_None; + +#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; + Py_INCREF(val); + return val; +} + + static PyObject * dict_clear(mp, args) register dictobject *mp; @@ -972,6 +1009,7 @@ static PyMethodDef mapp_methods[] = { {"update", (PyCFunction)dict_update}, {"clear", (PyCFunction)dict_clear}, {"copy", (PyCFunction)dict_copy}, + {"get", (PyCFunction)dict_get, 1}, {NULL, NULL} /* sentinel */ };