确定 PyObject* 是不是为 PyLongDoubleScalarObject (numpy)
Posted
技术标签:
【中文标题】确定 PyObject* 是不是为 PyLongDoubleScalarObject (numpy)【英文标题】:Determine if PyObject* is PyLongDoubleScalarObject (numpy)确定 PyObject* 是否为 PyLongDoubleScalarObject (numpy) 【发布时间】:2012-11-12 01:05:26 【问题描述】:在C++中给定一个PyObject*
,如何判断它是否是PyLongDoubleScalarObject
的实例?
PyLongDoubleScalarObject
是对应的numpy类来存储128bit浮点数(long double
),在numpy/arrayscalars.h
中定义。
使用dynamic_cast
不能作为PyObject*
非多态。当我查看如何为PyObject
执行与dynamic_cast
相对应的操作时,我通常会找到使用PyLong_Check
之类的函数的提示,但我找不到PyLongDouble_Check
之类的东西。
【问题讨论】:
PyLongDoubleScalarObject
应该像每个非可变长度PyObject
一样包含一个名为ob_type
的成员,它是一个指向表示该类型的对象的指针。对于相同类型的所有 Python 对象,它应该指向相同的地址,通常是名为X_Type
的对象的地址,其中X
是类型名称。我不确定在这种情况下类型对象的名称是什么。
【参考方案1】:
等效于 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
。
【讨论】:
以上是关于确定 PyObject* 是不是为 PyLongDoubleScalarObject (numpy)的主要内容,如果未能解决你的问题,请参考以下文章
具有任意类型参数的 PyQt 信号 / PyQt_PyObject 等效于新型信号