PyLong_Check()错误识别PyBool类型?Python C API类型检测问题排查
问题原因
Python 的布尔类型(PyBool_Type)是整数类型(PyLong_Type)的子类,因此PyLong_Check()会对布尔对象返回true,导致你的函数优先匹配到整数类型的判断逻辑,返回了错误的类型字符串。
修复方案
调整类型检查的顺序,先检查布尔类型,再检查整数类型——子类的检查必须放在父类前面才能正确识别。以下是修正后的示例代码:
const char* getPyObjectType(PyObject* obj) { if (!obj) { return "null"; } // 优先检查布尔类型 if (PyBool_Check(obj)) { return "bool"; } // 再检查整数类型 if (PyLong_Check(obj)) { return "long"; } // 其他类型检查示例 if (PyUnicode_Check(obj)) { return "str"; } if (PyList_Check(obj)) { return "list"; } // 兜底返回原生类型名称 return Py_TYPE(obj)->tp_name; }
额外说明
PyBool_Check()是专门用于判断布尔对象的宏,它会直接校验对象类型是否为PyBool_Type,不受子类继承关系的干扰。- 也可以直接通过类型指针比较来判断,效果和
PyBool_Check()完全一致(因为Python中bool没有子类):if (Py_TYPE(obj) == &PyBool_Type) { return "bool"; }
内容的提问来源于stack exchange,提问作者fgalan
相关产品推荐
相关产品推荐

