ctypedef一个带有默认参数的cython函数

时间:2017-02-20 16:25:12

标签: cython

我有一个像以下一样的cython函数:

cdef void foo(int a, int b=1, int c=2):
    pass

和一个getter函数返回其地址:

def get_foo():
    return <size_t>foo

所以我可以在某处获得函数foo的地址并将其转换回cython中的实际函数(例如:可以在python中使用的回调)。

问题是如何编写这样的类型?

我试过了:

cdef void foo(int a, int b=1, int c=2):
    pass
ctypedef void (*foo_type)(int a, int b, int c)
cdef foo_type f = foo

这将无法编译,cython抱怨:无法将类型'void(int,struct __pyx_opt_args_46_cython_magic_49f265438c694830523a60bef4fe2ee8_foo * __ pyx_optional_args)'分配给'foo_type'

从错误消息中,可以注意到,选项(默认)参数由cython包装在结构中。

有没有办法在cython中做这样的ctypedef?如果没有,我想我最好省略默认值。: - (

1 个答案:

答案 0 :(得分:0)

您可以创建没有默认值的小包装:

cdef void foo_abc(int a, int b, int c):
    foo(a,b,c)

# if you need it
cdef void foo_ab(int a, int b):
    foo(a,b)
# etc

这些可以转换为函数指针:

cdef foo_type f = foo_abc

包装器功能的速度损失很小,因此主要成本就是你需要编写更多的代码。