You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 03:52:04