namedtuple
純粹是用Python實現的。你可以在collections.py中看到它的完整源代碼。這很短。要記住的是namedtuple
本身是一個函數,它在調用它的框架中創建一個類,然後返回這個類(不是這個類的一個實例)。這是返回的類,然後用於創建實例。所以如果你想傳遞個體實例,你得到的對象不是你想要傳入C++的東西。
C++在編譯時創建了struct
定義。 namedtuple
在運行時創建namedtuple類。如果你想將它們綁定到C++結構體上,可以使用PyObject在C++中創建新鑄造的類實例,並在編譯時將它們分配給struct
元素。或者在Python中創建新的類實例並將它們傳遞給C++。
或者您可以使用_asdict
方法(由所有構建類的namedtuple factory方法提供)並將其傳遞給C++,然後將運行時定義的數據綁定到編譯時定義的數據。
如果你真的想在C++中完成大部分的工作,你也可以使用Struct模塊而不是使用namedtuple。
namedtuple真的是Python中的數據保留在Python中的瑞士軍刀。它提供了位置訪問,命名訪問,並且所有元素也都是「屬性」(因此它們有fget
訪問器方法,可用於地圖,過濾器等,而不必編寫自己的lambda表達式)。
這就像DB綁定(當你不知道哪些列在運行時會在那裏)。與OrderedDict相比,它將數據從一種格式轉換爲另一種格式不那麼笨重。當它以這種方式使用時,處理字符串的開銷與db的實際訪問(甚至嵌入)相比沒有任何意義。但是我不會使用namedtuple來計算大數組結構。
您可能無法轉換namedtuple,因爲它不是內建的。先嚐試將namedtuple轉換爲tuple(從python級別),然後在你的C++擴展中使用'PyArg_ParseTuple'。 – thorhunter
@thorhunter我會給你一個鏡頭。在閱讀PyArg_ParseTuple的文檔時,我對於如何訪問每個部分有點困惑。我是否必須確切知道Python用於存儲值的字節數? – Wired365
不,你唯一需要知道的是你傳遞的元組的結構,例如。 (int,int,string)。然後,你可以使用'PyArg_ParseTuple(args,「iis」,&int1,&int2,&str);'爲'int int1; int int2; char * str'變量來將它們綁定到C類型上,這當然是一個基本的例子,你可以使用'PyArg_ParseTuple'和其他Python API元素來做更多的事情,你可以用Python API以某種方式從PyObject中提取任何你需要的信息(包括字符串長度),我發現這個引用非常簡單:https: //docs.python.org/2.0/ext/parseTuple.html – thorhunter