上次实践的是在工作中写的小程序,也是Python扩展的基础,在上一个例子中其实核心在于对Python参数的解析,Python.org提供了很丰富的解析规则,几乎任何类型(基础类型、对象类型等).推荐官网链接说明:
.Python编写中,经常用到关键词参数传递,例如:
def fun(arg0,arg1=None,arg2=None): print "%s %s %s" % (arg0,arg1,arg2)def main(): fun('hello',arg2='!',arg1='world')if __name__ == '__main__': main()输出:
>> hello world !
C语言扩展也可以实现,参数解析我们使用PyArg_ParseTupleAndKeywords方法做解析.该方法定义的原型为:
/* Support for keyword arguments donated by Geoff Philbrick下面是在例子 基础上增加,实现一个关键词参数传递的方法.*//* Return false (0) for error, else true. */intPyArg_ParseTupleAndKeywords(PyObject *args, PyObject *keywords, const char *format, char **kwlist, ...)
/** * python中经常会使用关键词参数 * 例如: * def func(a,arg1='hello') ... * C扩展也可以实现该形式的调用,只是使用不一样的解析参数函数 */static PyObject *print_kw(PyObject *self,PyObject *args,PyObject *kw){ static char *kwlist[] = { "arg0","arg1",NULL}; char* hello="default"; char* world="default"; if (!PyArg_ParseTupleAndKeywords(args,kw,"s|s",kwlist,&hello,&world)) { printf("ERROR"); return NULL; } printf("%s %s\n",hello,world); Py_RETURN_NONE;}
kwlist[] 定义出我们关键词参数key的名字,不难看出我们定义俩个关键词参数arg0与arg1,接下来就是向Python暴露该方法.
详细参考下方代码段.static PyMethodDef addMethods[] ={ // METH_NOARGS 无参数 {"sayhello",(PyCFunction)say_hello,METH_NOARGS,"say hello!"}, // METH_VARARGS 带有参数 {"sum",(PyCFunction)calc_pv,METH_VARARGS,"calc pv"}, // METH_VARARGS 带有关键字参数 {"print_args",(PyCFunction)print_kw,METH_KEYWORDS,"print argument keyword"}, /**NULL代表结束位,Py_InitModule会以NULL代表函数列表结束*/ {NULL, NULL, 0, NULL}};
METH_KEYWORDS代表该方法是关键词参数类型.接着我们按照方法重新编译setup.py.并进行测试
Python 2.7.3 (default, Nov 13 2012, 11:17:50) [GCC 4.1.2 20080704 (Red Hat 4.1.2-48)] on linux2Type "help", "copyright", "credits" or "license" for more information.>>> import session>>> help(session)Help on module session:NAME sessionFILE /usr/local/lib/python2.7/site-packages/session.soFUNCTIONS print_args(...) print argument keyword sayhello(...) say hello! sum(...) calc pv>>> session.print_args('hello')hello default>>> session.print_args(arg0='hello')hello default>>> session.print_args(arg0='hello',arg1='world!')hello world!>>>