A documentação para PyList_New
diz que essas duas APIs são seguras antes que a lista seja totalmente inicializada: PyList_SetItem()
e PyList_SET_ITEM()
. Mas se um erro acontecer no meio da inicialização da lista, o que devo fazer?
PyObject* my_list = PyList_New(count);
if (!my_list) {
return PyErr_NoMemory();
}
for (int i = 0; i < count; i++) {
PyObject* element = _function_may_set_exc_and_return_null();
if (!element) {
// what to do here??
return NULL;
}
PyList_SET_ITEM(my_list, i, element);
}
return my_list;
Você
Py_DECREF
é isso.Os itens da lista são eles próprios decrefificados
Py_XDECREF
para levar em conta a possibilidade de que eles possam serNULL
. Veja https://github.com/python/cpython/blob/bb594e801b6a84823badbb85b88f0fc8b221d7bf/Objects/listobject.c#L509 para a implementação atual.