我正在编写就地添加操作的实现。但是,由于某种原因,我有时会得到一个只读缓冲区作为结果(而我正在添加一个自定义扩展类和一个整数......)。
相关代码为:
static PyObject *
ModPoly_InPlaceAdd(PyObject *self, PyObject *other)
{
if (!ModPoly_Check(self)) {
//Since it's in-place addition the control flow should never
// enter here(I suppose)
if (!ModPoly_Check(other)) {
PyErr_SetString(PyExc_TypeError, "Neither argument is a ModPolynomial.");
return NULL;
}
return ModPoly_InPlaceAdd(other, self);
} else {
if (!PyInt_Check(other) && !PyLong_Check(other)) {
Py_INCREF(Py_NotImplemented);
return Py_NotImplemented;
}
}
ModPoly *Tself = (ModPoly *)self;
PyObject *tmp, *tmp2;
tmp = PyNumber_Add(Tself->ob_item[0], other);
tmp2 = PyNumber_Remainder(tmp, Tself->n_modulus);
Py_DECREF(tmp);
tmp = Tself->ob_item[0];
Tself->ob_item[0] = tmp2;
Py_DECREF(tmp);
return (PyObject *)Tself;
}
如果我没有返回(PyObject*)Tself
(或简单地“自我”),而是引发异常,则原始对象会正确更新[使用 some 检查printf
]。如果我使用Py_RETURN_NONE
宏,它会正确地变成ModPoly
(None
在 python 端)。
我究竟做错了什么?我正在返回一个指向ModPoly
对象的指针,这怎么会成为一个缓冲区?而且我没有看到对这些指针的任何操作。
示例用法:
>>> from algebra import polynomials
>>> pol = polynomials.ModPolynomial(3,17)
>>> pol += 5
>>> pol
<read-only buffer ptr 0xf31420, size 4 at 0xe6faf0>
我尝试将返回线更改为:
printf("%d\n", (int)ModPoly_Check(self));
return self;
并且1
在就地添加时打印(意味着返回的值是类型ModPolynomial
...)