[英]Fetching a C variable value in an enum using its name (a Python string) in Python
基本上,我在Python中包裝了一個C API(使用CFFI(真棒))。
我在那個C API中有一個枚舉:
typedef enum
{
enum1 = value1;
enum2 = value2;
...
} enumSomething;
在Python中,我以字符串形式獲取該枚舉中的變量名稱: "enum1"
。 我想獲得value1
。
使用CFFI
,您可以包裝枚舉並輕松訪問其成員( 這里是一個示例 )。 我的問題是我有代表變量名稱的字符串,而不是變量本身。
因此, cwrapper.c."enum1"
將不起作用( cwrapper
是包裝模塊的名稱, c
是包裝庫時由ffi.dlopen(libname)
返回的名稱)。
我可以制作一個字典,將變量名作為字符串映射到真實變量,例如:
enum = { "enum1" : cwrapper.c.enum1, "enum2" : cwrapper.c.enum2, ... }
但是在這一點上,我最好將枚舉重寫為Python字典。
我知道我也可以使用正則表達式來讀取C文件,但是我認為還有一種更好的處理方式,我沒有想到。 任何想法?
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
根據Antti的答案,可以構建適當的Python Enum
:
Strategy = enum.Enum('Strategy', ffi.typeof('strategy').relements)
list(Strategy)
# [<Strategy.RANDOM: 0>, <Strategy.IMMEDIATE: 1>, <Strategy.SEARCH: 2>]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.