的文档PyList_New
说在列表完全初始化之前这两个 API 是安全的:PyList_SetItem()
和PyList_SET_ITEM()
。但如果在初始化列表的过程中发生错误,我该怎么办?
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;
你
Py_DECREF
它。列表项本身被减少
Py_XDECREF
以解释它们可能是 的可能性NULL
。有关当前实现,请参阅https://github.com/python/cpython/blob/bb594e801b6a84823badbb85b88f0fc8b221d7bf/Objects/listobject.c#L509 。