La función PyArg_ParseTupleAndKeywords() se declara así:
int PyArg_ParseTupleAndKeywords(PyObject *arg, PyObject *kwdict, char *format, char **kwlist, ...);
Los parámetros arg y format son idénticos a los de la función PyArg_ParseTuple(). El parámetro kwdict es un diccionario de claves recibidas como tercer parámetro del entorno de ejecución de Python. El parámetro kwlist es una lista de cadenas terminadas en NULL que identifican los parámetros. Los nombres se casan con la información de tipos de format de izquierda a derecha.
Nota: No es posible analizar tuplas anidadas si se usan argumentos clave. Los parámetros clave no presentes en kwlist lanzarán TypeError.
He aquí un módulo de ejemplo que toma parámetros clave, basado en un ejemplo de Geoff Philbrick (philbrick@hks.com):
#include <stdio.h> #include "Python.h" static PyObject * argsclave_loro(self, args, keywds) PyObject *self; PyObject *args; PyObject *keywds; { int tension; char *estado= "un fiambre"; char *accion = "despegaría"; char *tipo = "Azul noruego"; static char *kwlist[] = {"tension", "estado", "accion", "tipo", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "i|sss", kwlist, &tension, &estado, &accion, &tipo)) return NULL; printf("-- Este loro no %s aunque le aplicaras %i voltios.\n", accion, tension); printf("-- Bello plumaje, el %s -- ¡Es %s!\n", tipo, estado); Py_INCREF(Py_None); return Py_None; } static PyMethodDef metodos_argsclave[] = { /* La conversión de tipo de la función es necesaria porque PyCFunction sólo toma dos parámetros PyObject* y argsclave_loro() toma tres */ {"loro", (PyCFunction)argsclave_loro, METH_VARARGS|METH_KEYWORDS}, {NULL, NULL} /* hoja roja */ }; void initargsclave() { /* Crear el módulo y añadir las funciones */ Py_InitModule("argsclave", metodos_argsclave); }