2013-05-17 63 views
4

我已經搜索和搜索,但我還沒有找到一個例子,做我需要做的。
我在SO上發現了 How can I represent an 'Enum' in Python? 但它不包括ctypes.Structure。我還發現 Using enums in ctypes.Structure 在這裏,但它包括指針,我不熟悉。如何使用Python 2.7.2將C++枚舉轉換爲ctypes.Structure?

我有一個頭文件,其中包含typedef枚舉,我需要在Python文件的ctypes.Structure中使用。

C++頭文件:

typedef enum { 

     ID_UNUSED, 
     ID_DEVICE_NAME, 
     ID_SCSI, 
     ID_DEVICE_NUM, 
} id_type_et; 

Python的文件(我目前在做它的方式):

class IdTypeEt(ctypes.Structure): 

     _pack_ = 1 
     _fields_ = [ ("ID_UNUSED", ctypes.c_int32), 
      ("ID_DEVICE_NAME", ctypes.c_char*64), 
      ("ID_SCSI", ctypes.c_int32), 
      ("ID_DEVICE_NUM", ctypes.c_int32) ] 

任何意見將不勝感激。越簡單越好。

回答

5

enum不是一個結構,它是一個具有預定義值(枚舉常量)的整數類型。用ctypes.Structure來表示它是沒有意義的。您正在尋找這樣的事情:

from ctypes import c_int 

id_type_et = c_int 
ID_UNUSED = id_type_et(0) 
ID_DEVICE_NAME = id_type_et(1) 
ID_SCSI = id_type_et(2) 
ID_DEVICE_NUM = id_type_et(3) 
+0

它是安全的假設基礎值始終爲0,1,2,3,...? – 101

+1

@figs如果C++頭看起來像OP顯示的,是的。如果第一個枚舉器沒有被賦予一個明確的值,那麼它保證爲0.如果後面的枚舉器沒有被賦予一個明確的值,那麼它肯定是'前一個枚舉器+1'。 – Angew