2017-02-20 81 views
0

我有这样一个用Cython功能用Cython功能:ctypedef使用默认参数

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抱怨:不能类型 '无效(INT,结构__pyx_opt_args_46_cython_magic_49f265438c694830523a60bef4fe2ee8_foo * __ pyx_optional_args)' 分配给 'foo_type'

从错误mesage,可以注意到,选项(默认)参数被cython封装在一个结构中。

有没有办法在cython中做这样的ctypedef?如果不是这样,我想我应该离开了默认值:-(

回答

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 

从包装函数的速度损失会很小,因此主要成本只是你需要写多一点的代码。

+0

感谢您的回答,这是一个可行的办法。最后,我想出了函数指针不能提供的默认参数,并且这个类型没有考虑默认参数,这实际上是c/C++部分的一个问题。我有一个带有很多参数的函数,其中大部分都有一个默认值,为了方便起见,添加这么多的包装器会很枯燥,因此在c/cython部分中省略默认值并将其留给python部分对我来说会更好毕竟,它是一个python扩展名:-D – oz1