检查Python C API中对象是int还是int类

时间:2018-03-29 18:17:37

标签: python python-c-api

是否存在类似于PyInt_Check / PyLong_Check的操作,该操作会考虑该类型是否具有__int__方法?

到目前为止,我能找到的最接近的解决方法是

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

    lng = PyLong_AsLongAndOverflow(obj, &over);
    if(lng == -1 && over == 0 && PyErr_Occurred()) {
        PyErr_Clear();
#if PY_MAJOR_VERSION <= 2
        lng = PyInt_AsLong(obj);
        if(lng == -1L && PyErr_Occurred()) {
            PyErr_Clear();
            return 0;
        }
#else
        return 0;
#endif
    }
    return 1;
}

这里的问题是我有效地做了像

这样的事情
def isint(obj):
    try:
        int(obj)
    except TypeError:
        return False
    else:
        return True

然而,这是C,我宁愿做类似

的事情
def isint(obj):
    return isinstance(obj, int) or hasattr(type(obj), '__int__')

我希望这样的检查已经存在,因为PyInt_AsLongPyLong_AsLongAndOverflow已经执行了检查。我只是想知道一个对象是否可能是一个整数而根本没有得到整数值。

话虽如此,我可以看到实际获取值的重点,因为hasattr(type(obj), '__int__')实际上并不能保证对象可以合理地用作整数:例如,如果属性不是函数或只是引发错误。在这种情况下,“否”可能是一个有效的答案。

1 个答案:

答案 0 :(得分:1)

与函数最接近的是PyNumber_Long或Python 2上的PyNumber_Int。这两个函数实际上都执行转换。他们还会考虑像@Echo Off Set "HKCU=&H80000001" Set "RKEY=Software\Gizmo International\HCM\IPC Config" For /F "Tokens=2 Delims={}" %%A In ( 'WMIC Class StdRegProv Call EnumKey "%HKCU%"^,"%RKEY%" 2^>Nul^|Find "sNames"' ) Do Set "_=%%A" & >>"%UserProfile%\Desktop\info.csv" Call Echo %%_:"=%% 这样的方法,并将字符串转换为int,就像从Python级代码调用__trunc__一样。

如果您想检查是否存在int转换方法,可以直接查找相应的广告位:

__int__