2012-11-12 18 views
3

給定一個PyObject*在C++如何確定它是否爲PyLongDoubleScalarObject的實例?確定PyObject *是PyLongDoubleScalarObject(numpy)

PyLongDoubleScalarObject是存儲128位浮點數(long double)的相應numpy類,它在numpy/arrayscalars.h中定義。使用dynamic_cast不起作用PyObject*非多態。當我看看如何做一些dynamic_cast對應PyObject,那麼我大多會發現使用PyLong_Check等函數的提示,但我沒有找到類似PyLongDouble_Check的東西。

+0

PyLongDoubleScalarObject應像每個非變長的PyObject一樣包含一個名爲ob_type的成員,它是一個指向表示類型的對象的指針。它應該指向相同類型的所有Python對象的相同地址,通常是名爲'X_Type'的對象的地址,其中'X'是類型名稱。在這種情況下,我不確定類型對象的名稱。 – jogojapan

回答

4

的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結構定義實例的佈局類型的對象。看看numpy的頭文件,它看起來像你之後的類型對象可能是&PyLongDoubleArrType_Type