diff -r 8c49f7fbba1d Objects/listobject.c --- a/Objects/listobject.c Tue Apr 19 09:47:16 2011 +0200 +++ b/Objects/listobject.c Tue Apr 19 16:16:33 2011 +0200 @@ -2209,6 +2209,41 @@ return NULL; } +static PyObject * +listget(PyListObject *self, PyObject *args) +{ + PyObject *index; + PyObject *default_; + PyObject *value; + + if (!PyArg_ParseTuple(args, "OO:get", &index, &default_)) + return NULL; + if (PyIndex_Check(index)) { + Py_ssize_t i; + i = PyNumber_AsSsize_t(index, PyExc_IndexError); + if (i == -1 && PyErr_Occurred()) + return NULL; + if (i < 0) + i += PyList_GET_SIZE(self); + value = list_item(self, i); + if (!value){ + PyErr_Clear(); + Py_INCREF(default_); + return default_; + } + else { + Py_INCREF(value); + return value; + } + } + else { + PyErr_Format(PyExc_TypeError, + "list indices must be integers, not %.200s", + index->ob_type->tp_name); + return NULL; + } +} + static int list_traverse(PyListObject *o, visitproc visit, void *arg) { @@ -2362,6 +2397,9 @@ "L.reverse() -- reverse *IN PLACE*"); PyDoc_STRVAR(sort_doc, "L.sort(key=None, reverse=False) -- stable sort *IN PLACE*"); +PyDoc_STRVAR(get_doc, +"L.get(index, default) -- return L[index] if index < len(L) and default \n" +"otherwise."); static PyObject *list_subscript(PyListObject*, PyObject*); @@ -2380,6 +2418,7 @@ {"count", (PyCFunction)listcount, METH_O, count_doc}, {"reverse", (PyCFunction)listreverse, METH_NOARGS, reverse_doc}, {"sort", (PyCFunction)listsort, METH_VARARGS | METH_KEYWORDS, sort_doc}, + {"get", (PyCFunction)listget, METH_VARARGS, get_doc}, {NULL, NULL} /* sentinel */ };