Lambda Cython中的动态排序比较器

Lambda Cython中的动态排序比较器,lambda,cython,Lambda,Cython,我需要使用一个参数生成一个排序比较器,这个参数只有在Cython运行时才有的 下面是一个简单的例子: from libcpp.algorithm cimport sort import random cpdef test_sort(): cdef int *a = [1,2,3,4] cdef int z = random.randrange(5) sort(&a[0], &a[3], lambda x,y: abs(x-z) < abs(y-z)

我需要使用一个参数生成一个排序比较器,这个参数只有在Cython运行时才有的

下面是一个简单的例子:

from libcpp.algorithm cimport sort
import random

cpdef test_sort():
    cdef int *a = [1,2,3,4]
    cdef int z = random.randrange(5)
    sort(&a[0], &a[3], lambda x,y: abs(x-z) < abs(y-z)) # doesn't compile
cmp.cpp:

#include <stdlib.h>

std::function<bool(int, int)> make_cmp(int z) {
    return [&z](int x, int y) { return abs(x-z) < abs(y-z); };
run.py:

from distutils.core import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("*.pyx", language="c++")
)
from test_sort import test_sort

test_sort()
$python setup.py build\u ext--in place

给出以下错误(以及其他输出):

test_sort.cpp:在函数“PyObject”中* __pyx\u f\u 9test\u sort\u test\u sort(int)':test\u sort.cpp:1069:33:错误:无法将'std::function'转换为'PyObject*{aka' _赋值中的object*}';如果(不太可能(!\uuuuPyx\uT\u2))\uuuPyx\uErr(0,13,\uuuPyx\uL1\u错误)

测试排序。cpp:1071:78:此处需要 /usr/include/c++/6/bits/predefined_ops.h:147:11:错误:表达式 不能用作函数{return bool(_M_comp(*uu it,u val))}


<代码>错误:表达式不能用作函数,如果我试图将Python lambda转换成排序,那么我就得到了。

它很有意思,但这可能是你看到的,但主要是把Python对象传递给C++函数,也许这里可以避免?我希望有一种方法来传递C++函数来排序。如果你不需要在代码> z < /Cube上关闭它,那么你可以用<代码> CDEF 函数(它可以作为函数指针传递)。有两种方法可以传递可调用的Python对象(C++方式链接,或者<代码> cType < /Calp>回调),但两者都不是非常简单。到目前为止,最简单的方法是在C++中编写函数(但是如果您需要在函数中访问Python特性,那就更难了)。DavidW,我尝试了最后一个建议,但无法使它工作。请看我的UpDeEi现在不能测试它,但是类似的东西应该在C++中运行。代码:TyPulfsd::函数BiIFunc< /Cube >(即只给它一个简单的名字),然后在Cython Do <代码> cdef cppclass BIIFunc:PASS< /Calp>和<代码> Biununc MaMaMCMP(INTZ)。Cython不需要知道 BiIFunc实际上是一个标准函数,所以你可以保留所有的C++模板和Cython中的讨厌模板。
from test_sort import test_sort

test_sort()