2016-11-08 43 views
1

這與#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端的名稱和關係。如果函數返回uint32typedef編號爲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_typestruct 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 

我想什麼,我試圖做的是理論上是不可能的,因爲​​的工作方式,但如果有人可以告訴我有一種方法,我會很高興!

回答

0

你不需要相同的構造在python:

class official_type(ctypes.Structure): 
    pass 
official_type._fields_ = [("another_struct", ctypes.POINTER(official_type))] 
first_instance = official_type() 
second_instance = official_type() 
first_instance.another_struct = ctypes.pointer(second_instance) 
print first_instance.another_struct 

<__main__.LP_official_type object at ...>

的ctypes有一個時髦的結構定稿過程中,如果你深入到單元測試,你會發現這樣的:

當這些事情發生時,結構/聯盟類別必須早晚得到「最終確定」:

  1. _fields_已設置。
  2. 創建實例。
  3. 該類型被用作另一個Structure/Union的字段。
  4. 類型是子類

當他們最終確定,不再允許分配領域。

也許你的類定義使用類型混淆了過程。

+0

我的退卻是不復制完全相同的類型結構,但我很好奇,如果有可能有一些意想不到的方式。我的示例代碼無法做到的原因(據我所知!)正如您所注意到的那樣,在類型被繼承之後,我正在觸摸'_fields_'。如果我使用'class',則會發生同樣的情況。 – clacke

+0

當試圖爲'B結構> A> B>設置_fields_ for B'時遇到了這個問題。它已經完成了從A到B的底層劃分,但是從Structure到A底層時沒有完成。我的猜測是子類化Structure是一個特殊情況,它並不直接完成它。 – vriesdemichael

+0

我的印象是,結構作爲一個模板類,當你戳「_fields_」時,它使得子類以「魔術」行事。但是你的情況一定發生了不同的錯誤,也許你的意思是你試圖在'B'子類化後爲'A'設置'_fields_'? – clacke

相關問題