Is there a way to define Cython extension type class attributes as C++ classes?

Currently I have several Cython extension types which wrap different c++ classes by creating an attribute that has an instance of that class, like in the wrapping C++ Cython guide.

However, I'm running into problems when trying to use that attribute in other parts of my code. Despite being defined with cdef and a specific C++ class, Cython still considers the attribute a python object. While it's possible to copy the data from the attribute and create a new C++ class to pass in, that involves a lot of overhead and is not very good for what I'm working on.

A minimum reproducible example:


namespace test {

class IntClass 
    IntClass() {};
    IntClass(int attribute) : attribute(attribute) {};
    int getAttribute() {return this->attribute;}
    int attribute;


cdef extern from "test.h" namespace "test":
    cdef cppclass IntClass:
        IntClass(int attribute)
        int getAttribute()

cdef class PyIntClass:
    cdef IntClass intclass

    def __cinit__(self):
        intclass = IntClass(9)

And the error I'm getting:

Error compiling Cython file:

cdef class PyIntClass:
    cdef IntClass intclass

    def __cinit__(self):
        intclass = IntClass(9)                          ^

test.pyx:11:27: Cannot convert 'IntClass' to Python object

Is there a way to tell Cython to consider that attribute as a C++ object or otherwise avoid having to copy all the data?

Read more here:

Content Attribution

This content was originally published by JamesxGames at Recent Questions - Stack Overflow, and is syndicated here via their RSS feed. You can read the original post over there.

%d bloggers like this: