访问 cffi 枚举

Posted

技术标签:

【中文标题】访问 cffi 枚举【英文标题】:Accessing cffi enums 【发布时间】:2015-01-29 04:03:22 【问题描述】:

假设我在 cffi 下定义了一个枚举:

from cffi import FFI
ffi = FFI()
ffi.cdef('typedef enum RANDOM, IMMEDIATE, SEARCH strategy;')

现在再次调用cdef 时可以轻松访问它。但是我如何在不重新声明的情况下在 python 中访问这个枚举呢?在文档中找不到任何提及。

【问题讨论】:

【参考方案1】:

按照@falsetru 的回答,ffi.dlopen('c') 不再适用于 Windows 7 和 Python 3.7,但我今天发现我们可以使用任何库而不是 'c',它仍然有效。在https://bugs.python.org/issue23606 推荐的是使用ucrtbase.dll,所以我们可以这样做:

>>> ffi.cdef('#define MAX_PATH 260')
>>> ffi.dlopen('kernel32.dll').MAX_PATH
260

另外一个比较复杂的枚举方式是使用self.typeof('strategy').relements['RANDOM'],但是这对#defines不起作用,所以上面的方式更好。

【讨论】:

【参考方案2】:

如果你已经包装了一个库,你可以使用上面相同的方法:

import _wrappedlib

print _wrappedlib.lib.RANDOM

【讨论】:

【参考方案3】:

使用ffi.dlopen,并通过使用ffi.dlopen的返回值限定来访问枚举值:

>>> from cffi import FFI
>>> ffi = FFI()
>>> ffi.cdef('typedef enum RANDOM, IMMEDIATE, SEARCH strategy;')
>>> c = ffi.dlopen('c')
>>> c.RANDOM
0
>>> c.IMMEDIATE
1
>>> c.SEARCH
2

【讨论】:

以上是关于访问 cffi 枚举的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C++ 允许通过指针访问枚举?

使用标识符前缀访问枚举

为什么访问枚举定义中不存在的枚举成员(通过转换整数)不会出错

您可以访问特定枚举值的详细描述吗

如何在 Angular 5 视图中访问枚举值

在遍历值的同时访问枚举自定义属性