在scipy.weave.inline中输入long python int to long

时间:2015-04-20 18:32:43

标签: python numpy scipy type-conversion

给出以下代码:

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

生成的C代码在内部将long int转换为int并愉快地返回1.尝试指定input_val=np.int64(-9....)input_val=long(-9...)会产生编译错误,因为numpy int类型根本没有转换并得到被视为PyObject。我看到type_converters提到了一个inline关键字参数,但遗憾的是documentation没有详细说明其处理方式。任何想法,如何强制类型转换为long而不是int?

1 个答案:

答案 0 :(得分: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