使用 Python 中的名称(Python 字符串)在枚举中获取 C 变量值
Fetching a C variable value in an enum using its name (a Python string) in Python
基本上,我将 C API 包装在 Python 中(使用 CFFI(这很棒))。
我在 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 文件,但我认为还有更好的方法来处理它,我还没有想到。有什么想法吗?
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>]
基本上,我将 C API 包装在 Python 中(使用 CFFI(这很棒))。
我在 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 文件,但我认为还有更好的方法来处理它,我还没有想到。有什么想法吗?
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>]