Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实现nb_inplace_add将返回只读缓冲区对象_Python_Python C Api_Python C Extension - Fatal编程技术网

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扩展,所以我仍然试图理解何时应该增加/减少内容。