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

Reply via email to