首页 > 解决方案 > 如何将python函数传递给接受函数作为参数的cython函数?

问题描述

我正在根据一些评论重新表述我最初的问题(我认识到发布时问题并不像它本来可以的那样精确),希望能找到答案。

我有以下cdef函数,它在各种其他参数中接受定义为ftype的f()函数,如下所示,

%%cython
ctypedef double (*ftype) (double)

cdef cy_myfunc(int a,..., double x, ftype f):
  ...
  cdef double result
  result = f(x)
  return result

我定义了一个这样的python函数:

def py_myfunc(a,..., x, f):
    return cy_myfunc(a,...,x,f)

我希望能够调用py_myfunc()并将用户 python 函数作为 f 参数传递(python 函数的唯一先决条件是应该接受一个双精度并返回双精度)。这可能吗?如果是这样,如何在 cython 中实现这一点?f()函数在循环中重复使用,所以我希望它尽可能快。

标签: pythoncython

解决方案


我有一段时间没有修补 cython 了。但从概念上讲,您的方法是有缺陷的。通过对只能是简单指针值的 C 类型函数进行硬编码,您限制了自己太多。python函数永远不可能那样。它总是由 Py_Object 表示,就像任何可调用的一样。

只是不要将f 声明为 ftype,而是将其声明为普通的 python 对象(或根本没有类型),然后调用它。无论如何,您需要传递的 Py_Object* 的完整语义,因为 cython 无法保证传递的函数不是完全不同的可调用函数。


推荐阅读