diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-05-05 10:48:06 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-05-05 10:48:06 +0300 |
commit | d2591e5c2de5d4fd02e6a74d0f48d6b0d5050cc4 (patch) | |
tree | 11bf88bc76cf05a874622ded89f7874e45b0eda7 | |
parent | 86c2c4d513f122da86524483f33182189aacf75a (diff) |
IDProp Py API: Add default argument to pop
Match dict.pop behavior.
-rw-r--r-- | source/blender/python/generic/idprop_py_api.c | 44 |
1 files changed, 23 insertions, 21 deletions
diff --git a/source/blender/python/generic/idprop_py_api.c b/source/blender/python/generic/idprop_py_api.c index 164fe656129..c35472026fa 100644 --- a/source/blender/python/generic/idprop_py_api.c +++ b/source/blender/python/generic/idprop_py_api.c @@ -855,7 +855,7 @@ static PyObject *BPy_IDGroup_MapDataToPy(IDProperty *prop) } PyDoc_STRVAR(BPy_IDGroup_pop_doc, -".. method:: pop(key)\n" +".. method:: pop(key, default)\n" "\n" " Remove an item from the group, returning a Python representation.\n" "\n" @@ -863,38 +863,40 @@ PyDoc_STRVAR(BPy_IDGroup_pop_doc, "\n" " :arg key: Name of item to remove.\n" " :type key: string\n" +" :arg default: Value to return when key isn't found, otherwise raise an exception.\n" +" :type default: Undefined\n" ); -static PyObject *BPy_IDGroup_pop(BPy_IDProperty *self, PyObject *value) +static PyObject *BPy_IDGroup_pop(BPy_IDProperty *self, PyObject *args) { IDProperty *idprop; PyObject *pyform; - const char *name = _PyUnicode_AsString(value); - if (!name) { - PyErr_Format(PyExc_TypeError, - "pop expected at least a string argument, not %.200s", - Py_TYPE(value)->tp_name); + char *key; + PyObject *def = NULL; + + if (!PyArg_ParseTuple(args, "s|O:get", &key, &def)) { return NULL; } - idprop = IDP_GetPropertyFromGroup(self->prop, name); - - if (idprop) { - pyform = BPy_IDGroup_MapDataToPy(idprop); - - if (!pyform) { - /* ok something bad happened with the pyobject, - * so don't remove the prop from the group. if pyform is - * NULL, then it already should have raised an exception.*/ + idprop = IDP_GetPropertyFromGroup(self->prop, key); + if (idprop == NULL) { + if (def == NULL) { + PyErr_SetString(PyExc_KeyError, "item not in group"); return NULL; } + return Py_INCREF_RET(def); + } - IDP_RemoveFromGroup(self->prop, idprop); - return pyform; + pyform = BPy_IDGroup_MapDataToPy(idprop); + if (pyform == NULL) { + /* ok something bad happened with the pyobject, + * so don't remove the prop from the group. if pyform is + * NULL, then it already should have raised an exception.*/ + return NULL; } - PyErr_SetString(PyExc_KeyError, "item not in group"); - return NULL; + IDP_RemoveFromGroup(self->prop, idprop); + return pyform; } PyDoc_STRVAR(BPy_IDGroup_iter_items_doc, @@ -1126,7 +1128,7 @@ static PyObject *BPy_IDGroup_get(BPy_IDProperty *self, PyObject *args) } static struct PyMethodDef BPy_IDGroup_methods[] = { - {"pop", (PyCFunction)BPy_IDGroup_pop, METH_O, BPy_IDGroup_pop_doc}, + {"pop", (PyCFunction)BPy_IDGroup_pop, METH_VARARGS, BPy_IDGroup_pop_doc}, {"iteritems", (PyCFunction)BPy_IDGroup_iter_items, METH_NOARGS, BPy_IDGroup_iter_items_doc}, {"keys", (PyCFunction)BPy_IDGroup_keys, METH_NOARGS, BPy_IDGroup_keys_doc}, {"values", (PyCFunction)BPy_IDGroup_values, METH_NOARGS, BPy_IDGroup_values_doc}, |