On 2019-11-18 20:15, R.Wieser wrote:
MRAB,
One possibility is to refactor the code so that py_proc1 and py_proc2
themselves just handle their arguments and then call the function that
does the actual work.
The thing is that the arguments of py_proc1 and py_proc2 are the same, but
for a single argument. Which means that letting both of them first parse
their own arguments means duplicated code. Which I do not really want and
thus try to evade
But yes, that is a possibility too. The "the function that does the actual
work" part is what I tried to describe with my second example.
A clunkier way would be to make a new tuple that consists of the prepended
item and the items of args and pass that to py_proc1 as its args.
That is what I tried to describe with my first example.
The thing is I have no clue about what the above calling should look like
(though I think I already found how to append my argument to the "args"
string-object).
In other words, do you have any idea of what either of those calling methods
should look like ? An example perhaps ? Having only encountered the
CPython API two days ago I'm still fumbling in the dark I'm afraid.
It could be something like this:
static PyObject *py_proc2(PyObject *self, PyObject *args)
{
/*** TODO: Add error checking. ***/
PyObject* prepend_arg;
PyObject* prepend_tuple;
PyObject* new_args;
PyObject* result;
/* The object to be prepended. */
prepend_arg = PyUnicode_FromString("foo");
/* Make a tuple from the prepended object. */
prepend_tuple = BuildValue("(O)", prepend_arg);
/* No longer need prepend_arg. */
Py_DECREF(prepend_arg);
/* Make the new argument list. */
new_args = PySequence_Concat(prepend, args);
/* No longer need prepend_tuple. */
Py_DECREF(prepend_tuple);
/* Call the other method. */
result = py_proc1(self, new_args);
/* No longer need new_args. */
Py_DECREF(new_args);
return result;
}
--
https://mail.python.org/mailman/listinfo/python-list