2011-04-15 73 views
4

假設我定義爲這樣的結構:如何初始化從字典一個struct在用Cython

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

我需要能夠轉換dictmy_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) 

我不知道字段名稱的原因是因爲代碼是自動生成的,我不想做一個醜陋的黑客來處理這種情況。

如何使用Cython從Python字典中初始化結構?

+0

它是否必須是名稱?你可以按順序做,而是使用聯合(具有已知長度的數組)? – 2011-04-15 06:59:09

回答

6

您必須手動設置結構的每個元素。沒有捷徑。 如果您的代碼是自動生成的,那麼應該很容易自動生成一個內聯函數, 執行從PyDict到每個結構的轉換。