检查PyObject是否是nullptr
Checking if PyObject is nullptr
我使用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>, <NULL>, <dbg.TBack object at 0x19675870>, <interface.Grid object at 0x196758B0>, <interface.Grid object at 0x196758F0>, <interface.slp object at 0x196757D0>]
我用来填充Python C API列表的代码。
PyObject* list = PyList_New(objectsList.size());
PyObject* handle;
for (auto child : objectsList) {
if (!child) {
continue;
}
handle = child->GetHandle(); // handle = PyObject*
if (!handle) {
continue;
}
PyList_Append(list, handle);
}
return list; // push
我试过添加if(!handle)
检查,但在实践中似乎没有任何结果。
问题:我如何才能摆脱我的列表中的<NULL>
条目?
试试这个方案
if (handle == Py_None) {
continue;
}
或
PyObject_Not(PyObject *o)如果对象0被认为为真则返回0,否则返回1。这相当于Python表达式not o。如果失败,返回-1。
否则,也许您可以检查handle
的字符串表示。根据文档,您可能能够使用
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;
}
问题在于如何分配列表。PyList_New(Py_ssize_t len)
的文档:
注意:如果len大于0,返回的list对象的项被设为NULL。因此,在使用
PyList_SetItem()
将所有项设置为实际对象之前,您不能使用抽象API函数(如PySequence_SetItem()
)或将对象暴露给Python代码。
。它正在创建一个"len
"空指针列表,而不是创建一个具有预分配空间的空列表。
解决方案是:
- 创建一个空列表(传递
len
0)并保持代码的其余部分相同(使用PyList_Append
),或者 - 为列表分配一个大小,并使用
PyList_SetItem
代替append。如果您使用这种方法,请注意PyList_setItem
窃取了引用(因此您必须使用incref
handle
),并且您想要的列表长度仅包括具有getHandle()!=NULL
的对象。
相关文章:
- C++LDAP检查用户是否是特定组的成员
- 检查某些类型是否是模板类 std::optional 的实例化
- 将错误返回给调用方而不是立即在 C++ 中抛出错误是否是一种好的做法
- 如何检查模板专用化是否是基本模板的子类?
- 如何检查变量是否是C++中的地图?
- C++ Chrono 确定一天是否是周末?
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 代码在 CodeSignal 中工作不正确。不确定这是否是我的代码缺陷
- 如果 C 函数仍然可以间接执行(通过回调函数),那么将它声明为静态函数是否是一种不好的做法?
- MFC 中的窗口消息管理:添加基类调用是否是强制性的?
- 检查 n2 是否是 n1 的倍数后结果错误,但根本没有错误
- C ++:检查它是否是类中的数字
- 检查nullptr是否100%保护内存布局不受segfault影响
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 使用 SET(C++) 检查两个给定字符串是否是字谜时出现运行时错误
- 从 std::string 到 std::array<char,size> 的 memcopy 额外数据是否是一种未定义的行为?
- 有没有办法检查发送到变量的值是否是正确的类型,而它已经在该变量下?
- 取消引用等于 nullptr 的指针是否是标准的未定义行为?
- 检查PyObject是否是nullptr