2010-06-23 35 views
4

我有一個我想從Python使用的API。該API包含用#define實現的標誌和枚舉。ctypes是否提供枚舉和標誌的任何東西?

// it's just almost C so don't bother adding the typedef and parenthesis diarrhea here. 
routine(API_SOMETHING | API_OTHERTHING) 
stuff = getflags() 
? stuff & API_SOMETHING 

action(API_INTERESTING) 
mode = getaction() 
? mode == INTERESTING 

如果無視一切,除了現在枚舉和標誌一樣,我應該綁定該翻譯成:

routine(["something", "otherthing"]) 
stuff = getflags() 
if 'something' in stuff 

action('interesting') 
mode = getaction() 
if mode == 'interesting' 

是否ctypes的提供機制來做到這一點直出?如果沒有,那麼只需告訴你用於處理Python綁定中的標誌和枚舉的'通常'工具。

回答

4

我有點失望自己回答這個問題。特別是因爲我從f *手冊中找到了所有這些。

http://docs.python.org/library/ctypes.html#calling-functions-with-your-own-custom-data-types

要完成我的回答,我會寫一些代碼,不會包裝商品。

from ctypes import CDLL, c_uint, c_char_p 

class Flag(object): 
    flags = [(0x1, 'fun'), (0x2, 'toy')] 
    @classmethod 
    def from_param(cls, data): 
     return c_uint(encode_flags(self.flags, data)) 

libc = CDLL('libc.so.6') 
printf = libc.printf 
printf.argtypes = [c_char_p, Flag] 

printf("hello %d\n", ["fun", "toy"]) 

encode_flags將該漂亮列表轉換爲整數。

+0

我確定現在,由於'你已經閱讀過文檔',你知道除了所有其他解決方案之外,你還可以使用'property':http://docs.python.org/library/ functions.html#屬性 – 2010-06-23 18:03:45

3

你爲什麼不使用c_uintenum參數,然後使用這樣的映射(枚舉通常是無符號整數):

在C:

typedef enum { 
    MY_VAR  = 1, 
    MY_OTHERVAR = 2 
} my_enum_t; 

,並在Python:

class MyEnum(): 
    __slots__ = ('MY_VAR', 'MY_OTHERVAR') 

    MY_VAR = 1 
    MY_OTHERVAR = 2 


myfunc.argtypes = [c_uint, ...] 

然後,您可以將MyEnum字段傳遞給函數。

如果要爲枚舉值指定字符串表示形式,可以在MyEnum類中使用dictionary

+0

是的。可以這樣做。雖然我正在尋找一個標誌 - >文本形式的翻譯,以自動化的形式。 – Cheery 2010-06-23 16:07:05

+0

您可以重寫'__getattr__'方法來返回標誌的文本表示或在類中定義其他靜態字符串變量。 – 2010-06-23 16:57:15