Написание расширения Python C: как правильно загрузить PyListObject? - PullRequest
2 голосов
/ 22 февраля 2011

При попытке прочитать список 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 ]

3 голосов
/ 22 февраля 2011

PyList_GetItem вернет PyObject*.Вы должны преобразовать это число C понимает.Попробуйте изменить свой код на это:

printf("%f\n", PyFloat_AsDouble(PyList_GetItem(input, (Py_ssize_t)i)));
2 голосов
/ 22 февраля 2011

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

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