Доступ к перечислениям 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'], но это не работает для #defines, поэтому описанный выше способ лучше.

Другие вопросы по тегам