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_funcNULL を受け入れます。インタプリタから呼び出すと:ab

my_func(None, None)

それは例外をスローします:

TypeError: expected string or Unicode object, NoneType found

この関数に を受け入れてNoneに渡すNULLにはどうすればよいc_my_funcですか? Noneを手動でチェックしてから NULL を渡したくありません。また、の cdef でデフォルト パラメータを使用しようとしましたが、c_my_func機能しません。

4

3 に答える 3

11

答えはCython FAQにあります。

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 に答える