Paul Moore schrieb: > I'm trying to implement an extension type with a power operator. The > operator is unusual in that I want to allow my objects to be raised to > an integer power: > > p = Pattern() > p3 = p ** 3 > > I've implemented the code for a nb_power slot, it converts the "other" > argument to a C long using PyInt_AsLong(). > > static PyObject * > Pattern_pow (PyObject *self, PyObject *other, PyObject *modulo) > { > long n = PyInt_AsLong(other); > ... > /* Ignore modulo argument - not meaningful */ > > if (n == -1 && PyErr_Occurred()) > return NULL; > ... > } > > However, when I try to use the operator, I get the following error: > TypeError: unsupported operand type(s) for ** or pow(): > '_ppeg.Pattern' and 'int'
Try to set Py_TPFLAGS_CHECKTYPES in your extension type (in the tp_flags slot). from object.h: /* PyNumberMethods do their own coercion */ #define Py_TPFLAGS_CHECKTYPES (1L<<4) > I'm not sure where this error is coming from, as I don't have any type > checks in my code. Is there something else I should add to allow mixed- > type operations? (This is Python 2.5, if it matters). > > Oh, and is there a good reference for writing C extensions for Python > anywhere? The manuals aren't bad, but I keep hitting empty sections > (e.g., 10.5 Number Object Structures). I normally look into the newest python reference manual, even if I'm programming for older versions. But sometimes you have to took into the header files, too. Thomas -- http://mail.python.org/mailman/listinfo/python-list