本篇僅僅是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<=====
新聞熱點
疑難解答