From: arcege at shore.net (Michael P. Reilly)
Date: Fri, 23 Apr 1999 16:34:46 GMT
Subject: Suggestion for easier c/c++ interfacing
References: <slrn7i103j.2a3.hat@se-46.wpa.wtb.tue.nl>
Message-ID: <Gi1U2.191$7j4.63970@news.shore.net>
Content-Length: 2131
X-UID: 1651                                                  

Albert Hofkamp <hat at se-46.wpa.wtb.tue.nl> wrote:
: Hello all,

: I have been experimenting with c++ and Python, and am working on
: attaching generated c++ module-code to python.

: In the EXT document, it is explained how to parse arguments from python
: in c code using PyTuple_ParseArgs(). This is really easy to use.

I think you mean PyArg_ParseTuple().

: However, the same kind of parsing must occur after a call from c to a
: python function. The return value from that function is again a Python
: object, and needs to be decoded before it can be used in c.
: Unfortunately, the returned value is not a tuple, so PyTuple_ParseArgs()
: cannot be used. A shortcut would be to wrap the result in a tuple with 1
: argument, and then call the decoding function, but I consider that a hack.

: Wouldn't it be possible to create a PyTuple_ParseArgs()-like function to
: parse return results from python functions ?

Gee... that is what happens when you take something out of the doc.

There is indeed a function that you describe.  It is not used often,
but "in the old days" it was used instead of PyArg_ParseTuple().  The
function is called PyArg_Parse() and works identically to the function
PyArg_ParseTuple(), except that it does not expect a tuple, it expects
any Python object.

  PyObject *function;
  PyObject *result, *args;
  char *street, *town, *city;
  int zipcode;

  args = Py_BuildValue("ss", "name", "Arcege");
  /* returns a list of four elements */
  result = PyObject_CallObject(function, args);
  Py_DECREF(args);
  if (!PyArg_Parse(result, "[sssi]", &street, &town, &city, &zipcode))
      return NULL;

Often, it is better to determine the type of the return value in the C
code manually - making it more robust and extensible.

  result = PyObject_CallObject(function, args);
  if (result == Py_None) {
      printf("No address found\n");
      Py_DECREF(Py_None);
  } else if (!PyList_Check(result)) {
      PyErr_SetString(PyExc_TypeError, "expecting a list (or None)")
      return NULL;
  }

A good idea is to go thru the Python sources and see how PyArg_Parse
is still being used.

  -Arcege





