Написание расширения Python C: как правильно загрузить PyListObject?
При попытке прочитать список Python, заполненный числами с плавающей точкой и заполнить real channels[7]
с их значениями (я использую F2C, так что real это просто typedef для float), все, что я могу извлечь из него, это нулевые значения. Можете ли вы указать на ошибку в коде ниже?
static PyObject *orbital_spectra(PyObject *self, PyObject *args) {
PyListObject *input = (PyListObject*)PyList_New(0);
real channels[7], coefficients[7], values[240];
int i;
if (!PyArg_ParseTuple(args, "O!", &PyList_Type, &input)) {
return NULL;
}
for (i = 0; i < PyList_Size(input); i++) {
printf("%f\n", PyList_GetItem(input, (Py_ssize_t)i)); // <--- Prints zeros
}
//....
}
2 ответа
Решение
PyList_GetItem
вернет PyObject*
, Вы должны преобразовать это число C понимает. Попробуйте изменить свой код на это:
printf("%f\n", PyFloat_AsDouble(PyList_GetItem(input, (Py_ssize_t)i)));
Мало что я вижу в этом коде.
- Вы теряете ссылку, не создавайте этот пустой список в начале, он не нужен.
- Вам не нужно бросать на
PyListObject
, PyList_GetItem
возвращаетPyObject
не поплавок. использованиеPyFloat_AsDouble
извлечь значение.- Если
PyList_GetItem
возвращаетсяNULL
, тогда было сгенерировано исключение, и вы должны проверить его.