1

基本上,我在 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 文件,但我认为还有一种更好的方法来处理它,这是我没有想到的。任何想法?

4

2 回答 2

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
于 2016-05-12T15:26:06.043 回答
2

基于 Antti 的回答,Enum可以构建一个合适的 Python:

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

list(Strategy)
# [<Strategy.RANDOM: 0>, <Strategy.IMMEDIATE: 1>, <Strategy.SEARCH: 2>]
于 2016-05-12T15:45:56.713 回答