Using my routines as functions AND methods
Guenther Sohler
guenther.sohler at gmail.com
Wed Jan 3 17:47:20 EST 2024
Hi,
In my cpython i have written quite some functions to modify "objects".
and their python syntax is e.g.\
translate(obj, vec). e.g whereas obj is ALWAYS first argument.
on c side this functions looks like:
PyObject *python_translate(PyObject *self, PyObject *args, PyObject *kwargs)
this works great when specifying a list of functions in PyModuleDef
structure.
However, I also want to use these functions as class methods without having
to
write the function , twice. When using the SAME function as a methos, the
args tuple must insert/contain "self" in the first location, so i have
written a function to do that:
PyObject *python_oo_args(PyObject *self, PyObject *args) // returns new
reference,
{
int i;
PyObject *item;
int n = PyTuple_Size(args);
PyObject *new_args = PyTuple_New(n + 1);
PyTuple_SetItem(new_args, 0, self);
for (i = 0; i < PyTuple_Size(args); i++) {
item = PyTuple_GetItem(args, i);
PyTuple_SetItem(new_args, i + 1, item);
}
return new_args;
}
To fill in method array, i have created a #define like this:
#define OO_METHOD_ENTRY(name,desc) \
{ #name, (PyCFunction) ( [ ] (PyObject *self, PyObject *args) -> PyObject
* { \
PyObject *new_args = python_oo_args(self, args); \
PyObject *result = python_##name(self, new_args, NULL); \
return result; } ), METH_VARARGS | METH_KEYWORDS, (desc)},
(this uses a lambda function)
and use this in the array as:
PyMethodDef PyOpenSCADMethods[] = {
OO_METHOD_ENTRY(translate,"Move Object")
OO_METHOD_ENTRY(right,"Right Object")
Using this i can reuse all the functions as methods,
but its not 100% stable/bulletproof and crashes sometimes.
So there is the bug ?
Is there a better approach to reach my goal ?
thank you
More information about the Python-list
mailing list