本篇仅仅是Python的学习和Python和C++数据对接过程中的一些总结。
由于工作的需要,用一周的时间学习 Python。
Python是基于C实现的一门解释型语言,由于其易用性,俘获了不少开发者和运维的心。据说,Python 在科学计算领域,逐步吞噬着古老语言 Fortran的份额。这门语言是Google的第二语言,国内的知乎,豆瓣,都使用纯Python开发。Python的官方网站:http://www/python.org.
为了逐步完善的我们服务,我们需要为客户提供更多,更好,更安全便捷的服务。在已有服务基础上,为了满足某些互联网客户的需要,我们需要提供公司产品的Python驱动。
因为客户需求的紧迫性,和我们的优势,在进行一个周的数据对接调研和测试之后,我和我的搭档决定使用已经稳定的C++驱动,用Python写一个表现层,底层通过wrapper和C++接口进行对接,然后通过C++与数据库服务交互。这能不仅为我们节省不少开发时间,而且将重点放在了Python与C++之间数据对接上,而不是通过纯Python直接和数据库服务进行交互。
C++ 驱动已经是进过严格测试的产品模块,通过Python对所提供的接口进行再一次的封装,使之对客户透明。而Python的简单易用和与C/C++无缝交互的天生属性,可以为客户提供更方便的服务。
Python简单得令人发指,可以不用关心对象的回收问题(当然,在C++这一层,必须关系对象的生命周期),可以返回多个对象,语法更接近自然语言。然而,简单的背后,是语言开发维护者辛勤的付出。
一下,对近期写Python驱动的一些总结:
1、在Python中,一切都是对象,就连None也是对象。
2、@classmethod是一个属性,它的调用,需要提供cls参数,是类方法,未加任何属性说明的函数,需要提供self参数,是实例方法。classmethod的声明,可以通过在函数定义前添加@classmethod 关键字声明。
3、python语言没有提供单独的int64,或者long long 类型,因为long已经足够。但是在传递到C++这层的时候,需要int64或者long long类型参数,则需要用Python传入PyLong的对象,然后通过PyLong_AsLongLong进行转换。
4、在C++层,不能直接返回的NULL,需要转换成Py_None,否则会抛出 SystemError 异常。
5、在C/C++中,需要对各种类型,进行转换才能返回给Python使用,因为Python的一切都是对象。关键接口是 Python.h中的 Py_BuildValue。你可以根据需要,返回一个或多个返回值。
6、还有不少,总之,python给我带来了很多方便的地方。
当然,一门语言被用的火热的时候,少不了别人骂。我也栽到过不少坑:
1、著名的缩进问题,因为在linux环境下,用vim写代码,由于缩进的问题,一个错误,让我找了好久。
2、Python的GC是基于引用计数的,在Python这层,可以肆无忌惮的使用,但是到了C/C++这层,对于引用Python传递下来的对象,需要主动使用Py_XINCREF 和 Py_XDECREF来增加和减少引用计数,不得不吐槽,在Python和C/C++交互的时候,Python的引用计数显得很鸡肋。引用计数问题,我更愿意封装一个smart_ptr来实现,而不是每次引用的时候,还去自己写一行语句去增加和减少引用。例如在C++返回Py_None的时候,你需要先去Py_XINCREF(Py_None),然后返回Py_None。
3、没有提供enum等原型,在众多错误码中,我不得不写一个class去实现形如const的值系列。
经过一个月的调研,开发,测试,我觉得我对Python有了一定的认识,曾经叨叨想学而一直没有好好学的语言,在工作的压力下,一个周就搞定。
在工作的基础上,成长的速度,要比自己业余东看看西学学快得多。
接着上月的汇编语言定位,查找内存出错等core问题之后,本月又学习了更深一层:通过汇编及栈桢,逆向定位和排查因为栈溢出导致寄存器数据被冲导致的程序崩溃。
=====>THE END<=====