确定PyObject *是否是PyLongDoubleScalarObject(numpy)

时间:2012-11-12 01:05:26

标签: c++ python numpy boost-python

给定C ++中的PyObject*如何确定它是否是PyLongDoubleScalarObject的实例?

PyLongDoubleScalarObject是存储128位浮点数(long double)的相应numpy类,它在numpy/arrayscalars.h中定义。

使用dynamic_cast无效,PyObject*非多态。当我查看如何为dynamic_cast PyObject执行与PyLong_Check相对应的操作时,我主要找到使用PyLongDouble_Check等函数的提示,但我找不到类似{{1}}的内容。

1 个答案:

答案 0 :(得分:4)

与Python的isinstance函数等效的C API是PyObject_TypeCheck,因此您可以执行以下操作:

if (PyObject_TypeCheck(obj, typeobject)) {
     /* obj matches the given type */
}

或者,如果要检查对象的确切类型而不接受子类型,可以直接检查类型:

if (Py_TYPE(obj) == typeobject) {
    /* obj is an instance of the given type and not a subclass */
}

请注意,您需要在Python级别传递表示类型的对象,而不是定义实例布局的C结构。查看numpy标题,看起来你所追求的类型对象可能是&PyLongDoubleArrType_Type