PyArg_ParseTupleAndKeywords in Python3.1

Joachim Dahl dahl.joachim at gmail.com
Mon Nov 30 22:04:39 CET 2009


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... at 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?




More information about the Python-list mailing list