gpt4 book ai didi

python - `PyTuple_Pack` 段错误

转载 作者:太空宇宙 更新时间:2023-11-03 14:42:44 28 4
gpt4 key购买 nike

我在 Python 扩展模块中有一个函数 foo,它应该向 Python 返回一个整数元组。这可以使用 Py_BuildValue 轻松完成:

static PyObject* 
foo(PyObject* self, PyObject* args)
{
int a = 0;
int b = 0;

/* calculations and stuff */

PyObject* out = Py_BuildValue("(iii)", a, b, a+b);
Py_INCREF(out);

return out;
}

我想使用 PyTuple_Pack 而不是 Py_BuildValue,它确保返回值确实是一个元组。

Python C API documentation表示 PyTuple_Pack(3, a, b, a+b) 等同于 Py_BuildValue("(iii)", a, b, a+b)。这两个函数都返回类型为 PyPbject* 的新引用。

因此,根据上面的代码,

static PyObject* 
foo(PyObject* self, PyObject* args)
{
/* ... */

PyObject* out = PyTuple_Pack(3, a, b, a+b);
Py_INCREF(out);

return out;
}

应该可以解决问题,但事实并非如此。相反,我得到了一个段错误。我在这里缺少什么?

最佳答案

区别在于:

  • Py_BuildValue("(ii)", a, b)期待 ab是简单的 C-int 值。
  • PyTuple_Pack(2, a, b)期待 ab已经PyObject s(而不是 C-int)。

documentation说:

The tuple values are initialized to the subsequent n C arguments pointing to Python objects. PyTuple_Pack(2, a, b) is equivalent to Py_BuildValue("(OO)", a, b).

为了使用PyTuple_Pack您需要先将 int 值转换为 Python 整数。

使用起来更简单Py_BuildValue() .如果您将格式字符串括在 Py_BuildValue 中,结果将是一个元组:

Py_BuildValue() does not always build a tuple. It builds a tuple only if its format string contains two or more format units. If the format string is empty, it returns None; if it contains exactly one format unit, it returns whatever object is described by that format unit. To force it to return a tuple of size 0 or one, parenthesize the format string.

这意味着:如果您从至少两个元素构造一个元组,则无需担心:

Py_BuildValue("ii", a, b)   # returns a tuple
Py_BuildValue("(ii)", a, b) # returns a tuple

如果只有一个元素就不一样了:

Py_BuildValue("i", a)    # returns an integer
# parenthesized:
Py_BuildValue("(i)", a) # returns a tuple with an integer

或者根本没有元素:

Py_BuildValue("")    # returns None
# parenthesized:
Py_BuildValue("()") # returns an empty tuple.

所以只要确保格式字符串中有括号,返回值将是一个元组。

关于python - `PyTuple_Pack` 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52179761/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com