Python 检查PyObject是否为nullptr
我正在使用Python C Api填充包含Python 检查PyObject是否为nullptr,python,c++,python-2.7,c++11,Python,C++,Python 2.7,C++11,我正在使用Python C Api填充包含PyObject*元素的列表,并将其传输到Python中的函数。一切都进行得非常顺利,但有一个问题——Python中的传输列表包含奇怪的条目。列表中也包含“想要的”对象,所以看起来它几乎可以正常工作了 这是列表预览: [<NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NUL
PyObject*
元素的列表,并将其传输到Python中的函数。一切都进行得非常顺利,但有一个问题——Python中的传输列表包含奇怪的
条目。列表中也包含“想要的”对象,所以看起来它几乎可以正常工作了
这是列表预览:
[<NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <NULL>, <dbg.TBack object at 0x19675870>, <interface.Grid object at 0x196758B0>, <interface.Grid object at 0x196758F0>, <interface.slp object at 0x196757D0>]
我尝试添加if(!handle)
检查,但在实践中似乎没有任何效果
问题:如何删除列表中的
条目?试试看
或
int PyObject_Not(PyObject*o)
如果对象o被认为为真,则返回0,否则返回1。这相当于Python表达式,而不是o。失败时,返回-1
否则,您可以检查句柄的字符串表示形式。根据,您可能可以使用
int PyObject_Compare(PyObject *o1, PyObject *o2)
PyObject* PyObject_Repr (PyObject *o)
我在想
PyObject* null_str = Py_BuildValue("null_str", "<NULL>");
PyObject* handle_str = PyObject_Repr(handle);
if (!PyObject_Compare(null_str, handle_str)) {
continue;
}
PyObject*null\u str=Py\u BuildValue(“null\u str”,”);
PyObject*handle\u str=PyObject\u Repr(handle);
if(!PyObject\u Compare(null\u str,handle\u str)){
继续;
}
问题在于如何分配列表。对于新的PyList(Py\u ssize\u t len)
,从
注意:如果len大于零,则返回的列表对象的项设置为NULL。因此,在使用PyList\u SetItem()
将所有项设置为真实对象之前,不能使用抽象API函数,如PySequence\u SetItem()
,或将对象暴露于Python代码中
也就是说,它正在生成一个“len
”空指针列表,而不是生成一个带有预分配空间的空列表
解决办法是:
len
0)并保持其余代码不变(使用PyList\u Append
),或PyList\u SetItem
而不是append。如果使用这种方法,请注意PyList\u setItem
会窃取一个引用(因此您必须incref
handle
),并且所需列表的长度仅包括具有getHandle()的对象=空
int PyObject_Compare(PyObject *o1, PyObject *o2)
PyObject* PyObject_Repr (PyObject *o)
PyObject* null_str = Py_BuildValue("null_str", "<NULL>");
PyObject* handle_str = PyObject_Repr(handle);
if (!PyObject_Compare(null_str, handle_str)) {
continue;
}