Jump to content
  • Advertisement
Sign in to follow this  
juergenhaas

Python C/API: converting C struct to Py class

This topic is 3649 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
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!