我有一个像以下一样的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?如果没有,我想我最好省略默认值。: - (
答案 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
包装器功能的速度损失很小,因此主要成本就是你需要编写更多的代码。