Как инициализировать структуру из dict в Cython - PullRequest
6 голосов
/ 15 апреля 2011

Предполагая, что у меня есть структура, определенная следующим образом:

cdef extern from "blah.h":
    struct my_struct:
        int a
        int b

Мне нужно иметь возможность преобразовать dict в my_struct без каких-либо знаний о полях my_struct. Другими словами, мне нужно следующее преобразование:

def do_something(dict_arg):
    cdef my_struct s = dict_arg
    do_somthing_with_s(s)

Проблема в том, что Cython не сделает этого: http://docs.cython.org/src/userguide/language_basics.html#automatic-type-conversions

Конечно, если бы я знал имя поля my_struct, я мог бы сделать это:

def do_something(dict_arg):
    cdef my_struct s = my_struct(a=dict_arg['a'], b=dict_arg['b'])
    do_somthing_with_s(s)

При этом происходит сбой компилятора Cython:

def do_something(dict_arg):
    cdef my_struct s = my_struct(**dict_arg)
    do_somthing_with_s(s)

Причина, по которой я не знаю имя поля, заключается в том, что код генерируется автоматически, и я не хочу делать некрасивый хак для обработки этого случая.

Как инициализировать структуру из Python dict с Cython?

1 Ответ

7 голосов
/ 16 апреля 2011

Вы должны установить каждый элемент структуры вручную.Там нет ярлыков.Если ваш код сгенерирован автоматически, его легко сгенерировать также встроенной функцией, которая выполняет преобразование из PyDict в каждую из ваших структур.

...