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

Tar*_*ula 1 python cython

我有一个用Cython包装的函数:

cdef extern  from "myheader.h":
   int c_my_func (const_char *a, const_char* b)
Run Code Online (Sandbox Code Playgroud)

并且一个暴露给Python的函数:

def my_func(a, b):
    c_my_func(a, b)
Run Code Online (Sandbox Code Playgroud)

该函数c_my_func接受参数a和NULL b.当我从口译员那里打电话时:

my_func(None, None)
Run Code Online (Sandbox Code Playgroud)

它抛出异常:

TypeError: expected string or Unicode object, NoneType found
Run Code Online (Sandbox Code Playgroud)

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

hal*_*lex 7

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

None与任何C类型都不兼容.为了适应这种情况,默认行为是具有cdefed参数的函数也接受None.

  1. 如果要考虑None无效输入,则需要编写检查它的代码,并引发适当的异常.

解决方案是在None编写时手动检查并传递NULL.

  • 对于应该为你做这些事情的语言来说,这是一个真正的失败。谢谢你的回答。 (2认同)