Obviously the name of the C function and the char variable cannot both be foo, so the C code should be:
static PyObject* foo(PyObject *self, PyObject *args, PyObject *kwrds) { char foochar; char *kwlist[] = {"foochar", NULL}; if (!PyArg_ParseTupleAndKeywords(args, kwrds, "c", kwlist, &foochar)) return NULL; ... The question remains the same: why can't I pass a single character argument to this function under Python3.1? Thanks. Joachim On Nov 30, 9:52 pm, Joachim Dahl <dahl.joac...@gmail.com> wrote: > I am updating an extension module from Python2.6 to Python3. > > I used to pass character codes to the extension module, for example, I > would write: > > >>> foo('X') > > with the corresponding C extension routine defined as follows: > static PyObject* foo(PyObject *self, PyObject *args, PyObject *kwrds) > { > char foo; > char *kwlist[] = {"foo", NULL}; > if (!PyArg_ParseTupleAndKeywords(args, kwrds, "c", kwlist, &foo)) > return NULL; > ... > > In Python3.0 this also works, but in Python3.1 I get the following > error: > TypeError: argument 1 must be a byte string of length 1, not str > > and I seem to be supposed to write>>> foo(b'X') > > instead. From the Python C API, I have not been able to explain this > new behavior. > What is the correct way to pass a single character argument to > Python3.1 > extension modules? -- http://mail.python.org/mailman/listinfo/python-list