3

我有一个用 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接受 NULL 作为参数ab。当我从口译员那里调用它时:

my_func(None, None)

它抛出异常:

TypeError: expected string or Unicode object, NoneType found

如何让这个函数接受None并传递NULLc_my_func? 我不想手动检查None然后传递NULL。我还尝试在 的 cdef 上使用默认参数,c_my_func但它不起作用。

4

3 回答 3

11

您可以在Cython 常见问题解答中找到答案。

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

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

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

于 2012-10-04T19:16:06.613 回答
1

只需为您的 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)
于 2012-10-04T19:23:24.923 回答
0

not None像这样使用怎么样

def widen_shrubbery(Shrubbery sh not None, extra_width):
    sh.width = sh.width + extra_width

暴露在这里

于 2015-02-03T18:07:20.037 回答