在Cython中将NULL传递给包装的C函数

时间:2012-10-04 18:59:15

标签: python cython

我有一个用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对参数ab接受NULL。当我从口译员那里打电话时:

my_func(None, None)

它抛出异常:

TypeError: expected string or Unicode object, NoneType found

如何使此功能接受None并将NULL传递给c_my_func?我不想手动检查None然后传递NULL。我也尝试在c_my_func的cdef上使用默认参数,但它不起作用。

3 个答案:

答案 0 :(得分:6)

您可以在Cython FAQ中找到答案。

  

None与任何C类型都不兼容。为了适应这一点,   默认行为也适用于带有cdefed参数的函数   接受None

     
      
  1. 如果您想考虑None无效输入,那么您需要编写   用于检查它的代码,并引发了适当的异常。
  2.   

解决方案是在编写时手动检查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