Python 检查PyObject是否为nullptr

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

我正在使用Python C Api填充包含
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
”空指针列表,而不是生成一个带有预分配空间的空列表

解决办法是:

  • 创建一个空列表(pass
    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;
    }