Доступ к перечислениям cffi
Предположим, я определил перечисление в cffi:
from cffi import FFI
ffi = FFI()
ffi.cdef('typedef enum {RANDOM, IMMEDIATE, SEARCH} strategy;')
Теперь это можно легко получить при звонке cdef
снова. Но как мне тогда получить доступ к этому перечислению в python, не объявляя его повторно? Не могу найти никаких упоминаний в документах.
2 ответа
Использование 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
Если вы обернули библиотеку, вы можете использовать то же самое выше, как показано ниже:
import _wrappedlib
print _wrappedlib.lib.RANDOM
После ответа @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']
, но это не работает для #define
s, поэтому описанный выше способ лучше.