2009-12-10 59 views
4

如何使用Python C API模拟以下Python函数?用Python C API命名参数?

def foo(bar, baz="something or other"): 
    print bar, baz 

(即,这样就可以通过调用它:

>>> foo("hello") 
hello something or other 
>>> foo("hello", baz="world!") 
hello world! 
>>> foo("hello", "world!") 
hello, world! 

回答

11

the docs:要使用PyArg_ParseTupleAndKeywords,在我给的网址记录。

因此,例如:

def foo(bar, baz="something or other"): 
    print bar, baz 

变(约 - 没有测试它!):

#include "Python.h" 

static PyObject * 
themodule_foo(PyObject *self, PyObject *args, PyObject *keywds) 
{ 
    char *bar; 
    char *baz = "something or other"; 

    static char *kwlist[] = {"bar", "baz", NULL}; 

    if (!PyArg_ParseTupleAndKeywords(args, keywds, "s|s", kwlist, 
            &bar, &baz)) 
     return NULL; 

    printf("%s %s\n", bar, baz); 

    Py_INCREF(Py_None); 
    return Py_None; 
} 

static PyMethodDef themodule_methods[] = { 
    {"foo", (PyCFunction)themodule_foo, METH_VARARGS | METH_KEYWORDS, 
    "Print some greeting to standard output."}, 
    {NULL, NULL, 0, NULL} /* sentinel */ 
}; 

void 
initthemodule(void) 
{ 
    Py_InitModule("themodule", themodule_methods); 
}