在 scipy.weave.inline 中将 python int 类型转换为 long
Type casting python int to long in 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 代码在内部将 long int 转换为 int 并愉快地 returns 1. 尝试指定 input_val=np.int64(-9....)
或 input_val=long(-9...)
会出现编译错误,因为 numpy int 类型是根本没有转换并被视为 PyObject。我看到有人提到 inline
的 type_converters
关键字参数,但不幸的是 documentation 没有进一步详细说明其处理方式。任何想法,如何强制类型转换为 long 而不是 int?
这终于帮上忙了。我的编译器不喜欢内置的 long_converter。因此,这将覆盖 long 的某些类型设置并在默认转换器列表之前添加:
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
给定以下代码:
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 并愉快地 returns 1. 尝试指定 input_val=np.int64(-9....)
或 input_val=long(-9...)
会出现编译错误,因为 numpy int 类型是根本没有转换并被视为 PyObject。我看到有人提到 inline
的 type_converters
关键字参数,但不幸的是 documentation 没有进一步详细说明其处理方式。任何想法,如何强制类型转换为 long 而不是 int?
这终于帮上忙了。我的编译器不喜欢内置的 long_converter。因此,这将覆盖 long 的某些类型设置并在默认转换器列表之前添加:
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