PyArg_ParseTupleAndKeywords in Python3.1

casevh casevh at gmail.com
Mon Nov 30 16:19:20 EST 2009


On Nov 30, 1:04 pm, Joachim Dahl <dahl.joac... at gmail.com> wrote:
> 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?- Hide quoted text -
>
> - Show quoted text -

Python 3.1 uses "c" (lowercase c) to parse a single character from a
byte-string and uses "C" (uppercase c) to parse a single character
from a Unicode string. I don't think there is an easy way to accept a
character from both.

HTH,

casevh



More information about the Python-list mailing list