ctypes обеспечивает что-нибудь для перечислений и флагов?

У меня есть API, который я хотел бы использовать из Python. Тот API содержит флаги и перечисления, реализованные с #define.

// it's just almost C so don't bother adding the typedef and parenthesis diarrhea here.
routine(API_SOMETHING | API_OTHERTHING)
stuff = getflags()
? stuff & API_SOMETHING

action(API_INTERESTING)
mode = getaction()
? mode == INTERESTING

При игнорировании всего остального кроме перечислений и флагов теперь, моя привязка должна перевести это в:

routine(["something", "otherthing"])
stuff = getflags()
if 'something' in stuff

action('interesting')
mode = getaction()
if mode == 'interesting'

ctypes обеспечивает механизмы, чтобы сделать это прямо? Если не затем просто говорят о Вашем 'обычном' инструменте для обработки флагов и перечислений в привязке Python.

5
задан Cheery 23 June 2010 в 10:13
поделиться

2 ответа

Я сам немного разочарован ответом на этот вопрос. Тем более, что все это я нашел из руководства по f*.

http://docs.python.org/library/ctypes.html#calling-functions-with-your-own-custom-data-types

Чтобы завершить свой ответ, я напишу код, который обернет элемент.

from ctypes import CDLL, c_uint, c_char_p

class Flag(object):
    flags = [(0x1, 'fun'), (0x2, 'toy')]
    @classmethod
    def from_param(cls, data):
        return c_uint(encode_flags(self.flags, data))

libc = CDLL('libc.so.6')
printf = libc.printf
printf.argtypes = [c_char_p, Flag]

printf("hello %d\n", ["fun", "toy"])

encode_flags преобразует этот замечательный список в целое число.

4
ответ дан 14 December 2019 в 08:42
поделиться

Почему бы вам не использовать c_uint для параметра enum, а затем использовать такое отображение (перечисления обычно представляют собой беззнаковые целые значения):

в C:

typedef enum {
  MY_VAR      = 1,
  MY_OTHERVAR = 2
} my_enum_t;

и в Python:

class MyEnum():
    __slots__ = ('MY_VAR', 'MY_OTHERVAR')

    MY_VAR = 1
    MY_OTHERVAR = 2


myfunc.argtypes = [c_uint, ...]

Затем вы можете передать в функцию поля MyEnum.

Если вам нужно строковое представление для перечисляемых значений, вы можете использовать словарь в классе MyEnum.

3
ответ дан 14 December 2019 в 08:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: