Как вернуть кортеж, содержащий значение None из C API?
Как правильно вернуть кортеж, содержащий значение None из расширения C в Python? Я знаю, что одно значение None может быть создано с помощью
result = Py_BuildValue("");
И что кортеж может быть создан с помощью чего-то вроде
result = Py_BuildValue("(ii)", 123, 456);
Но я не вижу способа объединить это, чтобы получить, например, кортеж, содержащий собственное целое число и значение None.2 ответа:
В Python есть только один объект
None, и вы всегда можете ссылаться на него в C какPy_None.Код...
result = Py_BuildValue("");...просто увеличивает количество ссылок
Py_Noneи возвращает его указатель, так что это то же самое, что...Py_INCREF(Py_None); result = Py_None;Если вы просто хотите вернуть
None, то используйте...Py_INCREF(Py_None); return Py_None;...или, начиная с Python 2.4, вы можете сделать то же самое с макросом...
Py_RETURN_NONE;Если вы возвращаете его в кортеже, как это...
return Py_BuildValue("(O)", Py_None);...нет необходимо увеличить количество ссылок -
Но если вы вернете его в таком кортеже, как этот...Py_BuildValue()делает это для тебя.PyObject* tuple = PyTuple_New(1); Py_INCREF(Py_None); PyTuple_SetItem(tuple, 0, Py_None); return tuple;...затем вы должны увеличить количество ссылок, потому что
PyTuple_SetItem()не делает этого для тебя.