首页 > 解决方案 > 将带有 void * 参数的函数传递给 dict 时,Cython 会引发错误

问题描述

我有一个带void *参数的函数,我想将它存储在字典中。

我要做的是:

%%cython

cdef void foo(void * bar):
    pass

cdef dict foobar = {'foo': foo}

但是这段代码引发了一个错误:有Cannot convert 'void (void *)' to Python object什么方法可以解决这个问题吗?

标签: pythoncython

解决方案


最简单的解决方案是创建一个cdef class可以包装此函数的函数。由于cdef class是 Python 对象,因此它可以像任何其他 Python 对象一样存储在字典中。

ctypedef void (*void_func_ptr)(void*)

cdef class VoidFuncWrapper:
    cdef void_func_ptr func
    def __cinit__(self):
       self.func = NULL

    @staticmethod
    cdef VoidFuncWrapper make_from_ptr(void_func_ptr f):
        cdef VoidFuncWrapper out = VoidFuncWrapper()
        out.func = f
        return out

然后你可以简单地做:

cdef dict foobar = {'foo': VoidFuncWrapper.make_from_ptr(foo)}

推荐阅读