我有一个用Cython包装的函数:
cdef extern from "myheader.h":
int c_my_func (const_char *a, const_char* b)
一个暴露给Python的函数:
def my_func(a, b):
c_my_func(a, b)
函数c_my_func
对参数a
和b
接受NULL。当我从口译员那里打电话时:
my_func(None, None)
它抛出异常:
TypeError: expected string or Unicode object, NoneType found
如何使此功能接受None
并将NULL
传递给c_my_func
?我不想手动检查None
然后传递NULL。我也尝试在c_my_func
的cdef上使用默认参数,但它不起作用。
答案 0 :(得分:6)
您可以在Cython FAQ中找到答案。
None
与任何C类型都不兼容。为了适应这一点, 默认行为也适用于带有cdefed参数的函数 接受None
。
- 如果您想考虑
醇>None
无效输入,那么您需要编写 用于检查它的代码,并引发了适当的异常。
解决方案是在编写时手动检查None
并传递NULL。
答案 1 :(得分:0)
只需为c函数调用构建一个包装函数。它可以使用任意数量的参数。
def c_func_call(c_func, *args):
c_func(*[x if x is not None else NULL for x in args])
示例中的用法:
def my_func(a, b):
c_func_call(c_my_func, a, b)
答案 2 :(得分:0)
如何使用not None
这样
def widen_shrubbery(Shrubbery sh not None, extra_width):
sh.width = sh.width + extra_width
暴露here。