`PyTuple\u包`segfau

2024-10-06 13:33:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python扩展模块中有一个函数foo,它应该向Python返回一个int元组。这可以使用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;
}

应该这样做,这是不。相反,我得到了一个错误。 我错过了什么?你知道吗


Tags: 函数pyselffooargsstaticoutpack
1条回答
网友
1楼 · 发布于 2024-10-06 13:33:01

区别在于:

  • Py_BuildValue("(ii)", a, b)期望ab是简单的C-int值。你知道吗
  • PyTuple_Pack(2, a, b)期望ab已经是PyObjects(而不是C-int)。你知道吗

上面写着:

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() 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.

所以只要确保格式字符串中有括号,返回的值将是元组。你知道吗

相关问题 更多 >