【问题标题】: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 是类型名称。我不确定在这种情况下类型对象的名称是什么。

标签: c++ python numpy boost-python


【解决方案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

【讨论】:

    猜你喜欢
    • 2023-03-02
    • 2016-01-16
    • 1970-01-01
    • 2019-12-02
    • 2021-02-20
    • 2013-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多