Определите, является ли PyObject * PyLongDoubleScalarObject (numpy)

Учитывая PyObject* в C ++, как определить, является ли это экземпляром PyLongDoubleScalarObject?

PyLongDoubleScalarObject является соответствующим классом numpy для хранения 128-битных чисел (long double), который определен в numpy/arrayscalars.h,

С помощью dynamic_cast не работает как PyObject* не полиморфный. Когда я смотрю, как сделать что-то соответствующее dynamic_cast за PyObject тогда я в основном нахожу подсказку использовать такие функции, как PyLong_Check, но я не нахожу что-то вроде PyLongDouble_Check,

3

Решение

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,

4

Другие решения

Других решений пока нет …