Python 实现nb_inplace_add将返回只读缓冲区对象
我正在编写就地添加操作的实现。但是,由于某些原因,我有时会得到一个只读缓冲区(当我添加一个自定义扩展类和一个整数时…) 有关守则如下:Python 实现nb_inplace_add将返回只读缓冲区对象,python,python-c-api,python-c-extension,Python,Python C Api,Python C Extension,我正在编写就地添加操作的实现。但是,由于某些原因,我有时会得到一个只读缓冲区(当我添加一个自定义扩展类和一个整数时…) 有关守则如下: 静态PyObject* ModPoly_inpecadd(PyObject*self,PyObject*other) { 如果(!ModPoly_检查(自)){ //因为它已经就位,所以控制流不应该 //在这里输入(我想) 如果(!ModPoly_检查(其他)){ PyErr_SetString(PyExc_TypeError,“两个参数都不是modpolyma
静态PyObject*
ModPoly_inpecadd(PyObject*self,PyObject*other)
{
如果(!ModPoly_检查(自)){
//因为它已经就位,所以控制流不应该
//在这里输入(我想)
如果(!ModPoly_检查(其他)){
PyErr_SetString(PyExc_TypeError,“两个参数都不是modpolyman”);
返回NULL;
}
返回ModPoly_inpeacaded(其他,自身);
}否则{
如果(!PyInt_检查(其他)和&!PyLong_检查(其他)){
Py_增量(Py_未实施);
返回未执行的Py_;
}
}
ModPoly*Tself=(ModPoly*)self;
PyObject*tmp,*tmp2;
tmp=PyNumber\U Add(Tself->ob\U项[0],其他);
tmp2=PyNumber\u余数(tmp,Tself->n\u模);
Py_DECREF(tmp);
tmp=Tself->ob_项目[0];
Tself->ob_item[0]=tmp2;
Py_DECREF(tmp);
返回(PyObject*)Tself;
}
如果我没有返回(PyObject*)Tself
(或者简单地说是“self”),而是引发了一个异常,那么原始对象将得到正确的更新[使用一些printf
]进行检查]。如果我使用Py\u RETURN\u 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>
并在就地添加时打印1
(意味着返回的值属于modpolymonery
…)根据,对象的就地添加操作返回一个新引用
通过直接返回
self
,而不在其上调用Py_incremf
,对象将在仍被引用时被释放。如果其他对象被分配了相同的内存块,那么这些引用现在将为您提供新对象。您是对的。这是我的第一个C扩展,所以我仍然试图理解何时应该增加/减少内容。