2015-04-20 69 views
0

鑑於以下代碼:型鑄造蟒INT長在scipy.weave.inline

from scipy.weave import inline 
code = "return_val = input_val + 1;" 
inline(code, ["input_val"], local_dict=dict(input_val=-9223372036854775808)) 

將所得的C代碼內部轉換長整型到int和愉快地返回1試圖指定input_val=np.int64(-9....)input_val=long(-9...)給出一個編譯錯誤,因爲numpy int類型根本不被轉換,並被視爲PyObject。我看到一些關於inlinetype_converters關鍵字參數的提及,但不幸的是documentation未詳細說明它的處理。任何想法,如何強制類型轉換爲long而不是int?

回答

0

這終於有所幫助。我的編譯器不喜歡內置的long_converter。因此,這會覆蓋一些類型設置很長的時間並且會預設默認轉換器列表:

from scipy.weave import inline, converters, c_spec 

class long_converter(c_spec.scalar_converter): 
    def init_info(self): 
     c_spec.scalar_converter.init_info(self) 
     # !! long to int conversion isn't safe! 
     self.type_name = 'long' 
     self.check_func = 'PyLong_Check' 
     self.c_type = 'long' 
     self.return_type = 'long' 
     self.to_c_return = "(long) PyLong_AsLongLong(py_obj)" 
     self.matching_types = [types.LongType] 

type_conversion = [long_converter()] + converters.default 

inline("return_val = input_val + 1;", ["input_val"], 
     local_dict=dict(input_val=long(-9223372036854775808)), 
     type_converters=type_conversion) 

>>> -9223372036854775807