Python extension modules

emdpek emdpek at
Thu Nov 1 01:06:53 CET 2001


I am working on a Python binding to a library, and wanted to
clear up some concepts involving extension modules (and,
more than likely, defining a new type).

I need Python objects to contain and "represent" native C
structs.  Is there a way to do this *without* defining a new
type?  For example, my C binding functions call on library
functions which return pointer structs.  I can't really
return these back to Python, as they are not "PyObject*",
and you can't, for example, convert and return a "void*" via
Py_BuildValue.  Or can you?

My C binding, then, has to define its own struct (Python
type), and one of the struct members will be a pointer to
these native library structs.  Python code will manipulate
instances of this type, not knowing they are basically
wrappers around a struct from another library...  (I am
hoping that train of thought makes sense.  And sorry for
thinking out loud.)

Question about defining a new type, then.  Functions
(package-scoped functions not tied to a class) are declared
via the PyMethodDef array, right?  So, this is where an
instance constructor might go?

static PyMethodDef MyNew_functions[] = {
  { "MyNew", MyNew, METH_VARARGS },

Now, Python can: "instance = MyNew()"

Instance methods are declared differently, and in the
following two different ways:

static PyTypeObject MyNewType = {
  (destructor)MyNew_die, /*tp_dealloc*/
  /* etc... */

But, to add behavior outside of the methods defined in
object.h's PyTypeObject, you must go through "getattr"
methods.  For example:

static PyMethodDef MyNew_methods[] = {
  {"method", (PyCFunction)MyNew_method, METH_VARARGS},
  {NULL, NULL} /* sentinel */

static PyObject*
MyNew_getattr(MyNew *self, char *name)
  return Py_FindMethod(MyNew_methods, (PyObject *)self, name);

So, now you can: "rv = instance.method()"

Is this (use of "getattr" method, which calls Py_FindMethod)
the accepted convention?  (I can't remember which module I
stole this idea from.)

Am I on the right track?  Thanks in advance...


P.S.  There is perhaps a train-of-thought missing from the
  Extending tutorial that I lost hair figuring out this
  morning.  I would be more than happy to offer possible
  improvements, if there is interest...

More information about the Python-list mailing list