2015-04-20 33 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