我在 .cpp 文件中有一个 C++ 模板定义为
模板 无效
rank_filter(T* in, T* out, int arr_len, int win_len, int order, Mode mode, T cval, int origin)
其中 Mode
是枚举。
在 this 答案之后,我试图通过 Cython 通过 .pyx 文件将其包装起来:
cimport cython
cimport numpy as np
ctypedef fused numeric_t:
np.float32_t
np.float64_t
np.int32_t
np.int64_t
@cython.boundscheck(False) # Deactivate bounds checking
@cython.wraparound(False) # Deactivate negative indexing.
cdef extern from "_rank_filter_1d.cpp" nogil:
void rank_filter[T](T* in, T* out, int arr_len, int win_len, int order, Mode mode, T cval, int origin)
def rank_filter_1d(numeric_t[:] in_arr, numeric_t[:] out_arr, int win_len, int order, int mode, numeric_t cval, int origin):
rank_filter(&in_arr[0], &out_arr[0], in_arr.shape[0], win_len, order, mode, cval, origin)
return out_arr
不幸的是,在终端中运行
python setup.py build_ext --inplace
会导致错误:
cdef extern from "_rank_filter_1d.cpp" nogil:
void rank_filter[T](T* in, T* out, int arr_len, int win_len, int order, Mode mode, T cval, int origin)
^
------------------------------------------------------------
rank_filter_1d_cython.pyx:13:27: Expected ')', found 'in'
我尝试在void之前添加
cdef
,但效果不佳。还有其他想法吗?
in
是 Python 关键字,因此不能在 Cython 中用作变量名。
您告诉 Cython 的参数名称没有真正的原因必须与真实的 C 参数名称匹配 - 它们只是用于文档。
惯例可能只是将
in
更改为 in_
以保持意图明显。