确定 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)的主要内容,如果未能解决你的问题,请参考以下文章

检查 PyObject 是不是为 None

Python:从 C 函数中确定模块名称

如何将 C++ 对象转换为 PyObject?

具有任意类型参数的 PyQt 信号 / PyQt_PyObject 等效于新型信号

在rust-cpython中将Rust结构转换为PyObject

PyObject_CallMethod 在调用 python 方法时有时会出现段错误