簡體   English   中英

在scipy.weave.inline中將強制類型轉換為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並愉快地返回1。嘗試指定input_val=np.int64(-9....)input_val=long(-9...)會產生編譯錯誤,因為numpy int類型根本不會轉換,會被視為PyObject。 我看到一些提到inlinetype_converters關鍵字參數的信息,但是不幸的是文檔沒有詳細說明其處理方式。 有什么想法,如何強制類型轉換為long而不是int?

這終於有所幫助。 我的編譯器不喜歡內置的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM