Этот вопрос довольно прост, но поможет укрепить мое понимание. Я знаю, что аргументы функций расширения C гарантированно будут живыми ссылками на протяжении всего кода C (если только вручную не DECREF). Однако, если у меня есть код расширения C, который возвращает PyObject*, присутствующий в списке его аргументов, нужно ли мне добавлять аргумент INCREF перед его возвратом? То есть, какой из следующих двух правилен:
static PyObject return_item(PyObject *self, PyObject *item)
{
// manipulate item
return item;
}
or
static PyObject return_item(PyObject *self, PyObject *item)
{
// manipulate item
Py_INCREF(item);
return item;
}
На основе https://docs.python.org/3/extending/extending.html#ownership-rules, в котором говорится
Ссылка на объект, возвращаемая из функции C, которая вызывается из Python, должна быть ссылкой в собственности — право собственности передается от функции к вызывающей стороне.
и Возврат объектов в Python из C Я предполагаю, что это последнее (INCREFing - это да ладно) но я хочу быть уверен.