Написание расширения 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)));

Мало что я вижу в этом коде.

  1. Вы теряете ссылку, не создавайте этот пустой список в начале, он не нужен.
  2. Вам не нужно бросать на PyListObject,
  3. PyList_GetItem возвращает PyObjectне поплавок. использование PyFloat_AsDouble извлечь значение.
  4. Если PyList_GetItem возвращается NULL, тогда было сгенерировано исключение, и вы должны проверить его.
Другие вопросы по тегам