Sign in to follow this  

Python C/API: converting C struct to Py class

This topic is 3462 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi, we are converting a struct
typedef struct {
          PyObject_HEAD
          int first, second;
      } intpair;


to a python class (similar to an example 25.2 in "Python in a Nutshell, 2nd Edition"). We, after PyInitialize() and importing the module in python, obtain a class, but __dict__ shows an empty doc string and also does not show the members "first" and "second". The init function intpair_init (see below) does not seem to be called, since no printf debug statements are printed. 1) We suspect that we either initialise wrongly 2) or a problem with the fields in PyTypeObject being in the wrong order, something was left out etc.) 3) or ??? cheers David, Juergen We are using the PyTypeObject definition from /usr/lib/python2.5/doc/commontex/typestruct.h (see below): and the functions intpair_dealloc,intpair_str, intpair_init.
static int intpair_init(PyObject *self , PyObject *args, PyObject *kwds)
{
    static char* nams[] = {"first","second",NULL};
    int first, second;
    printf("1 in init\n");fflush(stdout);
    if(!PyArg_ParseTupleAndKeywords(args, kwds, "ii", nams, &first, &second))
        return -1;
    ((intpair*)self)->first = 101;
    ((intpair*)self)->second = 102;
    printf("in init\n");
    return 0;
}


with intpair_members:
static PyMemberDef intpair_members[] = {
    {"first", T_INT, offsetof(intpair, first), 0, "first item" },
    {"second", T_INT, offsetof(intpair, second), 0, "second item" },
    {NULL}
};


the initialisation is done with:
void initintpair(void)
{
    static PyMethodDef no_methods[] = { {NULL} };
    PyObject* this_module = Py_InitModule("intpair", no_methods);
    PyType_Ready(&t_intpair);
    PyObject_SetAttrString(this_module, "intpair", (PyObject*)&t_intpair);
}


static PyTypeObject t_intpair = {
   PyObject_HEAD_INIT(NULL)
    0,
    "intpair.intpair", /* For printing, in format "<module>.<name>" */
    sizeof(intpair),
    0, /* For allocation */
    /* Methods to implement standard operations */
    intpair_dealloc,
    0,
    0,
    0, 
    0,
    intpair_str,
   /* Method suites for standard classes */
    0,
    0,
    0, 
    /* More standard operations (here for binary compatibility) */
    0,
    0,
    0,
    PyObject_GenericGetAttr,
    PyObject_GenericSetAttr,
    /* Functions to access object as input/output buffer */
    0,
    /* Flags to define presence of optional/expanded features */
    Py_TPFLAGS_DEFAULT,
    "two ints (first,second)", /* Documentation string */
    /* Assigned meaning in release 2.0 */
    /* call function for all accessible objects */
    0,
    /* delete references to contained objects */
    0, 
    /* Assigned meaning in release 2.1 */
    /* rich comparisons */
    0,
    /* weak reference enabler */
    0,
    /* Added in release 2.2 */
    /* Iterators */
    0,
    0, 
    /* Attribute descriptor and subclassing stuff */
    0,
    intpair_members,
    0,
    0,
    0,
    0,
    0,
    0, 
    intpair_init,
    PyType_GenericAlloc, 
    PyType_GenericNew ,
    _PyObject_Del, /* Low-level free-memory routine */
    0,
    0,
    0,
    0,
    0,
    0
};


[Edited by - juergenhaas on June 24, 2008 5:59:27 AM]

Share this post


Link to post
Share on other sites

This topic is 3462 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this