這與#1228158或#28879604不一樣。它是相似的,但有一個轉折點。是否有可能創建間接遞歸ctypes.Structure類型?
是微不足道的創建遞歸類型指的是其自己的類型:
A = type('A', (ctypes.Structure,), {})
A._fields_ = [('another_a', ctypes.POINTER(A))]
或者,如果你喜歡:
class A(ctypes.Structure):
pass
A._fields_ = [('another_a', ctypes.POINTER(A))]
同樣的事情。如果他們不是一回事,請教育我!
但我試圖將C struct
s和typedef
s機器翻譯成ctypes.Structure
s。我希望Python端的名稱和關係能夠反映C端的名稱和關係。如果函數返回uint32
即typedef
編號爲consumer_id
,我希望Python端的對象具有更多的描述性名稱。現在,這裏是經常發生這類事情:
typedef dummy_type official_type;
typedef struct dummy_struct {
official_type *another_struct;
} dummy_type;
無論我如何扭曲和轉動這個,我無法實現在Python這種關係。中間名是,可能沒有在任何地方使用,所以目前我們正在考慮檢測這種情況,並且讓official_type
a ctypes.Structure
指的是它自己。也許可以讓dummy_type
和struct dummy_struct
類型指向自己。在二元層面上,在C方面,它們都是等價的。
但我真正想要做的是這樣的:
Struct_dummy_struct = type('struct_dummy_struct', (ctypes.Structure,), {})
Dummy_type = type('dummy_type', (Struct_dummy_struct,), {})
Official_type = type('official_type', (Dummy_type,), {})
Struct_dummy_struct._fields_ = [('another_struct', ctypes.POINTER(Official_type))]
當然,這是不可能的:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: _fields_ is final
我想什麼,我試圖做的是理論上是不可能的,因爲的工作方式,但如果有人可以告訴我有一種方法,我會很高興!
我的退卻是不復制完全相同的類型結構,但我很好奇,如果有可能有一些意想不到的方式。我的示例代碼無法做到的原因(據我所知!)正如您所注意到的那樣,在類型被繼承之後,我正在觸摸'_fields_'。如果我使用'class',則會發生同樣的情況。 – clacke
當試圖爲'B結構> A> B>設置_fields_ for B'時遇到了這個問題。它已經完成了從A到B的底層劃分,但是從Structure到A底層時沒有完成。我的猜測是子類化Structure是一個特殊情況,它並不直接完成它。 – vriesdemichael
我的印象是,結構作爲一個模板類,當你戳「_fields_」時,它使得子類以「魔術」行事。但是你的情況一定發生了不同的錯誤,也許你的意思是你試圖在'B'子類化後爲'A'設置'_fields_'? – clacke