python - 将带有 void * 参数的函数传递给 dict 时,Cython 会引发错误
问题描述
我有一个带void *
参数的函数,我想将它存储在字典中。
我要做的是:
%%cython
cdef void foo(void * bar):
pass
cdef dict foobar = {'foo': foo}
但是这段代码引发了一个错误:有Cannot convert 'void (void *)' to Python object
什么方法可以解决这个问题吗?
解决方案
最简单的解决方案是创建一个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)}
推荐阅读
- javascript - 如何找到使用 Google Chrome 调试器调用 javascript 的位置?
- ios - 从多个视图控制器调用相同 API 的最佳方法是什么
- opengl-es - 需要一个关于鲁棒缓冲区访问何时有效的具体示例
- wso2 - 从 siddhi 上的 Tcp 接收 json 日志
- wso2 - 使用 wso2 6.4.0 dss 从多张单个 Excel 文件中检索数据并插入数据库
- javafx - 动画后无法从节点中删除子节点
- fix-protocol - QuickFIX/N 是否支持包含两个组件的消息,每个组件具有一个组,两个组件都具有相同的名称?
- java - 如何检查当前时间和自定义时间是否在 30 分钟的设备时间段(挂钟时间)内
- r - 在 position_dodge() 之后在 ggplot2 中进行注释?
- powershell - 使用 App Client ID 更新访问令牌