はここに私のC APIの関数の例は以下のとおりです。SWIGを使用して、C関数の戻り値の型に基づいて特定の例外を返すにはどうすればよいですか?
int do_something(struct object *with_this)
struct object *get_something(struct object *from_this)
do_something
が成功したか-1
ため0
を返し、失敗のerrno
を設定します。 get_something
は成功した場合には有効なポインタを返し、失敗の場合にはerrno
を設定します。
私はSWIG 2.0を使用してPythonバインディングを生成しています。 do_something
バインディングについては、失敗した場合はerrno
に基づいて例外を返したいと思います。成功した場合は、Python None
オブジェクトを返します。 get_something
バインディングについては、それが失敗した場合はerrno
に基づく例外を返し、成功した場合は不透明オブジェクトを返したいと思います。
質問はどのように私はこの魔法のすべてを私にするのですか?
現在、私はSWIG 2.0を使用しています。
私は%exception
を使用することができ、シンボルごとに異なる例外を定義できますが、戻り値の型に基づいています。私は多くのAPI関数を持っているので、それらをリストアップしたくありません。だから私は、各シンボルのためにこれを行うことができます。
%exception do_something {
$action
if (result < 0) {
return PyErr_SetFromErrno(PyExc_RuntimeError);
}
}
%exception get_something {
$action
if (result == NULL) {
return PyErr_SetFromErrno(PyExc_RuntimeError);
}
}
(あなたが%typemap
で行うことができますように)私はこのような何かを行うことができれば、それは多くの方のようになります。
%exception int {
$action
if (result < 0) {
return PyErr_SetFromErrno(PyExc_RuntimeError);
}
}
%exception struct object * {
$action
if (result == NULL) {
return PyErr_SetFromErrno(PyExc_RuntimeError);
}
}
は、私のような何かを行うことができますこの?このようなものがあれば、それは例外を処理するでしょう。そして、私はget_something
バインディングが完璧だと信じています。
マイdo_something
まだ私は%typemap
を使用する場合には、Pythonなしオブジェクトを返すために取得するには、このようなものが必要でしょうバインディング:
%typemap(out) int {
$result = Py_BuildValue("");
}
は、私が存在を探していますか私はこのすべてについてつもり魔法をい違う?これを行うより良い方法はありますか?
struct object { int bar; };
static int do_something(struct object *with_this) {
errno = EACCES;
return -1;
}
static struct object *get_something(struct object *from_this) {
errno = EAGAIN;
return NULL;
}
私は%typemap(out)
がする場所であることをかなり確信している:私はあなたの機能を取り、実際に問題を説明するのに十分な実際のコードが含まれ、次のTEST.Hファイルを作成し、この質問に答えるために
あなたのユースケースのための '%exception'は赤い鳴き声であり、あなたは'%typemap(out) 'または'%pythoncode'のいずれかの中ですべてそれをしたいと思っています。誰も私にそれを打つことができなければ、私は試してみて、あなたのために適切な答えを書くことを忘れないでください。 – Flexo
フレキソありがとうございます。 'typemap(out)'を試してみましたが、問題は型の処理を再実装する必要があることです。これは 'get_something'の場合にはやりたくないものです。 'get_something'の場合、例外を処理したいが、そのまま型を処理したいだけです。 –
私はあなたが心配していることを見て、私はそれについて考えて、いくつかの解決策を示します。 – Flexo