2016-05-12 50 views
1

基本上,我用Python封裝了一個C API(使用CFFI(很棒))。在Python中使用其名稱(一個Python字符串)在一個枚舉中獲取一個C變量值

我有C API在一個枚舉:

typedef enum 
{ 
    enum1 = value1; 
    enum2 = value2; 
    ... 
} enumSomething; 

在Python,我接收可變這是在這個枚舉的名稱,作爲字符串:"enum1"。我想獲得value1

使用CFFI,你可以包裝枚舉並輕鬆訪問其成員(here is an example)。我的問題在於,我有代表變量名稱的字符串,而不是變量本身。

因此,cwrapper.c."enum1"將不起作用(cwrapper是包裝的模塊的名稱,c包裝庫時由ffi.dlopen(libname)返回的名稱)。

我可以做一本字典,將變量名映射爲一個字符串到實型變量,如:

enum = { "enum1" : cwrapper.c.enum1, "enum2" : cwrapper.c.enum2, ... } 

但在這一點上,我會更好地重寫枚舉Python字典。

我知道我也可以使用正則表達式來讀取C文件,但我認爲還有更好的方式來處理,我沒有想到。任何想法?

回答

3

cwrapper.c."enum1"在Python中通常不是有效的語法。您需要使用getattr

>>> getattr(cwrapper.c, "enum1") 
42 

但是一個更簡潔的方法是讓使用typeof的實際類型;然後得到它的relements,這是一本字典!

上安蒂的回答
>>> import cffi 
>>> ffi = cffi.FFI() 
>>> ffi.cdef('typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;') 
>>> typeof_strategy = ffi.typeof('strategy') 
>>> typeof_strategy.relements 
{'RANDOM': 0, 'SEARCH': 2, 'IMMEDIATE': 1} 
>>> typeof_strategy.relements['SEARCH'] 
2 
+0

我其實是想指出的是,它不會是有效的語法。但是,我不知道getattr。謝謝,它的工作原理! – DRz

+0

@DRz看到我的更新版本 –

+0

爲什麼使用這種方式更清潔,而不僅僅是getattr? – DRz

2

大廈,適當的Python Enum可以建立:

Strategy = enum.Enum('Strategy', ffi.typeof('strategy').relements) 

list(Strategy) 
# [<Strategy.RANDOM: 0>, <Strategy.IMMEDIATE: 1>, <Strategy.SEARCH: 2>] 
相關問題