【发布时间】:2019-05-27 03:15:58
【问题描述】:
我正在尝试使用 cython 包装现有的 C 库。该库使用我想重定向的回调来执行 python 代码。 假设标题中的相应行如下:
typedef RETCODE (*FUNC_EVAL)(int a, int b, void* func_data);
返回代码用于指示错误。 API 到 创建对应的C结构体如下:
RETCODE func_create(Func** fstar,
FUNC_EVAL func_eval,
void* func_data);
我添加了一个 cython 头文件/实现文件。标题 包含 typedef:
ctypedef RETCODE (*FUNC_EVAL)(int a,
int b,
void* func_data)
实现包含一个包装函数:
cdef RETCODE func_eval(int a,
int b,
void* func_data):
(<object> func_data).func_eval(a, b)
return OKAY;
我可以将此函数传递给func_create cython 包装器就好了。
但是,我想确保 python 代码中的异常是
通过返回 ERROR 值向 C 库报告为
返回码。所以我添加了以下内容:
cdef RETCODE func_eval(int a,
int b,
void* func_data) except ERROR:
(<object> func_data).func_eval(a, b)
return OKAY;
但是,现在 cython 终止并显示以下错误消息:
Cannot assign type 'RETCODE (*)(int, int, void *) except ERROR' to 'FUNC_EVAL'
我是否使用了except ... 语句错误?
【问题讨论】:
-
您的错误消息将
int*显示为参数,而您的代码没有。我不知道这是从哪里来的,是问题的一部分,还是只是复制错误……(我怀疑这不是问题) -
您当然是对的,但这是复制错误。生成的 C 函数具有相同的签名。
标签: python cython function-pointers