编写 Python C 扩展:如何正确加载 PyListObject?

发布于 2024-10-18 11:51:03 字数 577 浏览 1 评论 0原文

在尝试读取充满浮点数的 Python 列表并用它们的值填充 real Channels[7] (我使用的是 F2C,所以 real 只是 float 的 typedef)时,我所能做的就是从中检索的是零值。你能指出下面代码中的错误吗?

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
  }
//....
}

While attempting to read a Python list filled with float numbers and to populate real channels[7] with their values (I'm using F2C, so real is just a typedef for float), all I am able to retrieve from it are zero values. Can you point out the error in the code below?

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
  }
//....
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

帅气称霸 2024-10-25 11:51:03

PyList_GetItem 将返回一个 PyObject*。您需要将其转换为 C 可以理解的数字。尝试将您的代码更改为:

printf("%f\n", PyFloat_AsDouble(PyList_GetItem(input, (Py_ssize_t)i)));

PyList_GetItem will return a PyObject*. You need to convert that to a number C understands. Try changing your code to this:

printf("%f\n", PyFloat_AsDouble(PyList_GetItem(input, (Py_ssize_t)i)));
謸气贵蔟 2024-10-25 11:51:03

我在这段代码中看到的东西很少。

  1. 你泄漏了一个引用,不要在开始时创建那个空列表,这是不需要的。
  2. 您不需要转换为 PyListObject
  3. PyList_GetItem 返回一个 PyObject,而不是浮点数。使用 PyFloat_AsDouble 提取值。
  4. 如果PyList_GetItem返回NULL,则抛出异常,您应该检查它。

Few things I see in this code.

  1. You leak a reference, don't create that empty list at the beginning, it's not needed.
  2. You don't need to cast to PyListObject.
  3. PyList_GetItem returns a PyObject, not a float. Use PyFloat_AsDouble to extract the value.
  4. If PyList_GetItem returns NULL, then an exception has been thrown, and you should check for it.
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文