On Fri, Dec 18, 2009 at 2:26 AM, Emeka <emekami...@gmail.com> wrote: > char *kwlist[] = {"a", "b", NULL}; > if (!PyArg_ParseTupleAndKeywords(args, kwrds, "|CC", kwlist, &a, > &b)) > I am yet to understand what pointer kwlist[] does and why it is needed? > Regards, > Emeka
foo is designed to accept two arguments that can be specified by either position or name. kwlist contains the legal keyword names. In this example, the legal keywords are 'a' and 'b'. That they match the names of the C variables is just a lucky coincidence. If you want to change the keyword names to 'foo' and 'bar', you would just use char *kwlist[]={"foo", "bar", NULL}. casevh > > On Fri, Dec 18, 2009 at 8:17 AM, casevh <cas...@gmail.com> wrote: >> >> On Dec 17, 11:14 am, Joachim Dahl <dahl.joac...@gmail.com> wrote: >> > In the Ubuntu 9.10 version of Python 3.1 (using your patch), there's a >> > related bug: >> > >> > >>> foo(b='b') >> > >> > will set the value of a in the extension module to zero, thus clearing >> > whatever >> > default value it may have had. In other words, the optional character >> > arguments >> > that are skipped seem to be nulled by PyArg_ParseTupleAndKeywords(). >> >> The following code seems to work fine for me: >> >> static PyObject* foo(PyObject *self, PyObject *args, PyObject *kwrds) >> { >> int a=65, b=66; >> char *kwlist[] = {"a", "b", NULL}; >> if (!PyArg_ParseTupleAndKeywords(args, kwrds, "|CC", kwlist, &a, >> &b)) >> return NULL; >> return Py_BuildValue("(CC)", a, b); >> } >> >> The default values seem to remain as 'A' and 'B'. >> >> >>> foo() >> ('A', 'B') >> >>> foo(b='b') >> ('A', 'b') >> >>> foo() >> ('A', 'B') >> >>> foo('a') >> ('a', 'B') >> >>> foo('a', b='b') >> ('a', 'b') >> >>> foo() >> ('A', 'B') >> >>> >> >> casevh >> -- >> http://mail.python.org/mailman/listinfo/python-list > > -- http://mail.python.org/mailman/listinfo/python-list