在Python中使用C变量的名称(Python字符串)获取枚举中的C变量值
基本上,我正在使用非常棒的CFFI用Python包装一个C API 我在该C API中有一个枚举:在Python中使用C变量的名称(Python字符串)获取枚举中的C变量值,python,c,variables,enums,python-cffi,Python,C,Variables,Enums,Python Cffi,基本上,我正在使用非常棒的CFFI用Python包装一个C API 我在该C API中有一个枚举: typedef enum { enum1 = value1; enum2 = value2; ... } enumSomething; 在Python中,我以字符串形式接收枚举中的变量名:enum1。我想得到价值1 使用CFFI,您可以轻松包装枚举并访问其成员。我这里的问题是,我有表示变量名称的字符串,而不是变量本身 因此,cwrapper.c.enum1将不起作用cwr
typedef enum
{
enum1 = value1;
enum2 = value2;
...
} enumSomething;
在Python中,我以字符串形式接收枚举中的变量名:enum1。我想得到价值1
使用CFFI,您可以轻松包装枚举并访问其成员。我这里的问题是,我有表示变量名称的字符串,而不是变量本身
因此,cwrapper.c.enum1将不起作用cwrapper是包装的模块的名称,而c是包装库时ffi.dlopenlibname返回的名称
我可以制作一个字典,将变量名作为字符串映射到实际变量,例如:
enum = { "enum1" : cwrapper.c.enum1, "enum2" : cwrapper.c.enum2, ... }
但在这一点上,我最好将enum重写为Python字典
我知道我也可以使用正则表达式来读取C文件,但我认为还有一种更好的方法来处理它,这是我没有想到的。有什么想法吗?cwraper.c.enum1在Python中通常是无效的语法。您需要使用getattr:
然而,一个更干净的方法是使用typeof获得实际的类型;然后得到它的关联,这是一本字典
>>> 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
cwrapper.c.enum1在Python中通常是无效语法。您需要使用getattr:
然而,一个更干净的方法是使用typeof获得实际的类型;然后得到它的关联,这是一本字典
>>> 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枚举:
Strategy = enum.Enum('Strategy', ffi.typeof('strategy').relements)
list(Strategy)
# [<Strategy.RANDOM: 0>, <Strategy.IMMEDIATE: 1>, <Strategy.SEARCH: 2>]
基于Antti的答案,可以构建一个合适的Python枚举:
Strategy = enum.Enum('Strategy', ffi.typeof('strategy').relements)
list(Strategy)
# [<Strategy.RANDOM: 0>, <Strategy.IMMEDIATE: 1>, <Strategy.SEARCH: 2>]
实际上我想指出的是,它不是有效的语法。但是,我不知道getattr。谢谢,它很管用!为什么使用这种方式比只使用getattr更干净?因为getattr不仅可以检索枚举值,还可以检索包括printf在内的任何内容,或者那些CDEF中包含的任何内容。使用后者,您可以确保您只解析适当的值。我实际上想指出,这不是有效的语法。但是,我不知道getattr。谢谢,它很管用!为什么使用这种方式而不仅仅是getattr会更干净呢?因为getattr不仅可以检索枚举值,还可以检索任何这样的内容,包括printf或那些CDEF中包含的任何内容。使用后者,您可以确保只解析适当的值