博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言扩展Python(二)
阅读量:6504 次
发布时间:2019-06-24

本文共 2259 字,大约阅读时间需要 7 分钟。

hot3.png

上次实践的是在工作中写的小程序,也是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!>>>

转载于:https://my.oschina.net/max1984/blog/89435

你可能感兴趣的文章
中国人工智能学会通讯——融合经济学原理的个性化推荐 1.1 互联网经济系统的基本问题...
查看>>
盘点大数据商业智能的十大戒律
查看>>
戴尔为保护数据安全 推出新款服务器PowerEdge T30
查看>>
今年以来硅晶圆涨幅约达40%
查看>>
构建智能的新一代网络——专访Mellanox市场部副总裁 Gilad Shainer
查看>>
《数字视频和高清:算法和接口》一导读
查看>>
《中国人工智能学会通讯》——6.6 实体消歧技术研究
查看>>
如何在Windows查看端口占用情况及查杀进程
查看>>
云存储应用Upthere获7700万美元股权债务融资
查看>>
国家互联网应急中心何世平博士主题演讲
查看>>
洗茶,你误会了多少年?
查看>>
移动大数据“后市场”受青睐 亟需数据深度学习人才
查看>>
贵阳高新区力争打造“千亿级大数据园区”
查看>>
安防众筹不止于卖产品 思维拓展刺激消费
查看>>
OpenSSH曝高危漏洞 会泄露私钥
查看>>
艾特网能获2016APCA用户满意品牌大奖
查看>>
《CCNP TSHOOT 300-135学习指南》——第2章 结构化故障检测与排除进程
查看>>
《Java EE 7精粹》—— 2.5 非阻塞I/O
查看>>
《Python数据科学实践指南》一2.2 字符串
查看>>
《R数据可视化手册》——1.1 安装包
查看>>