Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中使用C变量的名称(Python字符串)获取枚举中的C变量值_Python_C_Variables_Enums_Python Cffi - Fatal编程技术网

在Python中使用C变量的名称(Python字符串)获取枚举中的C变量值

在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

基本上,我正在使用非常棒的CFFI用Python包装一个C API

我在该C API中有一个枚举:

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中包含的任何内容。使用后者,您可以确保只解析适当的值