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

Python C API:是否存在类似PyInt_Check的方法支持含__int__的类int对象

回答:检查int/类int对象(支持__int__)的Python C API实现

首先直接给结论:Python C API中没有直接等价于PyInt_Check/PyLong_Check且能识别所有实现__int__方法的类int对象的宏或函数,但可以通过尝试将对象转换为长整型的方式来间接判断,这也是你找到的代码片段的核心思路。下面是完善后的兼容Python 2和3的完整实现:

#include <Python.h>

int check_int_like(PyObject *obj) {
    long lng;
    int over;

    // 首先尝试用PyLong_AsLongAndOverflow转换,这个函数会调用__int__方法
    lng = PyLong_AsLongAndOverflow(obj, &over);
    if (!PyErr_Occurred()) {
        // 转换成功,不管有没有溢出,都说明是类int对象
        return 1;
    }
    PyErr_Clear(); // 清除转换失败的错误

#if PY_MAJOR_VERSION <= 2
    // Python 2中,还需要尝试PyInt_AsLong(对应原生int类型)
    lng = PyInt_AsLong(obj);
    if (!PyErr_Occurred()) {
        return 1;
    }
    PyErr_Clear();
#endif

    // 所有转换都失败,不是int/类int对象
    return 0;
}

关键细节解释:

  • PyLong_AsLongAndOverflow:在Python 3中,这个函数会处理原生int(也就是PyLong类型),同时也会调用对象的__int__方法尝试转换;在Python 2中,它也能处理PyLong类型,而PyInt类型需要单独用PyInt_AsLong处理。
  • 错误处理:每次转换失败后必须调用PyErr_Clear(),否则会留下错误状态影响后续的API调用。
  • 返回值:返回1表示是int/类int对象,返回0表示不是。

需要注意的是,这种方式是行为式检查(通过能否转换为int来判断),而非类型检查,这和PyLong_Check只检查类型的方式不同,但这也是唯一能覆盖所有实现__int__的自定义对象的方法。

内容的提问来源于stack exchange,提问作者Mad Physicist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:59:51