Учитывая PyObject*
в C ++, как определить, является ли это экземпляром PyLongDoubleScalarObject
?
PyLongDoubleScalarObject
является соответствующим классом numpy для хранения 128-битных чисел (long double
), который определен в numpy/arrayscalars.h
,
С помощью dynamic_cast
не работает как PyObject*
не полиморфный. Когда я смотрю, как сделать что-то соответствующее dynamic_cast
за PyObject
тогда я в основном нахожу подсказку использовать такие функции, как PyLong_Check
, но я не нахожу что-то вроде PyLongDouble_Check
,
C API, эквивалентный Python isinstance
функция 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, определяющую расположение экземпляров. Глядя на пустые заголовки, похоже, что объект типа, который вы ищете, вероятно &PyLongDoubleArrType_Type
,
Других решений пока нет …